diff options
author | Scott James Remnant <scott@ubuntu.com> | 2009-05-11 22:40:38 +0100 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2009-07-14 15:37:32 -0400 |
commit | ecea18c7b2f4d26bfd06170695c40c4fd5998c45 (patch) | |
tree | 16054523f5f13ee22b8550d076063a67994882d5 /dbus | |
parent | 1617081d91c82a1d8a8ae6620ba917996203c454 (diff) |
Don't allocate DBusTimeout for pending call when passed INT_MAX
* dbus/dbus-pending-call.c (_dbus_pending_call_new_unlocked): When passed
INT_MAX, do not clamp the value and do not allocate a timeout for the call
(_dbus_pending_call_get_timeout_unlocked): Document that this may return
NULL.
Signed-off-by: Scott James Remnant <scott@ubuntu.com>
(cherry picked from commit 92dd55c903b440bc423f1f8f9aeb0bbbbcc11bac)
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/dbus-pending-call.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/dbus/dbus-pending-call.c b/dbus/dbus-pending-call.c index 51b93787..8e840f06 100644 --- a/dbus/dbus-pending-call.c +++ b/dbus/dbus-pending-call.c @@ -83,7 +83,7 @@ static dbus_int32_t notify_user_data_slot = -1; * Creates a new pending reply object. * * @param connection connection where reply will arrive - * @param timeout_milliseconds length of timeout, -1 for default + * @param timeout_milliseconds length of timeout, -1 for default, INT_MAX for no timeout * @param timeout_handler timeout handler, takes pending call as data * @returns a new #DBusPendingCall or #NULL if no memory. */ @@ -100,12 +100,11 @@ _dbus_pending_call_new_unlocked (DBusConnection *connection, if (timeout_milliseconds == -1) timeout_milliseconds = _DBUS_DEFAULT_TIMEOUT_VALUE; - /* it would probably seem logical to pass in _DBUS_INT_MAX for - * infinite timeout, but then math in - * _dbus_connection_block_for_reply would get all overflow-prone, so - * smack that down. + /* clamp the timeout otherwise math in + * _dbus_connection_block_for_reply would get all overflow-prone */ - if (timeout_milliseconds > _DBUS_ONE_HOUR_IN_MILLISECONDS * 6) + if ((timeout_milliseconds > _DBUS_ONE_HOUR_IN_MILLISECONDS * 6) && + (timeout_milliseconds < _DBUS_INT_MAX)) timeout_milliseconds = _DBUS_ONE_HOUR_IN_MILLISECONDS * 6; if (!dbus_pending_call_allocate_data_slot (¬ify_user_data_slot)) @@ -119,24 +118,30 @@ _dbus_pending_call_new_unlocked (DBusConnection *connection, return NULL; } - timeout = _dbus_timeout_new (timeout_milliseconds, - timeout_handler, - pending, NULL); - - if (timeout == NULL) + if (timeout_milliseconds != _DBUS_INT_MAX) { - dbus_pending_call_free_data_slot (¬ify_user_data_slot); - dbus_free (pending); - return NULL; + timeout = _dbus_timeout_new (timeout_milliseconds, + timeout_handler, + pending, NULL); + + if (timeout == NULL) + { + dbus_pending_call_free_data_slot (¬ify_user_data_slot); + dbus_free (pending); + return NULL; + } + + pending->timeout = timeout; } - + else + { + pending->timeout = NULL; + } + pending->refcount.value = 1; pending->connection = connection; _dbus_connection_ref_unlocked (pending->connection); - pending->timeout = timeout; - - _dbus_data_slot_list_init (&pending->slot_list); return pending; @@ -255,7 +260,7 @@ _dbus_pending_call_set_timeout_added_unlocked (DBusPendingCall *pending, * Retrives the timeout * * @param pending the pending_call - * @returns a timeout object + * @returns a timeout object or NULL if call has no timeout */ DBusTimeout * _dbus_pending_call_get_timeout_unlocked (DBusPendingCall *pending) |