2003-03-23 Havoc Pennington <hp@pobox.com>
[platform/upstream/dbus.git] / dbus / dbus-server-debug.c
index 57d6806..3b7e78d 100644 (file)
@@ -43,7 +43,7 @@
 /**
  * Default timeout interval when reading or writing.
  */
-#define DEFAULT_INTERVAL 10
+#define DEFAULT_INTERVAL 1
 
 /**
  * Opaque object representing a debug server implementation.
@@ -71,11 +71,12 @@ debug_finalize (DBusServer *server)
 {
 }
 
-static void
+static dbus_bool_t
 debug_handle_watch (DBusServer  *server,
                    DBusWatch   *watch,
                    unsigned int flags)
 {
+  return TRUE;
 }
 
 static void
@@ -181,27 +182,28 @@ typedef struct
 {
   DBusServer *server;
   DBusTransport *transport;
-  
+  DBusTimeout *timeout;
 } ServerAndTransport;
 
-static void
+static dbus_bool_t
 handle_new_client (void *data)
 {
   ServerAndTransport *st = data;
   DBusTransport *transport;
   DBusConnection *connection;
+
+  _dbus_verbose ("  new debug client transport %p connecting to server\n",
+                 st->transport);
   
   transport = _dbus_transport_debug_server_new (st->transport);
   if (transport == NULL)
-    {
-      return;
-    }
+    return FALSE;
 
   connection = _dbus_connection_new_for_transport (transport);
   _dbus_transport_unref (transport);
 
   if (connection == NULL)
-    return;
+    return FALSE;
 
   /* See if someone wants to handle this new connection,
    * self-referencing for paranoia
@@ -214,9 +216,16 @@ handle_new_client (void *data)
                                               st->server->new_connection_data);
       dbus_server_unref (st->server);
     }
+
+  _dbus_server_remove_timeout (st->server, st->timeout);
   
   /* If no one grabbed a reference, the connection will die. */
   dbus_connection_unref (connection);
+
+  /* killing timeout frees both "st" and "timeout" */
+  _dbus_timeout_unref (st->timeout);
+
+  return TRUE;
 }
 
 /**
@@ -231,8 +240,7 @@ dbus_bool_t
 _dbus_server_debug_accept_transport (DBusServer     *server,
                                     DBusTransport  *transport)
 {
-  DBusTimeout *timeout;
-  ServerAndTransport *st;
+  ServerAndTransport *st = NULL;
 
   st = dbus_new (ServerAndTransport, 1);
   if (st == NULL)
@@ -241,21 +249,22 @@ _dbus_server_debug_accept_transport (DBusServer     *server,
   st->transport = transport;
   st->server = server;
   
-  timeout = _dbus_timeout_new (DEFAULT_INTERVAL, handle_new_client, st, dbus_free);
+  st->timeout = _dbus_timeout_new (DEFAULT_INTERVAL, handle_new_client, st,
+                                   dbus_free);
 
-  if (timeout == NULL)
-    {
-      dbus_free (st);
-      return FALSE;
-    }
-
-  if (!_dbus_server_add_timeout (server, timeout))
-    {
-      _dbus_timeout_unref (timeout);      
-      return FALSE;
-    }
+  if (st->timeout == NULL)
+    goto failed;
 
+  if (!_dbus_server_add_timeout (server, st->timeout))
+    goto failed;
+  
   return TRUE;
+
+ failed:
+  if (st->timeout)
+    _dbus_timeout_unref (st->timeout);
+  dbus_free (st);
+  return FALSE;
 }
 
 /** @} */