View | Details | Raw Unified
Collapse All | Expand All

(-) dbus-1.0.2/dbus/dbus-connection.c (-13 / +45 lines)
 Lines 1434-1439   _dbus_connection_handle_watch (DBusWatch Link Here 
_DBUS_DEFINE_GLOBAL_LOCK (shared_connections);
_DBUS_DEFINE_GLOBAL_LOCK (shared_connections);
static DBusHashTable *shared_connections = NULL;
static DBusHashTable *shared_connections = NULL;
static DBusList *shared_connections_no_guid = NULL;
static void
close_connection_on_shutdown (DBusConnection *connection)
{
  DBusMessage *message;
  dbus_connection_ref (connection);
  _dbus_connection_close_possibly_shared (connection);
  /* Churn through to the Disconnected message */
  while ((message = dbus_connection_pop_message (connection)))
    {
      dbus_message_unref (message);
    }
  dbus_connection_unref (connection);
}
static void
static void
shared_connections_shutdown (void *data)
shared_connections_shutdown (void *data)
 Lines 1446-1452   shared_connections_shutdown (void *data) Link Here 
  while ((n_entries = _dbus_hash_table_get_n_entries (shared_connections)) > 0)
  while ((n_entries = _dbus_hash_table_get_n_entries (shared_connections)) > 0)
    {
    {
      DBusConnection *connection;
      DBusConnection *connection;
      DBusMessage *message;
      DBusHashIter iter;
      DBusHashIter iter;
      
      
      _dbus_hash_iter_init (shared_connections, &iter);
      _dbus_hash_iter_init (shared_connections, &iter);
 Lines 1455-1471   shared_connections_shutdown (void *data) Link Here 
      connection = _dbus_hash_iter_get_value (&iter);
      connection = _dbus_hash_iter_get_value (&iter);
      _DBUS_UNLOCK (shared_connections);
      _DBUS_UNLOCK (shared_connections);
      close_connection_on_shutdown (connection);
      dbus_connection_ref (connection);
      _dbus_connection_close_possibly_shared (connection);
      /* Churn through to the Disconnected message */
      while ((message = dbus_connection_pop_message (connection)))
        {
          dbus_message_unref (message);
        }
      dbus_connection_unref (connection);
      
      _DBUS_LOCK (shared_connections);
      _DBUS_LOCK (shared_connections);
      /* The connection should now be dead and not in our hash ... */
      /* The connection should now be dead and not in our hash ... */
 Lines 1476-1481   shared_connections_shutdown (void *data) Link Here 
  
  
  _dbus_hash_table_unref (shared_connections);
  _dbus_hash_table_unref (shared_connections);
  shared_connections = NULL;
  shared_connections = NULL;
  if (shared_connections_no_guid != NULL)
    {
      DBusConnection *connection;
      connection = _dbus_list_pop_first (&shared_connections_no_guid);
      while (connection != NULL)
        {
          _DBUS_UNLOCK (shared_connections);
          close_connection_on_shutdown (connection);
          _DBUS_LOCK (shared_connections);
          connection = _dbus_list_pop_first (&shared_connections_no_guid);
        }
    }
  shared_connections_no_guid = NULL;
  
  
  _DBUS_UNLOCK (shared_connections);
  _DBUS_UNLOCK (shared_connections);
}
}
 Lines 1585-1591   connection_record_shared_unlocked (DBusC Link Here 
  _dbus_connection_ref_unlocked (connection);
  _dbus_connection_ref_unlocked (connection);
  if (guid == NULL)
  if (guid == NULL)
    return TRUE; /* don't store in the hash */
    {
      _DBUS_LOCK (shared_connections);
      if (!_dbus_list_prepend (&shared_connections_no_guid, connection))
        {
          _DBUS_UNLOCK (shared_connections);
          return FALSE;
        }
      _DBUS_UNLOCK (shared_connections);
      return TRUE; /* don't store in the hash */
    }
  
  
  /* A separate copy of the key is required in the hash table, because
  /* A separate copy of the key is required in the hash table, because
   * we don't have a lock on the connection when we are doing a hash
   * we don't have a lock on the connection when we are doing a hash