Add API for checking transport overflow and implementation
of transport overflow indicator for socket transport.
Other transports always show "no overflow" for now.
Change-Id: I5169403c4548bdaeb9b08e909a45f9299e146e5d
DBusMessage *message);
int _dbus_connection_get_n_incoming (DBusConnection *connection);
DBusMessage *message);
int _dbus_connection_get_n_incoming (DBusConnection *connection);
+DBUS_PRIVATE_EXPORT
+dbus_bool_t _dbus_connection_is_overflowed (DBusConnection *connection);
+
/* if DBUS_ENABLE_STATS */
DBUS_PRIVATE_EXPORT
void _dbus_connection_get_stats (DBusConnection *connection,
/* if DBUS_ENABLE_STATS */
DBUS_PRIVATE_EXPORT
void _dbus_connection_get_stats (DBusConnection *connection,
return connection->n_incoming;
}
return connection->n_incoming;
}
+dbus_bool_t
+_dbus_connection_is_overflowed (DBusConnection *connection)
+{
+ return _dbus_transport_get_overflowed (connection->transport);
+}
+
/**
* Gets the UNIX user ID of the connection if known. Returns #TRUE if
* the uid is filled in. Always returns #FALSE on non-UNIX platforms
/**
* Gets the UNIX user ID of the connection if known. Returns #TRUE if
* the uid is filled in. Always returns #FALSE on non-UNIX platforms
unsigned int is_server : 1; /**< #TRUE if on the server side */
unsigned int unused_bytes_recovered : 1; /**< #TRUE if we've recovered unused bytes from auth */
unsigned int allow_anonymous : 1; /**< #TRUE if an anonymous client can connect */
unsigned int is_server : 1; /**< #TRUE if on the server side */
unsigned int unused_bytes_recovered : 1; /**< #TRUE if we've recovered unused bytes from auth */
unsigned int allow_anonymous : 1; /**< #TRUE if an anonymous client can connect */
+ unsigned int overflowed : 1; /**< #TRUE if last write didn't write all the data */
};
dbus_bool_t _dbus_transport_init_base (DBusTransport *transport,
};
dbus_bool_t _dbus_transport_init_base (DBusTransport *transport,
+ transport->overflowed = FALSE;
+
while (!transport->disconnected &&
_dbus_connection_has_messages_to_send_unlocked (transport->connection))
{
while (!transport->disconnected &&
_dbus_connection_has_messages_to_send_unlocked (transport->connection))
{
*/
if (_dbus_get_is_errno_eagain_or_ewouldblock (saved_errno) || _dbus_get_is_errno_epipe (saved_errno))
*/
if (_dbus_get_is_errno_eagain_or_ewouldblock (saved_errno) || _dbus_get_is_errno_epipe (saved_errno))
+ {
+ transport->overflowed = TRUE;
+ goto out;
+ }
/* Since Linux commit 25888e (from 2.6.37-rc4, Nov 2010), sendmsg()
* on Unix sockets returns -1 errno=ETOOMANYREFS when the passfd
/* Since Linux commit 25888e (from 2.6.37-rc4, Nov 2010), sendmsg()
* on Unix sockets returns -1 errno=ETOOMANYREFS when the passfd
transport->assure_protocol_function = _dbus_message_assure_dbus1;
transport->send_sync_call_function = NULL;
transport->protocol = DBUS_MAJOR_PROTOCOL_VERSION;
transport->assure_protocol_function = _dbus_message_assure_dbus1;
transport->send_sync_call_function = NULL;
transport->protocol = DBUS_MAJOR_PROTOCOL_VERSION;
+ transport->overflowed = FALSE;
return transport->protocol;
}
return transport->protocol;
}
+dbus_bool_t
+_dbus_transport_get_overflowed (DBusTransport *transport)
+{
+ return transport->overflowed;
+}
+
/**
* Initializes the base class members of DBusTransport. Chained up to
* by subclasses in their constructor. The server GUID is the
/**
* Initializes the base class members of DBusTransport. Chained up to
* by subclasses in their constructor. The server GUID is the
DBusMessage **message);
DBusMessage* _dbus_transport_send_sync_call (DBusTransport *transport,
DBusMessage *message);
DBusMessage **message);
DBusMessage* _dbus_transport_send_sync_call (DBusTransport *transport,
DBusMessage *message);
+dbus_bool_t _dbus_transport_get_overflowed (DBusTransport *transport);
/* if DBUS_ENABLE_STATS */
void _dbus_transport_get_stats (DBusTransport *transport,
/* if DBUS_ENABLE_STATS */
void _dbus_transport_get_stats (DBusTransport *transport,