Added add_queue/remove_queue to server object operations.
Moved select() loop functions to select.c.

diff --git a/server/thread.c b/server/thread.c
index fff2079..0be86a2 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -49,6 +49,8 @@
 static const struct object_ops thread_ops =
 {
     dump_thread,
+    add_queue,
+    remove_queue,
     thread_signaled,
     thread_satisfied,
     destroy_thread
@@ -200,8 +202,9 @@
 }
 
 /* add a thread to an object wait queue; return 1 if OK, 0 on error */
-static void add_queue( struct object *obj, struct wait_queue_entry *entry )
+void add_queue( struct object *obj, struct wait_queue_entry *entry )
 {
+    grab_object( obj );
     entry->obj    = obj;
     entry->prev   = obj->tail;
     entry->next   = NULL;
@@ -211,10 +214,8 @@
 }
 
 /* remove a thread from an object wait queue */
-static void remove_queue( struct wait_queue_entry *entry )
+void remove_queue( struct object *obj, struct wait_queue_entry *entry )
 {
-    struct object *obj = entry->obj;
-
     if (entry->next) entry->next->prev = entry->prev;
     else obj->tail = entry->prev;
     if (entry->prev) entry->prev->next = entry->next;
@@ -230,9 +231,9 @@
     int i;
 
     assert( wait );
-    for (i = 0, entry = wait->queues; i < wait->count; i++)
-        remove_queue( entry++ );
-    if (wait->flags & SELECT_TIMEOUT) set_timeout( thread->client_fd, NULL );
+    for (i = 0, entry = wait->queues; i < wait->count; i++, entry++)
+        entry->obj->ops->remove_queue( entry->obj, entry );
+    if (wait->flags & SELECT_TIMEOUT) set_select_timeout( thread->client_fd, NULL );
     free( wait );
     thread->wait = NULL;
 }
@@ -280,7 +281,8 @@
             return 0;
         }
         entry->thread = thread;
-        add_queue( obj, entry );
+        obj->ops->add_queue( obj, entry );
+        release_object( obj );
     }
     return 1;
 }
@@ -342,7 +344,7 @@
     {
         /* we need to wait */
         if (flags & SELECT_TIMEOUT)
-            set_timeout( thread->client_fd, &thread->wait->timeout );
+            set_select_timeout( thread->client_fd, &thread->wait->timeout );
         return;
     }
     end_wait( thread );