Lines Matching refs:entry

75 static const char* kUserMutexEntryType = "umtx entry";
182 UserMutexEntry* entry = (UserMutexEntry*)variable->Object();
184 const bool physical = (sSharedUserMutexContext.table.Lookup(entry->address) == entry);
185 kprintf("user mutex entry %p\n", entry);
186 kprintf(" address: 0x%" B_PRIxPHYSADDR " (%s)\n", entry->address,
188 kprintf(" refcount: %" B_PRId32 "\n", entry->ref_count);
189 kprintf(" lock: %p\n", &entry->lock);
195 (void*)entry->address, sizeof(mutex));
201 entry->condition.Dump();
270 UserMutexEntry* entry = context->table.Lookup(address);
271 if (entry != NULL) {
272 atomic_add(&entry->ref_count, 1);
273 return entry;
275 return entry;
280 entry = context->table.Lookup(address);
281 if (entry != NULL) {
282 atomic_add(&entry->ref_count, 1);
283 return entry;
286 entry = new(std::nothrow) UserMutexEntry;
287 if (entry == NULL)
288 return entry;
290 entry->address = address;
291 entry->ref_count = 1;
292 rw_lock_init(&entry->lock, "UserMutexEntry lock");
293 entry->condition.Init(entry, kUserMutexEntryType);
295 context->table.Insert(entry);
296 return entry;
301 put_user_mutex_entry(struct user_mutex_context* context, UserMutexEntry* entry)
303 if (entry == NULL)
306 const generic_addr_t address = entry->address;
307 if (atomic_add(&entry->ref_count, -1) != 1)
313 if (context->table.Lookup(address) != entry)
317 if (atomic_get(&entry->ref_count) > 0)
320 context->table.Remove(entry);
323 rw_lock_destroy(&entry->lock);
324 delete entry;
329 user_mutex_wait_locked(UserMutexEntry* entry,
333 entry->condition.Add(&waiter);
341 user_mutex_prepare_to_lock(UserMutexEntry* entry, int32* mutex, bool isWired)
343 ASSERT_READ_LOCKED_RW_LOCK(&entry->lock);
351 rw_lock_read_unlock(&entry->lock);
352 rw_lock_write_lock(&entry->lock);
353 if (entry->condition.EntriesCount() == 0)
355 rw_lock_write_unlock(&entry->lock);
356 rw_lock_read_lock(&entry->lock);
366 user_mutex_lock_locked(UserMutexEntry* entry, int32* mutex,
369 if (user_mutex_prepare_to_lock(entry, mutex, isWired))
372 status_t error = user_mutex_wait_locked(entry, flags, timeout, locker);
375 if (error != B_OK && entry->condition.EntriesCount() == 0) {
376 WriteLocker writeLocker(entry->lock);
377 if (entry->condition.EntriesCount() == 0)
386 user_mutex_unblock(UserMutexEntry* entry, int32* mutex, uint32 flags, bool isWired)
388 WriteLocker entryLocker(entry->lock);
389 if (entry->condition.EntriesCount() == 0) {
406 entry->condition.NotifyAll(B_OK);
408 if (!entry->condition.NotifyOne(B_OK))
412 if (entry->condition.EntriesCount() == 0)
418 user_mutex_sem_acquire_locked(UserMutexEntry* entry, int32* sem,
431 return user_mutex_wait_locked(entry, flags,
437 user_mutex_sem_release(UserMutexEntry* entry, int32* sem, bool isWired)
439 WriteLocker entryLocker(entry->lock);
440 if (entry->condition.NotifyOne(B_OK) == 0) {
452 if (entry->condition.EntriesCount() == 0) {
527 UserMutexEntry* entry = get_user_mutex_entry(contextFetcher.Context(),
529 if (entry == NULL)
533 ReadLocker entryLocker(entry->lock);
534 error = user_mutex_lock_locked(entry, mutex,
537 put_user_mutex_entry(contextFetcher.Context(), entry);
621 // In the case where there is no entry, we must hold the read lock until we
624 UserMutexEntry* entry = get_user_mutex_entry(context,
626 if (entry == NULL) {
631 user_mutex_unblock(entry, mutex, flags, contextFetcher.IsWired());
633 put_user_mutex_entry(context, entry);
668 UserMutexEntry* entry = get_user_mutex_entry(context, contextFetcher.Address());
669 if (entry == NULL)
673 ReadLocker entryLocker(entry->lock);
674 error = user_mutex_sem_acquire_locked(entry, sem,
677 put_user_mutex_entry(context, entry);
694 UserMutexEntry* entry = get_user_mutex_entry(context,
697 user_mutex_sem_release(entry, sem, contextFetcher.IsWired());
699 put_user_mutex_entry(context, entry);