Lines Matching refs:lock
86 static void lock_error(struct checked_lock* lock, const char* func,
90 static void lock_error(struct checked_lock* lock, in lock_error() argument
94 log_err("Created at %s %s:%d", lock->create_func, in lock_error()
95 lock->create_file, lock->create_line); in lock_error()
96 if(lock->holder_func && lock->holder_file) in lock_error()
97 log_err("Previously %s %s:%d", lock->holder_func, in lock_error()
98 lock->holder_file, lock->holder_line); in lock_error()
101 (lock->type==check_lock_mutex)?"mutex": ( in lock_error()
102 (lock->type==check_lock_spinlock)?"spinlock": ( in lock_error()
103 (lock->type==check_lock_rwlock)?"rwlock": "badtype")), err); in lock_error()
118 acquire_locklock(struct checked_lock* lock, in acquire_locklock() argument
125 if((err = pthread_mutex_trylock(&lock->lock))) { in acquire_locklock()
134 err = pthread_mutex_timedlock(&lock->lock, &to); in acquire_locklock()
137 lock_error(lock, func, file, line, "acquire locklock"); in acquire_locklock()
140 lock->contention_count += contend; in acquire_locklock()
147 struct checked_lock* lock = *(struct checked_lock**)p; in lock_protect() local
159 acquire_locklock(lock, __func__, __FILE__, __LINE__); in lock_protect()
160 e->next = lock->prot; in lock_protect()
161 lock->prot = e; in lock_protect()
162 LOCKRET(pthread_mutex_unlock(&lock->lock)); in lock_protect()
169 struct checked_lock* lock = *(struct checked_lock**)mangled; in lock_unprotect() local
171 if(!lock) in lock_unprotect()
173 acquire_locklock(lock, __func__, __FILE__, __LINE__); in lock_unprotect()
174 p = lock->prot; in lock_unprotect()
175 prevp = &lock->prot; in lock_unprotect()
181 LOCKRET(pthread_mutex_unlock(&lock->lock)); in lock_unprotect()
187 LOCKRET(pthread_mutex_unlock(&lock->lock)); in lock_unprotect()
198 prot_check(struct checked_lock* lock, in prot_check() argument
201 struct protected_area* p = lock->prot; in prot_check()
206 lock_error(lock, func, file, line, in prot_check()
215 prot_store(struct checked_lock* lock) in prot_store() argument
217 struct protected_area* p = lock->prot; in prot_store()
229 struct checked_lock* lock = *(struct checked_lock**)pp; in lock_get_mem() local
232 acquire_locklock(lock, __func__, __FILE__, __LINE__); in lock_get_mem()
233 for(p = lock->prot; p; p = p->next) { in lock_get_mem()
237 LOCKRET(pthread_mutex_unlock(&lock->lock)); in lock_get_mem()
243 ordercheck_locklock(struct thr_check* thr, struct checked_lock* lock) in ordercheck_locklock() argument
251 info[2] = lock->create_thread; in ordercheck_locklock()
252 info[3] = lock->create_instance; in ordercheck_locklock()
254 fwrite(lock->holder_file, strlen(lock->holder_file)+1, 1, in ordercheck_locklock()
256 fwrite(&lock->holder_line, sizeof(int), 1, in ordercheck_locklock()
263 ordercheck_lockcreate(struct thr_check* thr, struct checked_lock* lock) in ordercheck_lockcreate() argument
270 fwrite(&lock->create_thread, sizeof(int), 1, in ordercheck_lockcreate()
272 fwrite(&lock->create_instance, sizeof(int), 1, in ordercheck_lockcreate()
274 fwrite(lock->create_file, strlen(lock->create_file)+1, 1, in ordercheck_lockcreate()
276 fwrite(&lock->create_line, sizeof(int), 1, in ordercheck_lockcreate()
283 checklock_init(enum check_lock_type type, struct checked_lock** lock, in checklock_init() argument
304 *lock = e; in checklock_init()
312 LOCKRET(pthread_mutex_init(&e->lock, NULL)); in checklock_init()
330 prot_clear(struct checked_lock* lock) in prot_clear() argument
332 struct protected_area* p=lock->prot, *np; in prot_clear()
343 checktype(enum check_lock_type type, struct checked_lock* lock, in checktype() argument
346 if(!lock) in checktype()
349 if(type != lock->type) { in checktype()
350 lock_error(lock, func, file, line, "wrong lock type"); in checktype()
356 checklock_destroy(enum check_lock_type type, struct checked_lock** lock, in checklock_destroy() argument
361 if(!lock) in checklock_destroy()
363 e = *lock; in checklock_destroy()
375 *lock = NULL; /* use after free will fail */ in checklock_destroy()
376 LOCKRET(pthread_mutex_unlock(&e->lock)); in checklock_destroy()
389 LOCKRET(pthread_mutex_destroy(&e->lock)); in checklock_destroy()
412 finish_acquire_lock(struct thr_check* thr, struct checked_lock* lock, in finish_acquire_lock() argument
416 lock->wait_count --; in finish_acquire_lock()
417 lock->holder = thr; in finish_acquire_lock()
418 lock->hold_count ++; in finish_acquire_lock()
419 lock->holder_func = func; in finish_acquire_lock()
420 lock->holder_file = file; in finish_acquire_lock()
421 lock->holder_line = line; in finish_acquire_lock()
422 ordercheck_locklock(thr, lock); in finish_acquire_lock()
425 lock->prev_held_lock[thr->num] = NULL; in finish_acquire_lock()
426 lock->next_held_lock[thr->num] = thr->holding_first; in finish_acquire_lock()
431 thr->holding_first->prev_held_lock[thr->num] = lock; in finish_acquire_lock()
432 else thr->holding_last = lock; in finish_acquire_lock()
433 thr->holding_first = lock; in finish_acquire_lock()
451 checklock_lockit(enum check_lock_type type, struct checked_lock* lock, in checklock_lockit() argument
460 checktype(type, lock, func, file, line); in checklock_lockit()
461 if(!thr) lock_error(lock, func, file, line, "no thread info"); in checklock_lockit()
463 acquire_locklock(lock, func, file, line); in checklock_lockit()
464 lock->wait_count ++; in checklock_lockit()
465 thr->waiting = lock; in checklock_lockit()
466 if(exclusive && lock->hold_count > 0 && lock->holder == thr) in checklock_lockit()
467 lock_error(lock, func, file, line, "thread already owns lock"); in checklock_lockit()
468 if(type==check_lock_rwlock && getwr && lock->writeholder == thr) in checklock_lockit()
469 lock_error(lock, func, file, line, "thread already has wrlock"); in checklock_lockit()
470 LOCKRET(pthread_mutex_unlock(&lock->lock)); in checklock_lockit()
480 lock_error(lock, func, file, line, in checklock_lockit()
488 acquire_locklock(lock, func, file, line); in checklock_lockit()
489 lock->contention_count += contend; in checklock_lockit()
490 lock->history_count++; in checklock_lockit()
491 if(exclusive && lock->hold_count > 0) in checklock_lockit()
492 lock_error(lock, func, file, line, "got nonexclusive lock"); in checklock_lockit()
493 if(type==check_lock_rwlock && getwr && lock->writeholder) in checklock_lockit()
494 lock_error(lock, func, file, line, "got nonexclusive wrlock"); in checklock_lockit()
496 lock->writeholder = thr; in checklock_lockit()
502 prot_check(lock, func, file, line); in checklock_lockit()
503 finish_acquire_lock(thr, lock, func, file, line); in checklock_lockit()
504 LOCKRET(pthread_mutex_unlock(&lock->lock)); in checklock_lockit()
516 checklock_rdlock(enum check_lock_type type, struct checked_lock* lock, in checklock_rdlock() argument
523 lock->create_thread == 0 && lock->create_instance == 0)) in checklock_rdlock()
524 …klock_rdlock lock %d %d %s:%d at %s:%d\n", lock->create_thread, lock->create_instance, lock->creat… in checklock_rdlock()
526 checklock_lockit(type, lock, func, file, line, in checklock_rdlock()
527 try_rd, timed_rd, &lock->u.rwlock, 0, 0); in checklock_rdlock()
539 checklock_wrlock(enum check_lock_type type, struct checked_lock* lock, in checklock_wrlock() argument
546 lock->create_thread == 0 && lock->create_instance == 0)) in checklock_wrlock()
547 …klock_wrlock lock %d %d %s:%d at %s:%d\n", lock->create_thread, lock->create_instance, lock->creat… in checklock_wrlock()
548 checklock_lockit(type, lock, func, file, line, in checklock_wrlock()
549 try_wr, timed_wr, &lock->u.rwlock, 0, 1); in checklock_wrlock()
579 checklock_lock(enum check_lock_type type, struct checked_lock* lock, in checklock_lock() argument
586 lock->create_thread == 0 && lock->create_instance == 0)) in checklock_lock()
587 …ecklock_lock lock %d %d %s:%d at %s:%d\n", lock->create_thread, lock->create_instance, lock->creat… in checklock_lock()
590 checklock_lockit(type, lock, func, file, line, in checklock_lock()
591 try_mutex, timed_mutex, &lock->u.mutex, 1, 0); in checklock_lock()
595 checklock_lockit(type, lock, func, file, line, in checklock_lock()
597 (void*)&lock->u.spinlock, 1, 0); in checklock_lock()
606 checklock_unlock(enum check_lock_type type, struct checked_lock* lock, in checklock_unlock() argument
613 checktype(type, lock, func, file, line); in checklock_unlock()
614 if(!thr) lock_error(lock, func, file, line, "no thread info"); in checklock_unlock()
616 acquire_locklock(lock, func, file, line); in checklock_unlock()
618 if(thr->holding_first != lock && in checklock_unlock()
619 lock->prev_held_lock[thr->num] == NULL) { in checklock_unlock()
620 lock_error(lock, func, file, line, "unlock nonlocked lock"); in checklock_unlock()
622 if(lock->hold_count <= 0) in checklock_unlock()
623 lock_error(lock, func, file, line, "too many unlocks"); in checklock_unlock()
626 lock->create_thread == 0 && lock->create_instance == 0)) in checklock_unlock()
627 …klock_unlock lock %d %d %s:%d at %s:%d\n", lock->create_thread, lock->create_instance, lock->creat… in checklock_unlock()
630 lock->holder = thr; in checklock_unlock()
631 lock->hold_count --; in checklock_unlock()
632 lock->holder_func = func; in checklock_unlock()
633 lock->holder_file = file; in checklock_unlock()
634 lock->holder_line = line; in checklock_unlock()
640 if(thr->holding_first == lock) in checklock_unlock()
641 thr->holding_first = lock->next_held_lock[thr->num]; in checklock_unlock()
642 if(thr->holding_last == lock) in checklock_unlock()
643 thr->holding_last = lock->prev_held_lock[thr->num]; in checklock_unlock()
644 if(lock->next_held_lock[thr->num]) in checklock_unlock()
645 lock->next_held_lock[thr->num]->prev_held_lock[thr->num] = in checklock_unlock()
646 lock->prev_held_lock[thr->num]; in checklock_unlock()
647 if(lock->prev_held_lock[thr->num]) in checklock_unlock()
648 lock->prev_held_lock[thr->num]->next_held_lock[thr->num] = in checklock_unlock()
649 lock->next_held_lock[thr->num]; in checklock_unlock()
650 lock->next_held_lock[thr->num] = NULL; in checklock_unlock()
651 lock->prev_held_lock[thr->num] = NULL; in checklock_unlock()
653 if(type==check_lock_rwlock && lock->writeholder == thr) { in checklock_unlock()
654 lock->writeholder = NULL; in checklock_unlock()
655 prot_store(lock); in checklock_unlock()
658 prot_store(lock); in checklock_unlock()
660 LOCKRET(pthread_mutex_unlock(&lock->lock)); in checklock_unlock()
665 LOCKRET(pthread_mutex_unlock(&lock->u.mutex)); in checklock_unlock()
668 LOCKRET(pthread_spin_unlock(&lock->u.spinlock)); in checklock_unlock()
671 LOCKRET(pthread_rwlock_unlock(&lock->u.rwlock)); in checklock_unlock()
790 lock_debug_info(struct checked_lock* lock) in lock_debug_info() argument
792 if(!lock) return; in lock_debug_info()
794 (unsigned long long)(size_t)lock, in lock_debug_info()
795 lock->create_thread, lock->create_instance, in lock_debug_info()
796 lock->create_func, lock->create_file, lock->create_line); in lock_debug_info()
798 (lock->type==check_lock_mutex)?"mutex": ( in lock_debug_info()
799 (lock->type==check_lock_spinlock)?"spinlock": ( in lock_debug_info()
800 (lock->type==check_lock_rwlock)?"rwlock": "badtype"))); in lock_debug_info()
802 (unsigned)lock->contention_count, (unsigned)lock->history_count, in lock_debug_info()
803 lock->hold_count, lock->wait_count); in lock_debug_info()
804 log_info("last touch %s %s %d", lock->holder_func, lock->holder_file, in lock_debug_info()
805 lock->holder_line); in lock_debug_info()
807 lock->holder?lock->holder->num:-1, in lock_debug_info()
808 lock->writeholder?lock->writeholder->num:-1); in lock_debug_info()
813 held_debug_info(struct thr_check* thr, struct checked_lock* lock) in held_debug_info() argument
815 if(!lock) return; in held_debug_info()
816 lock_debug_info(lock); in held_debug_info()
817 held_debug_info(thr, lock->next_held_lock[thr->num]); in held_debug_info()