X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;ds=sidebyside;f=cinelerra-5.1%2Fguicast%2Fbctrace.C;h=c50fff5f45acd2ce4681f222374fe77ebac9c753;hb=3f6a262cfe390b3f8b275297d64565a5b6272969;hp=47638fe9a6955f21b473016aa958b1035959bd13;hpb=ddabb22a495f457ece1d845fe2c32ddf2fc27b58;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bctrace.C b/cinelerra-5.1/guicast/bctrace.C index 47638fe9..c50fff5f 100644 --- a/cinelerra-5.1/guicast/bctrace.C +++ b/cinelerra-5.1/guicast/bctrace.C @@ -114,12 +114,12 @@ int BC_Trace::set_lock(const char *title, const char *loc, trace_info *info) last_lock_title = title; last_lock_location = loc; lock_item *it; - if( lock_table.size >= TOTAL_LOCKS ) { + if( (it=(lock_item*)lock_free.first) != 0 ) + lock_free.remove_pointer(it); + else if( lock_table.size >= TOTAL_LOCKS ) { it = (lock_item*)lock_table.first; lock_table.remove_pointer(it); } - else if( (it=(lock_item*)lock_free.first) != 0 ) - lock_free.remove_pointer(it); else it = new lock_item(); it->set(info, title, loc); @@ -399,3 +399,49 @@ void BC_Trace::dump_threads(FILE *fp) } +void BC_Trace::dump_shm_stat(const char *fn, FILE *fp) +{ + char path[BCTEXTLEN]; + sprintf(path, "/proc/sys/kernel/%s",fn); + FILE *sfp = fopen(path,"r"); + if( !sfp ) return; + uint64_t v = 0; + fscanf(sfp, "%ju", &v); + fclose(sfp); + fprintf(fp, "%s = %ju\n", fn, v); +} + +void BC_Trace::dump_shm_stats(FILE *fp) +{ + dump_shm_stat("shmall", fp); + dump_shm_stat("shmmax", fp); + dump_shm_stat("shmmni", fp); + FILE *sfp = fopen("/proc/sysvipc/shm","r"); + if( !sfp ) return; + char line[BCTEXTLEN]; + int pid = getpid(); + if( !fgets(line,sizeof(line), sfp) ) return; + int64_t used = 0, other = 0; + int n_used = 0, n_other = 0; + while( fgets(line,sizeof(line), sfp) ) { + int key, shmid, perms, cpid, lpid, uid, gid, cuid, cgid; + int64_t size, nattch, atime, dtime, ctime, rss, swap; + if( sscanf(line, + "%d %d %o %ju %u %u %ju %u %u %u %u %ju %ju %ju %ju %ju", + &key, &shmid, &perms, &size, &cpid, &lpid, &nattch, + &uid, &gid, &cuid, &cgid, &atime, &dtime, &ctime, + &rss, &swap) != 16 ) break; + if( cpid == pid ) { + used += size; + ++n_used; + } + else { + other += size; + ++n_other; + } + } + fclose(sfp); + fprintf(fp, "shmused = %jd (%d items)\n", used, n_used); + fprintf(fp, "shmother = %jd (%d items)\n", other, n_other); +} +