From: Rémi Bernon rbernon@codeweavers.com
--- server/fd.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-)
diff --git a/server/fd.c b/server/fd.c index 9005c2803d2..9bcfce560d8 100644 --- a/server/fd.c +++ b/server/fd.c @@ -258,6 +258,7 @@ static const struct object_ops inode_ops = struct file_lock { struct object obj; /* object header */ + struct event *sync; /* event object as sync */ struct fd *fd; /* fd owning this lock */ struct list fd_entry; /* entry in list of locks on a given fd */ struct list inode_entry; /* entry in inode list of locks */ @@ -270,16 +271,7 @@ struct file_lock
static void file_lock_dump( struct object *obj, int verbose ); static struct sync *file_lock_get_sync( struct object *obj ); -static int file_lock_signaled( struct object *obj, struct wait_queue_entry *entry ); - -static const struct sync_ops file_lock_sync_ops = -{ - add_queue, /* add_queue */ - remove_queue, /* remove_queue */ - file_lock_signaled, /* signaled */ - no_satisfied, /* satisfied */ - no_signal, /* signal */ -}; +static void file_lock_destroy( struct object *obj );
static const struct object_ops file_lock_ops = { @@ -298,7 +290,7 @@ static const struct object_ops file_lock_ops = no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ no_close_handle, /* close_handle */ - no_destroy /* destroy */ + file_lock_destroy /* destroy */ };
@@ -1235,14 +1227,14 @@ static struct sync *file_lock_get_sync( struct object *obj ) { struct file_lock *lock = (struct file_lock *)obj; assert( obj->ops == &file_lock_ops ); - return &lock->obj.sync; + return get_event_sync( lock->sync ); }
-static int file_lock_signaled( struct object *obj, struct wait_queue_entry *entry ) +static void file_lock_destroy( struct object *obj ) { struct file_lock *lock = (struct file_lock *)obj; - /* lock is signaled if it has lost its owner */ - return !lock->process; + assert( obj->ops == &file_lock_ops ); + release_object( lock->sync ); }
/* set (or remove) a Unix lock if possible for the given range */ @@ -1424,7 +1416,7 @@ static struct file_lock *add_lock( struct fd *fd, int shared, file_pos_t start, struct file_lock *lock;
if (!(lock = alloc_object( &file_lock_ops ))) return NULL; - lock->obj.sync.ops = &file_lock_sync_ops; + lock->sync = create_event_sync( 1, 0 ); lock->shared = shared; lock->start = start; lock->end = end; @@ -1454,7 +1446,7 @@ static void remove_lock( struct file_lock *lock, int remove_unix ) if (remove_unix) remove_unix_locks( lock->fd, lock->start, lock->end ); if (list_empty( &inode->locks )) inode_close_pending( inode, 1 ); lock->process = NULL; - wake_up( &lock->obj, 0 ); + set_event( lock->sync ); release_object( lock ); }