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 struct mutex *create_mutex( struct object *root, const struct unicode_str *name, unsigned int attr, int owned, const struct security_descriptor *sd ) { struct mutex *mutex; if ((mutex = create_named_object( root, &mutex_ops, name, attr, sd ))) { if (get_error() != STATUS_OBJECT_NAME_EXISTS) { /* initialize it if it didn't already exist */ mutex->count = 0; mutex->owner = NULL; mutex->abandoned = 0; if (owned) do_grab( mutex, current ); } } return mutex; }
static struct mutex *create_mutex( struct directory *root, const struct unicode_str *name, unsigned int attr, int owned, const struct security_descriptor *sd ) { struct mutex *mutex; if ((mutex = create_named_object_dir( root, name, attr, &mutex_ops ))) { if (get_error() != STATUS_OBJECT_NAME_EXISTS) { /* initialize it if it didn't already exist */ mutex->count = 0; mutex->owner = NULL; mutex->abandoned = 0; if (owned) do_grab( mutex, current ); if (sd) default_set_sd( &mutex->obj, sd, OWNER_SECURITY_INFORMATION| GROUP_SECURITY_INFORMATION| DACL_SECURITY_INFORMATION| SACL_SECURITY_INFORMATION ); } } return mutex; }