transaction_free (transaction);
}
+DBusList *
+bus_transaction_copy_connections (BusTransaction *transaction)
+{
+ DBusList *result = NULL;
+ _dbus_list_copy (&transaction->connections, &result);
+ return result;
+}
+
static void
bus_connection_remove_transactions (DBusConnection *connection)
{
DBusMessage *in_reply_to);
void bus_transaction_cancel_and_free (BusTransaction *transaction);
void bus_transaction_execute_and_free (BusTransaction *transaction);
+DBusList * bus_transaction_copy_connections (BusTransaction *transaction);
dbus_bool_t bus_transaction_add_cancel_hook (BusTransaction *transaction,
BusTransactionCancelFunction cancel_function,
void *data,
dest = link->data;
+ link = _dbus_list_get_next_link (&recipients, link);
+
+ if (_dbus_connection_is_overflowed (dest)
+ && dbus_message_is_signal (message,
+ DBUS_INTERFACE_TIZEN,
+ DBUS_TIZEN_CONNECTION_OVERFLOW_SIGNAL))
+ continue;
+
if (!send_one_message (dest, context, sender, addressed_recipient,
message, transaction, &tmp_error))
break;
-
- link = _dbus_list_get_next_link (&recipients, link);
}
_dbus_list_clear (&recipients);
return BUS_RESULT_TRUE;
}
+static void
+bus_check_connection_overflow (BusContext *context,
+ DBusList *connections)
+{
+ BusTransaction *transaction;
+ DBusConnection *recipient;
+ DBusError error;
+
+ transaction = bus_transaction_new (context);
+ if (transaction == NULL)
+ return;
+
+ dbus_error_init (&error);
+
+ while ((recipient = _dbus_list_pop_first (&connections)))
+ if (_dbus_connection_is_overflowed (recipient))
+ {
+ if (!bus_driver_send_connection_overflow (recipient, transaction, &error))
+ {
+ bus_transaction_cancel_and_free (transaction);
+ transaction = NULL;
+ break;
+ }
+ }
+
+ if (transaction != NULL)
+ bus_transaction_execute_and_free (transaction);
+}
+
static DBusHandlerResult
bus_dispatch (DBusConnection *connection,
DBusMessage *message)
if (transaction != NULL)
{
+ DBusList *connections_copy = bus_transaction_copy_connections (transaction);
+
bus_transaction_execute_and_free (transaction);
+
+ bus_check_connection_overflow (context, connections_copy);
}
dbus_connection_unref (connection);