static void mutex_satisfied( struct object *obj, struct wait_queue_entry *entry ) { struct mutex *mutex = (struct mutex *)obj; assert( obj->ops == &mutex_ops ); do_grab( mutex, get_wait_queue_thread( entry )); if (mutex->abandoned) make_wait_abandoned( entry ); mutex->abandoned = 0; }
static int keyed_event_signaled( struct object *obj, struct wait_queue_entry *entry ) { struct wait_queue_entry *ptr; struct process *process; enum select_op select_op; assert( obj->ops == &keyed_event_ops ); process = get_wait_queue_thread( entry )->process; select_op = get_wait_queue_select_op( entry ); if (select_op != SELECT_KEYED_EVENT_WAIT && select_op != SELECT_KEYED_EVENT_RELEASE) return 1; LIST_FOR_EACH_ENTRY( ptr, &obj->wait_queue, struct wait_queue_entry, entry ) { if (ptr == entry) continue; if (get_wait_queue_thread( ptr )->process != process) continue; if (get_wait_queue_select_op( ptr ) != matching_op( select_op )) continue; if (get_wait_queue_key( ptr ) != get_wait_queue_key( entry )) continue; if (wake_thread_queue_entry( ptr )) return 1; } return 0; }
static int mutex_signaled( struct object *obj, struct wait_queue_entry *entry ) { struct mutex *mutex = (struct mutex *)obj; assert( obj->ops == &mutex_ops ); return (!mutex->count || (mutex->owner == get_wait_queue_thread( entry ))); }