Convert the object wait queue to a standard list.
authorAlexandre Julliard <julliard@winehq.org>
Tue, 1 Mar 2005 11:49:58 +0000 (11:49 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 1 Mar 2005 11:49:58 +0000 (11:49 +0000)
server/fd.c
server/object.c
server/object.h
server/queue.c
server/thread.c

index c4c44459ffde68318d5be91315b917de0eddb880..ed95a7455151e164a4d9ba3397eb8a18b85c8dec 100644 (file)
@@ -1324,7 +1324,7 @@ int default_fd_add_queue( struct object *obj, struct wait_queue_entry *entry )
     struct fd *fd = get_obj_fd( obj );
 
     if (!fd) return 0;
-    if (!obj->head)  /* first on the queue */
+    if (list_empty( &obj->wait_queue ))  /* first on the queue */
         set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) );
     add_queue( obj, entry );
     release_object( fd );
@@ -1338,7 +1338,7 @@ void default_fd_remove_queue( struct object *obj, struct wait_queue_entry *entry
 
     grab_object( obj );
     remove_queue( obj, entry );
-    if (!obj->head)  /* last on the queue is gone */
+    if (list_empty( &obj->wait_queue ))  /* last on the queue is gone */
         set_fd_events( fd, 0 );
     release_object( obj );
     release_object( fd );
@@ -1357,7 +1357,7 @@ int default_fd_signaled( struct object *obj, struct thread *thread )
 
     if (ret)
         set_fd_events( fd, 0 ); /* stop waiting on select() if we are signaled */
-    else if (obj->head)
+    else if (!list_empty( &obj->wait_queue ))
         set_fd_events( fd, events ); /* restart waiting on poll() if we are no longer signaled */
 
     release_object( fd );
index f1ae018c04ddb6045449359aa7885fe3d1af8197..91959b65c5a99e551550c4414d41dec841f74623 100644 (file)
@@ -137,9 +137,8 @@ void *alloc_object( const struct object_ops *ops )
     {
         obj->refcount = 1;
         obj->ops      = ops;
-        obj->head     = NULL;
-        obj->tail     = NULL;
         obj->name     = NULL;
+        list_init( &obj->wait_queue );
 #ifdef DEBUG_OBJECTS
         list_add_head( &object_list, &obj->obj_list );
 #endif
@@ -205,8 +204,7 @@ void release_object( void *ptr )
     if (!--obj->refcount)
     {
         /* if the refcount is 0, nobody can be in the wait queue */
-        assert( !obj->head );
-        assert( !obj->tail );
+        assert( list_empty( &obj->wait_queue ));
         obj->ops->destroy( obj );
         if (obj->name) free_name( obj );
 #ifdef DEBUG_OBJECTS
index c42b49c8408fbf957dee6599f2d9515acdc393f3..23dd4b58849db653f4cb3cb8af53a56f442ca593 100644 (file)
@@ -69,8 +69,7 @@ struct object
 {
     unsigned int              refcount;    /* reference count */
     const struct object_ops  *ops;
-    struct wait_queue_entry  *head;
-    struct wait_queue_entry  *tail;
+    struct list               wait_queue;
     struct object_name       *name;
 #ifdef DEBUG_OBJECTS
     struct list               obj_list;
@@ -79,10 +78,9 @@ struct object
 
 struct wait_queue_entry
 {
-    struct wait_queue_entry *next;
-    struct wait_queue_entry *prev;
-    struct object           *obj;
-    struct thread           *thread;
+    struct list     entry;
+    struct object  *obj;
+    struct thread  *thread;
 };
 
 extern void *mem_alloc( size_t size );  /* malloc wrapper */
index b9027b738b87a6ee0bfefc78c8690af029ea0f21..093c94c4c1678bafd168703bdc0193125863d396 100644 (file)
@@ -663,7 +663,7 @@ static int is_queue_hung( struct msg_queue *queue )
     if (now.tv_sec - queue->last_get_msg.tv_sec <= 5)
         return 0;  /* less than 5 seconds since last get message -> not hung */
 
-    for (entry = queue->obj.head; entry; entry = entry->next)
+    LIST_FOR_EACH_ENTRY( entry, &queue->obj.wait_queue, struct wait_queue_entry, entry )
     {
         if (entry->thread->queue == queue)
             return 0;  /* thread is waiting on queue -> not hung */
index de2368450bf036f8174903fbe3c102a640ade87d..a2a232df4cf166bc44a569a0c5c9004ef7860e41 100644 (file)
@@ -342,22 +342,15 @@ static int resume_thread( struct thread *thread )
 int add_queue( struct object *obj, struct wait_queue_entry *entry )
 {
     grab_object( obj );
-    entry->obj    = obj;
-    entry->prev   = obj->tail;
-    entry->next   = NULL;
-    if (obj->tail) obj->tail->next = entry;
-    else obj->head = entry;
-    obj->tail = entry;
+    entry->obj = obj;
+    list_add_tail( &obj->wait_queue, &entry->entry );
     return 1;
 }
 
 /* remove a thread from an object wait queue */
 void remove_queue( struct object *obj, struct wait_queue_entry *entry )
 {
-    if (entry->next) entry->next->prev = entry->prev;
-    else obj->tail = entry->prev;
-    if (entry->prev) entry->prev->next = entry->next;
-    else obj->head = entry->next;
+    list_remove( &entry->entry );
     release_object( obj );
 }
 
@@ -569,13 +562,12 @@ done:
 /* attempt to wake threads sleeping on the object wait queue */
 void wake_up( struct object *obj, int max )
 {
-    struct wait_queue_entry *entry = obj->head;
+    struct list *ptr, *next;
 
-    while (entry)
+    LIST_FOR_EACH_SAFE( ptr, next, &obj->wait_queue )
     {
-        struct thread *thread = entry->thread;
-        entry = entry->next;
-        if (wake_thread( thread ))
+        struct wait_queue_entry *entry = LIST_ENTRY( ptr, struct wait_queue_entry, entry );
+        if (wake_thread( entry->thread ))
         {
             if (max && !--max) break;
         }