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);
while( p ) {
lock_item *lp = p; p = (lock_item*)p->next;
if( lp->info != info ) continue;
- lock_table.remove_pointer(p); lock_free.append(p);
+ lock_table.remove_pointer(lp); lock_free.append(lp);
}
lock_table.unlock();
}
while( p ) {
lock_item *lp = p; p = (lock_item*)p->next;
if( lp->tid != tid ) continue;
- lock_table.remove_pointer(p); lock_free.append(p);
+ lock_table.remove_pointer(lp); lock_free.append(lp);
}
lock_table.unlock();
}
TheLock TheLocker::the_lock;
TheList TheList::the_list;
-TheChk TheChk::the_chk;
int lock_item::table_id = 0;
{
TheLocker the_locker;
int i = the_list.size();
- while( --i >= 0 && the_list[i]->tid != tid );
+ while( --i >= 0 && !(the_list[i]->tid == tid && the_list[i]->owner == owner) );
if( i >= 0 ) {
printf("dbg_add, dup %016lx %s %s\n",
(unsigned long)tid, nm, the_list[i]->name);
}
+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);
+}
+