From: Rémi Bernon rbernon@codeweavers.com
--- server/event.c | 11 +++++++++++ server/fd.c | 34 ++++++++-------------------------- server/object.h | 2 ++ 3 files changed, 21 insertions(+), 26 deletions(-)
diff --git a/server/event.c b/server/event.c index eeba7fcaf58..d500129217b 100644 --- a/server/event.c +++ b/server/event.c @@ -168,6 +168,12 @@ struct event *create_event( struct object *root, const struct unicode_str *name, return event; }
+/* create a wineserver internal event for sync purposes */ +struct event *create_event_sync( int manual, int signaled ) +{ + return create_event( NULL, NULL, 0, manual, signaled, NULL ); +} + struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access ) { return (struct event *)get_handle_obj( process, handle, access, &event_ops ); @@ -193,6 +199,11 @@ void reset_event( struct event *event ) event->signaled = 0; }
+struct sync *get_event_sync( struct event *event ) +{ + return &event->obj.sync; +} + static void event_dump( struct object *obj, int verbose ) { struct event *event = (struct event *)obj; diff --git a/server/fd.c b/server/fd.c index 7859d9adbcd..9005c2803d2 100644 --- a/server/fd.c +++ b/server/fd.c @@ -128,6 +128,7 @@ struct closed_fd struct fd { struct object obj; /* object header */ + struct event *sync; /* event object as sync */ const struct fd_ops *fd_ops; /* file descriptor operations */ struct inode *inode; /* inode that this fd belongs to */ struct list inode_entry; /* entry in inode fd list */ @@ -145,7 +146,6 @@ struct fd int unix_fd; /* unix file descriptor */ unsigned int no_fd_status;/* status to return when unix_fd is -1 */ unsigned int cacheable :1;/* can the fd be cached on the client side? */ - unsigned int signaled :1; /* is the fd signaled? */ unsigned int fs_locks :1; /* can we use filesystem locks for this fd? */ int poll_index; /* index of fd in poll array */ struct async_queue read_q; /* async readers of this fd */ @@ -158,18 +158,8 @@ struct fd
static void fd_dump( struct object *obj, int verbose ); static struct sync *fd_get_sync( struct object *obj ); -static int fd_signaled( struct object *obj, struct wait_queue_entry *entry ); static void fd_destroy( struct object *obj );
-const struct sync_ops fd_sync_ops = -{ - add_queue, /* add_queue */ - remove_queue, /* remove_queue */ - fd_signaled, /* signaled */ - no_satisfied, /* satisfied */ - no_signal, /* signal */ -}; - static const struct object_ops fd_ops = { sizeof(struct fd), /* size */ @@ -1576,7 +1566,7 @@ static void fd_dump( struct object *obj, int verbose ) static struct sync *fd_get_sync( struct object *obj ) { struct fd *fd = (struct fd *)obj; - return &fd->obj.sync; + return get_event_sync( fd->sync ); }
static void fd_destroy( struct object *obj ) @@ -1603,6 +1593,7 @@ static void fd_destroy( struct object *obj ) if (fd->unix_fd != -1) close( fd->unix_fd ); free( fd->unix_name ); } + release_object( fd->sync ); }
/* check if the desired access is possible without violating */ @@ -1701,7 +1692,7 @@ static struct fd *alloc_fd_object(void) struct fd *fd;
if (!(fd = alloc_object( &fd_ops ))) return NULL; - fd->obj.sync.ops = &fd_sync_ops; + fd->sync = create_event_sync( 1, 1 ); fd->fd_ops = NULL; fd->user = NULL; fd->inode = NULL; @@ -1716,7 +1707,6 @@ static struct fd *alloc_fd_object(void) fd->nt_name = NULL; fd->nt_namelen = 0; fd->cacheable = 0; - fd->signaled = 1; fd->fs_locks = 1; fd->poll_index = -1; fd->completion = NULL; @@ -1741,7 +1731,7 @@ struct fd *alloc_pseudo_fd( const struct fd_ops *fd_user_ops, struct object *use struct fd *fd;
if (!(fd = alloc_object( &fd_ops ))) return NULL; - fd->obj.sync.ops = &fd_sync_ops; + fd->sync = create_event_sync( 1, 1 ); fd->fd_ops = fd_user_ops; fd->user = user; fd->inode = NULL; @@ -1756,7 +1746,6 @@ struct fd *alloc_pseudo_fd( const struct fd_ops *fd_user_ops, struct object *use fd->nt_namelen = 0; fd->unix_fd = -1; fd->cacheable = 0; - fd->signaled = 1; fd->fs_locks = 0; fd->poll_index = -1; fd->completion = NULL; @@ -2170,8 +2159,8 @@ int is_fd_removable( struct fd *fd ) void set_fd_signaled( struct fd *fd, int signaled ) { if (fd->comp_flags & FILE_SKIP_SET_EVENT_ON_HANDLE) return; - fd->signaled = signaled; - if (signaled) wake_up( &fd->obj, 0 ); + if (signaled) set_event( fd->sync ); + else reset_event( fd->sync ); }
/* check if events are pending and if yes return which one(s) */ @@ -2188,18 +2177,11 @@ int check_fd_events( struct fd *fd, int events ) return pfd.revents; }
-static int fd_signaled( struct object *obj, struct wait_queue_entry *entry ) -{ - struct fd *fd = (struct fd *)obj; - assert( obj->ops == &fd_ops ); - return fd->signaled; -} - /* default get_sync() routine for objects that poll() on an fd */ struct sync *default_fd_get_sync( struct object *obj ) { struct fd *fd = get_obj_fd( obj ); - struct sync *sync = &fd->obj.sync; + struct sync *sync = get_event_sync( fd->sync ); release_object( fd ); return sync; } diff --git a/server/object.h b/server/object.h index 3db4f3d56cb..26f50423197 100644 --- a/server/object.h +++ b/server/object.h @@ -231,12 +231,14 @@ struct keyed_event; extern struct event *create_event( struct object *root, const struct unicode_str *name, unsigned int attr, int manual_reset, int initial_state, const struct security_descriptor *sd ); +extern struct event *create_event_sync( int manual, int signaled ); extern struct keyed_event *create_keyed_event( struct object *root, const struct unicode_str *name, unsigned int attr, const struct security_descriptor *sd ); extern struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access ); extern struct keyed_event *get_keyed_event_obj( struct process *process, obj_handle_t handle, unsigned int access ); extern void set_event( struct event *event ); extern void reset_event( struct event *event ); +extern struct sync *get_event_sync( struct event *event );
/* mutex functions */