32 #ifdef PROFILE_LOCKING
43 typedef struct LockRecord_ {
58 pthread_mutex_t lock_records_mutex;
60 static uint32_t LockRecordHash(
HashListTable *ht,
void *buf, uint16_t buflen)
62 LockRecord *fn = (LockRecord *)buf;
63 uint32_t hash = strlen(fn->file) + fn->line;
66 for (u = 0; u < strlen(fn->file); u++) {
73 static char LockRecordCompare(
void *buf1, uint16_t len1,
void *buf2, uint16_t len2)
75 LockRecord *fn1 = (LockRecord *)buf1;
76 LockRecord *fn2 = (LockRecord *)buf2;
78 if (fn1->line != fn2->line)
81 if (fn1->file == fn2->file)
87 static void LockRecordFree(
void *data)
89 LockRecord *fn = (LockRecord *)data;
98 pthread_mutex_init(&lock_records_mutex, NULL);
99 pthread_mutex_lock(&lock_records_mutex);
101 lock_records =
HashListTableInit(512, LockRecordHash, LockRecordCompare, LockRecordFree);
102 BUG_ON(lock_records == NULL);
104 pthread_mutex_unlock(&lock_records_mutex);
111 LockRecord fn = { NULL, NULL, 0,0,0,0,0,0}, *ptr = &fn;
116 if (lookup_fn == NULL) {
117 LockRecord *
new =
SCMalloc(
sizeof(LockRecord));
125 new->ticks_max = l->
ticks;
126 new->ticks_total = l->
ticks;
131 lookup_fn->ticks_total += l->
ticks;
132 if (l->
ticks > lookup_fn->ticks_max)
133 lookup_fn->ticks_max = l->
ticks;
134 lookup_fn->ticks_cnt++;
135 lookup_fn->cont += l->
cont;
150 pthread_mutex_lock(&lock_records_mutex);
151 LockRecordAdd(&
locks[i]);
152 pthread_mutex_unlock(&lock_records_mutex);
156 static void SCProfilingListLocks(
void)
172 fprintf(fp,
"\n\nLock Cnt Avg ticks Max ticks Total ticks Cont Func\n");
173 fprintf(fp,
"------------------ ---------- --------- ------------ ------------ ------- ---------\n");
203 snprintf(
str,
sizeof(
str),
"(%s) %s:%d",
lock,r->file, r->line);
205 fprintf(fp,
"%-50s %-10u %-9"PRIu64
" %-12"PRIu64
" %-12"PRIu64
" %-7u %-s\n",
206 str, r->ticks_cnt, (uint64_t)((uint64_t)r->ticks_total/(uint64_t)r->ticks_cnt), r->ticks_max, r->ticks_total, r->cont, r->func);
208 total += r->ticks_total;
215 fprintf(fp,
"\nOverall: locks %"PRIu64
", average cost %"PRIu64
", contentions %"PRIu32
", total ticks %"PRIu64
"\n",
216 cnt, (uint64_t)((uint64_t)total/(uint64_t)cnt), cont, total);
226 pthread_mutex_lock(&lock_records_mutex);
228 SCProfilingListLocks();
230 if (lock_records != NULL) {
234 pthread_mutex_unlock(&lock_records_mutex);
236 pthread_mutex_destroy(&lock_records_mutex);