Lines Matching refs:lk
205 static void del_LockN ( Lock* lk ) in del_LockN() argument
207 tl_assert(HG_(is_sane_LockN)(lk)); in del_LockN()
208 tl_assert(lk->hbso); in del_LockN()
209 libhb_so_dealloc(lk->hbso); in del_LockN()
210 if (lk->heldBy) in del_LockN()
211 VG_(deleteBag)( lk->heldBy ); in del_LockN()
212 VG_(memset)(lk, 0xAA, sizeof(*lk)); in del_LockN()
213 HG_(free)(lk); in del_LockN()
219 static void lockN_acquire_writer ( Lock* lk, Thread* thr ) in lockN_acquire_writer() argument
221 tl_assert(HG_(is_sane_LockN)(lk)); in lockN_acquire_writer()
229 if (lk->acquired_at == NULL) { in lockN_acquire_writer()
231 tl_assert(lk->heldBy == NULL); in lockN_acquire_writer()
233 lk->acquired_at in lockN_acquire_writer()
236 tl_assert(lk->heldBy != NULL); in lockN_acquire_writer()
240 switch (lk->kind) { in lockN_acquire_writer()
243 tl_assert(lk->heldBy == NULL); /* can't w-lock recursively */ in lockN_acquire_writer()
244 tl_assert(!lk->heldW); in lockN_acquire_writer()
245 lk->heldW = True; in lockN_acquire_writer()
246 lk->heldBy = VG_(newBag)( HG_(zalloc), "hg.lNaw.1", HG_(free) ); in lockN_acquire_writer()
247 VG_(addToBag)( lk->heldBy, (Word)thr ); in lockN_acquire_writer()
250 if (lk->heldBy == NULL) in lockN_acquire_writer()
253 tl_assert(lk->heldW); in lockN_acquire_writer()
255 tl_assert(VG_(sizeUniqueBag(lk->heldBy)) == 1); in lockN_acquire_writer()
257 tl_assert(VG_(elemBag)(lk->heldBy, (Word)thr) in lockN_acquire_writer()
258 == VG_(sizeTotalBag)(lk->heldBy)); in lockN_acquire_writer()
259 VG_(addToBag)(lk->heldBy, (Word)thr); in lockN_acquire_writer()
262 tl_assert(lk->heldBy == NULL && !lk->heldW); /* must be unheld */ in lockN_acquire_writer()
267 tl_assert(HG_(is_sane_LockN)(lk)); in lockN_acquire_writer()
270 static void lockN_acquire_reader ( Lock* lk, Thread* thr ) in lockN_acquire_reader() argument
272 tl_assert(HG_(is_sane_LockN)(lk)); in lockN_acquire_reader()
275 tl_assert(lk->kind == LK_rdwr); in lockN_acquire_reader()
277 tl_assert(lk->heldBy == NULL in lockN_acquire_reader()
278 || (lk->heldBy != NULL && !lk->heldW)); in lockN_acquire_reader()
285 if (lk->acquired_at == NULL) { in lockN_acquire_reader()
287 tl_assert(lk->heldBy == NULL); in lockN_acquire_reader()
289 lk->acquired_at in lockN_acquire_reader()
292 tl_assert(lk->heldBy != NULL); in lockN_acquire_reader()
296 if (lk->heldBy) { in lockN_acquire_reader()
297 VG_(addToBag)(lk->heldBy, (Word)thr); in lockN_acquire_reader()
299 lk->heldW = False; in lockN_acquire_reader()
300 lk->heldBy = VG_(newBag)( HG_(zalloc), "hg.lNar.1", HG_(free) ); in lockN_acquire_reader()
301 VG_(addToBag)( lk->heldBy, (Word)thr ); in lockN_acquire_reader()
303 tl_assert(!lk->heldW); in lockN_acquire_reader()
304 tl_assert(HG_(is_sane_LockN)(lk)); in lockN_acquire_reader()
311 static void lockN_release ( Lock* lk, Thread* thr ) in lockN_release() argument
314 tl_assert(HG_(is_sane_LockN)(lk)); in lockN_release()
317 tl_assert(lk->heldBy); in lockN_release()
320 b = VG_(delFromBag)(lk->heldBy, (Word)thr); in lockN_release()
324 tl_assert(lk->acquired_at); in lockN_release()
325 if (VG_(isEmptyBag)(lk->heldBy)) { in lockN_release()
326 VG_(deleteBag)(lk->heldBy); in lockN_release()
327 lk->heldBy = NULL; in lockN_release()
328 lk->heldW = False; in lockN_release()
329 lk->acquired_at = NULL; in lockN_release()
331 tl_assert(HG_(is_sane_LockN)(lk)); in lockN_release()
334 static void remove_Lock_from_locksets_of_all_owning_Threads( Lock* lk ) in remove_Lock_from_locksets_of_all_owning_Threads() argument
337 if (!lk->heldBy) { in remove_Lock_from_locksets_of_all_owning_Threads()
338 tl_assert(!lk->heldW); in remove_Lock_from_locksets_of_all_owning_Threads()
342 VG_(initIterBag)( lk->heldBy ); in remove_Lock_from_locksets_of_all_owning_Threads()
343 while (VG_(nextIterBag)( lk->heldBy, (Word*)&thr, NULL )) { in remove_Lock_from_locksets_of_all_owning_Threads()
346 thr->locksetA, (Word)lk )); in remove_Lock_from_locksets_of_all_owning_Threads()
348 = HG_(delFromWS)( univ_lsets, thr->locksetA, (Word)lk ); in remove_Lock_from_locksets_of_all_owning_Threads()
350 if (lk->heldW) { in remove_Lock_from_locksets_of_all_owning_Threads()
352 thr->locksetW, (Word)lk )); in remove_Lock_from_locksets_of_all_owning_Threads()
354 = HG_(delFromWS)( univ_lsets, thr->locksetW, (Word)lk ); in remove_Lock_from_locksets_of_all_owning_Threads()
357 VG_(doneIterBag)( lk->heldBy ); in remove_Lock_from_locksets_of_all_owning_Threads()
445 static void pp_Lock ( Int d, Lock* lk ) in pp_Lock() argument
447 space(d+0); VG_(printf)("Lock %p (ga %#lx) {\n", lk, lk->guestaddr); in pp_Lock()
449 space(d+3); VG_(printf)("admin %p\n", lk->admin); in pp_Lock()
450 space(d+3); VG_(printf)("magic 0x%x\n", (UInt)lk->magic); in pp_Lock()
452 space(d+3); VG_(printf)("unique %llu\n", lk->unique); in pp_Lock()
453 space(d+3); VG_(printf)("kind %s\n", show_LockKind(lk->kind)); in pp_Lock()
454 space(d+3); VG_(printf)("heldW %s\n", lk->heldW ? "yes" : "no"); in pp_Lock()
455 space(d+3); VG_(printf)("heldBy %p", lk->heldBy); in pp_Lock()
456 if (lk->heldBy) { in pp_Lock()
460 VG_(initIterBag)( lk->heldBy ); in pp_Lock()
461 while (VG_(nextIterBag)( lk->heldBy, (Word*)&thr, &count )) in pp_Lock()
463 VG_(doneIterBag)( lk->heldBy ); in pp_Lock()
473 Lock* lk; in pp_admin_locks() local
474 for (n = 0, lk = admin_locks; lk; n++, lk = lk->admin) { in pp_admin_locks()
478 for (i = 0, lk = admin_locks; lk; i++, lk = lk->admin) { in pp_admin_locks()
483 pp_Lock(d+3, lk); in pp_admin_locks()
491 Lock* lk; in pp_map_locks() local
496 (Word*)&lk )) { in pp_map_locks()
498 VG_(printf)("guest %p -> Lock %p\n", gla, lk); in pp_map_locks()
691 Lock* lk = NULL; in map_locks_maybe_lookup() local
692 found = VG_(lookupFM)( map_locks, NULL, (Word*)&lk, (Word)ga ); in map_locks_maybe_lookup()
693 tl_assert(found ? lk != NULL : lk == NULL); in map_locks_maybe_lookup()
694 return lk; in map_locks_maybe_lookup()
700 Lock* lk = NULL; in map_locks_delete() local
702 (Word*)&ga2, (Word*)&lk, (Word)ga ); in map_locks_delete()
706 tl_assert(lk != NULL); in map_locks_delete()
791 static Bool thread_is_a_holder_of_Lock ( Thread* thr, Lock* lk ) in thread_is_a_holder_of_Lock() argument
793 if (lk->heldBy) in thread_is_a_holder_of_Lock()
794 return VG_(elemBag)( lk->heldBy, (Word)thr ) > 0; in thread_is_a_holder_of_Lock()
809 Lock* lk; in threads__sanity_check() local
818 lk = (Lock*)ls_words[i]; in threads__sanity_check()
820 if (!HG_(is_sane_LockN)(lk)) BAD("2"); in threads__sanity_check()
823 if (!thread_is_a_holder_of_Lock(thr,lk)) BAD("3"); in threads__sanity_check()
841 Lock* lk; in locks__sanity_check() local
844 for (i = 0, lk = admin_locks; lk; i++, lk = lk->admin) in locks__sanity_check()
851 (Word*)&gla, (Word*)&lk )) { in locks__sanity_check()
852 if (lk->guestaddr != gla) BAD("2"); in locks__sanity_check()
856 for (lk = admin_locks; lk; lk = lk->admin) { in locks__sanity_check()
859 if (!HG_(is_sane_LockN)(lk)) BAD("3"); in locks__sanity_check()
861 if (lk != map_locks_maybe_lookup(lk->guestaddr)) BAD("4"); in locks__sanity_check()
864 if (lk->heldBy) { in locks__sanity_check()
867 VG_(initIterBag)( lk->heldBy ); in locks__sanity_check()
868 while (VG_(nextIterBag)( lk->heldBy, in locks__sanity_check()
873 if (!HG_(elemWS)(univ_lsets, thr->locksetA, (Word)lk)) in locks__sanity_check()
876 if (lk->heldW in locks__sanity_check()
877 && !HG_(elemWS)(univ_lsets, thr->locksetW, (Word)lk)) in locks__sanity_check()
879 if ((!lk->heldW) in locks__sanity_check()
880 && HG_(elemWS)(univ_lsets, thr->locksetW, (Word)lk)) in locks__sanity_check()
883 VG_(doneIterBag)( lk->heldBy ); in locks__sanity_check()
886 if (lk->heldW) BAD("9"); /* should be False if !heldBy */ in locks__sanity_check()
1050 static void laog__handle_one_lock_deletion ( Lock* lk ); /* fwds */
1134 Lock* lk; in evhH__post_thread_w_acquires_lock() local
1150 lk = map_locks_lookup_or_create( in evhH__post_thread_w_acquires_lock()
1152 tl_assert( HG_(is_sane_LockN)(lk) ); in evhH__post_thread_w_acquires_lock()
1156 tl_assert(lk->hbso); in evhH__post_thread_w_acquires_lock()
1158 if (lk->heldBy == NULL) { in evhH__post_thread_w_acquires_lock()
1160 tl_assert(!lk->heldW); in evhH__post_thread_w_acquires_lock()
1161 lockN_acquire_writer( lk, thr ); in evhH__post_thread_w_acquires_lock()
1163 libhb_so_recv( thr->hbthr, lk->hbso, True/*strong_recv*/ ); in evhH__post_thread_w_acquires_lock()
1169 tl_assert(lk->heldBy); in evhH__post_thread_w_acquires_lock()
1170 if (!lk->heldW) { in evhH__post_thread_w_acquires_lock()
1179 tl_assert(VG_(sizeUniqueBag)(lk->heldBy) == 1); /* from precondition */ in evhH__post_thread_w_acquires_lock()
1181 if (thr != (Thread*)VG_(anyElementOfBag)(lk->heldBy)) { in evhH__post_thread_w_acquires_lock()
1194 if (lk->kind != LK_mbRec) { in evhH__post_thread_w_acquires_lock()
1203 lockN_acquire_writer( lk, thr ); in evhH__post_thread_w_acquires_lock()
1206 libhb_so_recv( thr->hbthr, lk->hbso, True/*strong_recv*/ ); in evhH__post_thread_w_acquires_lock()
1212 laog__pre_thread_acquires_lock( thr, lk ); in evhH__post_thread_w_acquires_lock()
1214 thr->locksetA = HG_(addToWS)( univ_lsets, thr->locksetA, (Word)lk ); in evhH__post_thread_w_acquires_lock()
1215 thr->locksetW = HG_(addToWS)( univ_lsets, thr->locksetW, (Word)lk ); in evhH__post_thread_w_acquires_lock()
1219 tl_assert(HG_(is_sane_LockN)(lk)); in evhH__post_thread_w_acquires_lock()
1229 Lock* lk; in evhH__post_thread_r_acquires_lock() local
1247 lk = map_locks_lookup_or_create( in evhH__post_thread_r_acquires_lock()
1249 tl_assert( HG_(is_sane_LockN)(lk) ); in evhH__post_thread_r_acquires_lock()
1253 tl_assert(lk->hbso); in evhH__post_thread_r_acquires_lock()
1255 if (lk->heldBy == NULL) { in evhH__post_thread_r_acquires_lock()
1257 tl_assert(!lk->heldW); in evhH__post_thread_r_acquires_lock()
1258 lockN_acquire_reader( lk, thr ); in evhH__post_thread_r_acquires_lock()
1260 libhb_so_recv( thr->hbthr, lk->hbso, False/*!strong_recv*/ ); in evhH__post_thread_r_acquires_lock()
1266 tl_assert(lk->heldBy); in evhH__post_thread_r_acquires_lock()
1267 if (lk->heldW) { in evhH__post_thread_r_acquires_lock()
1276 lockN_acquire_reader( lk, thr ); in evhH__post_thread_r_acquires_lock()
1279 libhb_so_recv( thr->hbthr, lk->hbso, False/*!strong_recv*/ ); in evhH__post_thread_r_acquires_lock()
1285 laog__pre_thread_acquires_lock( thr, lk ); in evhH__post_thread_r_acquires_lock()
1287 thr->locksetA = HG_(addToWS)( univ_lsets, thr->locksetA, (Word)lk ); in evhH__post_thread_r_acquires_lock()
1292 tl_assert(HG_(is_sane_LockN)(lk)); in evhH__post_thread_r_acquires_lock()
1947 Lock* lk; in evh__HG_PTHREAD_MUTEX_DESTROY_PRE() local
1956 lk = map_locks_maybe_lookup( (Addr)mutex ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1958 if (lk == NULL || (lk->kind != LK_nonRec && lk->kind != LK_mbRec)) { in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1963 if (lk) { in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1964 tl_assert( HG_(is_sane_LockN)(lk) ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1965 tl_assert( lk->guestaddr == (Addr)mutex ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1966 if (lk->heldBy) { in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1971 remove_Lock_from_locksets_of_all_owning_Threads( lk ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1972 VG_(deleteBag)( lk->heldBy ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1973 lk->heldBy = NULL; in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1974 lk->heldW = False; in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1975 lk->acquired_at = NULL; in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1977 tl_assert( !lk->heldBy ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1978 tl_assert( HG_(is_sane_LockN)(lk) ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1980 laog__handle_one_lock_deletion(lk); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1981 map_locks_delete( lk->guestaddr ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1982 del_LockN( lk ); in evh__HG_PTHREAD_MUTEX_DESTROY_PRE()
1995 Lock* lk; in evh__HG_PTHREAD_MUTEX_LOCK_PRE() local
2004 lk = map_locks_maybe_lookup( (Addr)mutex ); in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2006 if (lk && (lk->kind == LK_rdwr)) { in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2011 if ( lk in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2013 && (lk->kind == LK_nonRec || lk->kind == LK_rdwr) in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2014 && lk->heldBy in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2015 && lk->heldW in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2016 && VG_(elemBag)( lk->heldBy, (Word)thr ) > 0 ) { in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2024 if (lk->acquired_at) { in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2025 HG_(record_error_Misc_w_aux)( thr, errstr, auxstr, lk->acquired_at ); in evh__HG_PTHREAD_MUTEX_LOCK_PRE()
2089 Lock* lk; in evh__HG_PTHREAD_SPIN_INIT_OR_UNLOCK_PRE() local
2103 lk = map_locks_maybe_lookup( (Addr)slock ); in evh__HG_PTHREAD_SPIN_INIT_OR_UNLOCK_PRE()
2104 if (lk && lk->heldBy) { in evh__HG_PTHREAD_SPIN_INIT_OR_UNLOCK_PRE()
2116 Lock* lk; in evh__HG_PTHREAD_SPIN_INIT_OR_UNLOCK_POST() local
2126 lk = map_locks_maybe_lookup( (Addr)slock ); in evh__HG_PTHREAD_SPIN_INIT_OR_UNLOCK_POST()
2127 if (!lk) { in evh__HG_PTHREAD_SPIN_INIT_OR_UNLOCK_POST()
2285 Lock* lk; in evh__HG_PTHREAD_COND_WAIT_PRE() local
2297 lk = map_locks_maybe_lookup( (Addr)mutex ); in evh__HG_PTHREAD_COND_WAIT_PRE()
2302 if (lk == NULL) { in evh__HG_PTHREAD_COND_WAIT_PRE()
2308 tl_assert( HG_(is_sane_LockN)(lk) ); in evh__HG_PTHREAD_COND_WAIT_PRE()
2309 if (lk->kind == LK_rdwr) { in evh__HG_PTHREAD_COND_WAIT_PRE()
2315 if (lk->heldBy == NULL) { in evh__HG_PTHREAD_COND_WAIT_PRE()
2320 if (lk->heldBy != NULL in evh__HG_PTHREAD_COND_WAIT_PRE()
2321 && VG_(elemBag)( lk->heldBy, (Word)thr ) == 0) { in evh__HG_PTHREAD_COND_WAIT_PRE()
2422 Lock* lk; in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE() local
2431 lk = map_locks_maybe_lookup( (Addr)rwl ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2433 if (lk == NULL || lk->kind != LK_rdwr) { in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2438 if (lk) { in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2439 tl_assert( HG_(is_sane_LockN)(lk) ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2440 tl_assert( lk->guestaddr == (Addr)rwl ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2441 if (lk->heldBy) { in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2446 remove_Lock_from_locksets_of_all_owning_Threads( lk ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2447 VG_(deleteBag)( lk->heldBy ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2448 lk->heldBy = NULL; in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2449 lk->heldW = False; in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2450 lk->acquired_at = NULL; in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2452 tl_assert( !lk->heldBy ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2453 tl_assert( HG_(is_sane_LockN)(lk) ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2455 laog__handle_one_lock_deletion(lk); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2456 map_locks_delete( lk->guestaddr ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2457 del_LockN( lk ); in evh__HG_PTHREAD_RWLOCK_DESTROY_PRE()
2472 Lock* lk; in evh__HG_PTHREAD_RWLOCK_LOCK_PRE() local
2482 lk = map_locks_maybe_lookup( (Addr)rwl ); in evh__HG_PTHREAD_RWLOCK_LOCK_PRE()
2483 if ( lk in evh__HG_PTHREAD_RWLOCK_LOCK_PRE()
2484 && (lk->kind == LK_nonRec || lk->kind == LK_mbRec) ) { in evh__HG_PTHREAD_RWLOCK_LOCK_PRE()
3435 static WordSetID /* in univ_laog */ laog__succs ( Lock* lk ) { in laog__succs() argument
3440 if (VG_(lookupFM)( laog, &keyW, (Word*)&links, (Word)lk )) { in laog__succs()
3442 tl_assert(keyW == (Word)lk); in laog__succs()
3450 static WordSetID /* in univ_laog */ laog__preds ( Lock* lk ) { in laog__preds() argument
3455 if (VG_(lookupFM)( laog, &keyW, (Word*)&links, (Word)lk )) { in laog__preds()
3457 tl_assert(keyW == (Word)lk); in laog__preds()
3570 Lock* lk in laog__pre_thread_acquires_lock() argument
3580 if (HG_(elemWS)( univ_lsets, thr->locksetA, (Word)lk )) in laog__pre_thread_acquires_lock()
3592 other = laog__do_dfs_from_to(lk, thr->locksetA); in laog__pre_thread_acquires_lock()
3602 key.src_ga = lk->guestaddr; in laog__pre_thread_acquires_lock()
3615 thr, lk->guestaddr, other->guestaddr, in laog__pre_thread_acquires_lock()
3620 thr, lk->guestaddr, other->guestaddr, in laog__pre_thread_acquires_lock()
3630 tl_assert(lk->acquired_at); in laog__pre_thread_acquires_lock()
3635 laog__add_edge( old, lk ); in laog__pre_thread_acquires_lock()
3651 static void laog__handle_one_lock_deletion ( Lock* lk ) in laog__handle_one_lock_deletion() argument
3660 preds = laog__preds( lk ); in laog__handle_one_lock_deletion()
3661 succs = laog__succs( lk ); in laog__handle_one_lock_deletion()
3665 laog__del_edge( (Lock*)preds_words[i], lk ); in laog__handle_one_lock_deletion()
3669 laog__del_edge( lk, (Lock*)succs_words[j] ); in laog__handle_one_lock_deletion()