dbus-pending-call.c revision 174c63f176b9074ffe3cca8df016c53d68cafce9
1a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */ 2a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/* dbus-pending-call.c Object representing a call in progress. 3a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 4a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Copyright (C) 2002, 2003 Red Hat Inc. 5a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 7a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 8a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * This program is free software; you can redistribute it and/or modify 9a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * it under the terms of the GNU General Public License as published by 10a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 11a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * (at your option) any later version. 12a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 13a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * This program is distributed in the hope that it will be useful, 14a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 15a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * GNU General Public License for more details. 17a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 18a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * You should have received a copy of the GNU General Public License 19a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * along with this program; if not, write to the Free Software 20a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 22a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 23a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 24a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#include "dbus-internals.h" 25ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington#include "dbus-connection-internal.h" 26e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J#include "dbus-pending-call-internal.h" 27ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington#include "dbus-pending-call.h" 28a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#include "dbus-list.h" 29a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#include "dbus-threads.h" 30a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#include "dbus-test.h" 31a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 32a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 33a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @defgroup DBusPendingCallInternals DBusPendingCall implementation details 34a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @ingroup DBusInternals 35a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @brief DBusPendingCall private implementation details. 36a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 37a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * The guts of DBusPendingCall and its methods. 38a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 39a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @{ 40a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 41a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 42e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 43e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @brief Internals of DBusPendingCall 44e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 45e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Opaque object representing a reply message that we're waiting for. 46e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 4715ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington 4815ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/** 4915ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * shorter and more visible way to write _dbus_connection_lock() 5015ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */ 51222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#define CONNECTION_LOCK(connection) _dbus_connection_lock(connection) 5215ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/** 5315ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * shorter and more visible way to write _dbus_connection_unlock() 5415ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */ 55222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#define CONNECTION_UNLOCK(connection) _dbus_connection_unlock(connection) 56222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 572a895edf6b1cad3915f5ca9e8b41f4bba780b2e0Havoc Pennington/** 582a895edf6b1cad3915f5ca9e8b41f4bba780b2e0Havoc Pennington * Implementation details of #DBusPendingCall - all fields are private. 592a895edf6b1cad3915f5ca9e8b41f4bba780b2e0Havoc Pennington */ 60e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jstruct DBusPendingCall 61e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 62e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusAtomic refcount; /**< reference count */ 63e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 64e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusDataSlotList slot_list; /**< Data stored by allocated integer ID */ 65e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 66e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusPendingCallNotifyFunction function; /**< Notifier when reply arrives. */ 67e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 68e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusConnection *connection; /**< Connections we're associated with */ 69e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusMessage *reply; /**< Reply (after we've received it) */ 70e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusTimeout *timeout; /**< Timeout */ 71e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 72e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusList *timeout_link; /**< Preallocated timeout response */ 73e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 74e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_uint32_t reply_serial; /**< Expected serial of reply */ 75e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 76e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J unsigned int completed : 1; /**< TRUE if completed */ 77e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J unsigned int timeout_added : 1; /**< Have added the timeout */ 78e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}; 79e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 80583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonstatic dbus_int32_t notify_user_data_slot = -1; 81583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 82a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 83a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Creates a new pending reply object. 84a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 85a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param connection connection where reply will arrive 86ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param timeout_milliseconds length of timeout, -1 for default 87ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param timeout_handler timeout handler, takes pending call as data 88a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @returns a new #DBusPendingCall or #NULL if no memory. 89a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 90a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc PenningtonDBusPendingCall* 91222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_new_unlocked (DBusConnection *connection, 92222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J int timeout_milliseconds, 93222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J DBusTimeoutHandler timeout_handler) 94a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 95a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington DBusPendingCall *pending; 96ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington DBusTimeout *timeout; 97a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 98aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington _dbus_assert (timeout_milliseconds >= 0 || timeout_milliseconds == -1); 995efe8e7f1d97931710558495a951e0b35afbfb72John (J 100ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (timeout_milliseconds == -1) 101ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington timeout_milliseconds = _DBUS_DEFAULT_TIMEOUT_VALUE; 102583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 1039e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington /* it would probably seem logical to pass in _DBUS_INT_MAX for 1049e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * infinite timeout, but then math in 1059e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * _dbus_connection_block_for_reply would get all overflow-prone, so 1069e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * smack that down. 1079e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington */ 1089e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington if (timeout_milliseconds > _DBUS_ONE_HOUR_IN_MILLISECONDS * 6) 1099e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington timeout_milliseconds = _DBUS_ONE_HOUR_IN_MILLISECONDS * 6; 1109e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 111583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington if (!dbus_pending_call_allocate_data_slot (¬ify_user_data_slot)) 112583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return NULL; 113ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 1144097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington pending = dbus_new0 (DBusPendingCall, 1); 115a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 116a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington if (pending == NULL) 117583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington { 118583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_pending_call_free_data_slot (¬ify_user_data_slot); 119583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return NULL; 120583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington } 121a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 122ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington timeout = _dbus_timeout_new (timeout_milliseconds, 123ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington timeout_handler, 124ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington pending, NULL); 125ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 126ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (timeout == NULL) 127ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington { 128583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_pending_call_free_data_slot (¬ify_user_data_slot); 129ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington dbus_free (pending); 130ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington return NULL; 131ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington } 132ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 133a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington pending->refcount.value = 1; 134a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington pending->connection = connection; 135a549de8b7a744ec52e514d1e38ac9f2370b5f8b6John (J _dbus_connection_ref_unlocked (pending->connection); 1365efe8e7f1d97931710558495a951e0b35afbfb72John (J 137ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington pending->timeout = timeout; 138583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 1395efe8e7f1d97931710558495a951e0b35afbfb72John (J 140583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_data_slot_list_init (&pending->slot_list); 141ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 142a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington return pending; 143a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 144a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 145ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** 146e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply of a pending call with the given message, 147e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * or if the message is #NULL, by timing out the pending call. 148e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 149e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending call 150e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param message the message to complete the call with, or #NULL 151e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * to time out the call 152e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 153e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 154222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_set_reply_unlocked (DBusPendingCall *pending, 155222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J DBusMessage *message) 156e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 157e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J if (message == NULL) 158e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J { 159e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J message = pending->timeout_link->data; 160e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_list_clear (&pending->timeout_link); 161e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J } 162e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J else 163e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_message_ref (message); 164e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 165e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_verbose (" handing message %p (%s) to pending call serial %u\n", 166e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J message, 167e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN ? 168e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J "method return" : 169e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ? 170e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J "error" : "other type", 171e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->reply_serial); 172e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 173e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending->reply == NULL); 174e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending->reply_serial == dbus_message_get_reply_serial (message)); 175e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->reply = message; 176e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 177e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 178e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 179ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * Calls notifier function for the pending call 180ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * and sets the call to completed. 181ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * 182ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call 183ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * 184ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */ 185ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtonvoid 186e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_complete (DBusPendingCall *pending) 187ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington{ 1889e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington _dbus_assert (!pending->completed); 1899e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 190ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington pending->completed = TRUE; 191ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 192ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (pending->function) 193583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington { 194583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington void *user_data; 195583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington user_data = dbus_pending_call_get_data (pending, 196583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington notify_user_data_slot); 197583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 198583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington (* pending->function) (pending, user_data); 199583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington } 200ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington} 201ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 20215ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/** 20315ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * If the pending call hasn't been timed out, add its timeout 20415ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * error reply to the connection's incoming message queue. 20515ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * 20615ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @param pending the pending call 20715ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @param connection the connection the call was sent to 20815ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */ 209e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 210222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_queue_timeout_error_unlocked (DBusPendingCall *pending, 211222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J DBusConnection *connection) 212e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 213222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_assert (connection == pending->connection); 214222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 215e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J if (pending->timeout_link) 216e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J { 217e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_connection_queue_synthesized_message_link (connection, 218e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->timeout_link); 219e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->timeout_link = NULL; 220e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J } 221e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 222e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 223e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 224e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Checks to see if a timeout has been added 225e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 226e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 227e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns #TRUE if there is a timeout or #FALSE if not 228e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 229e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_bool_t 230222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_is_timeout_added_unlocked (DBusPendingCall *pending) 231e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 232e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 233e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 234e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return pending->timeout_added; 235e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 236e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 237e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 238e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 239e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets wether the timeout has been added 240e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 241e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 242e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param is_added whether or not a timeout is added 243e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 244e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 245222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_set_timeout_added_unlocked (DBusPendingCall *pending, 246222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_bool_t is_added) 247e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 248e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 249e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 250e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->timeout_added = is_added; 251e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 252e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 253e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 254e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 255e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Retrives the timeout 256e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 257e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 258e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns a timeout object 259e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 260e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (JDBusTimeout * 261222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_get_timeout_unlocked (DBusPendingCall *pending) 262e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 263e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 264e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 265e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return pending->timeout; 266e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 267e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 268e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 269e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Gets the reply's serial number 270e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 271e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 272e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns a serial number for the reply or 0 273e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 274e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_uint32_t 275222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_get_reply_serial_unlocked (DBusPendingCall *pending) 276e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 277e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 278e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 279e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return pending->reply_serial; 280e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 281e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 282e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 283e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply's serial number 284e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 285e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 286e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param serial the serial number 287e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 288e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 289222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_set_reply_serial_unlocked (DBusPendingCall *pending, 290222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_uint32_t serial) 291e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 292e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 293e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending->reply_serial == 0); 294e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 295e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->reply_serial = serial; 296e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 297e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 298e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 299222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * Gets the connection associated with this pending call. 300222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * 301222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @param pending the pending_call 302222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @returns the connection associated with the pending call 303222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */ 304222bd07e9df5e3b5a367d1282b43fd3a827a7552John (JDBusConnection * 305222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_get_connection_and_lock (DBusPendingCall *pending) 306222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{ 307222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_assert (pending != NULL); 308222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 309222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_LOCK (pending->connection); 310222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J return pending->connection; 311222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J} 312222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 313222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J/** 314222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * Gets the connection associated with this pending call. 315e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 316e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 317e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns the connection associated with the pending call 318e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 319e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (JDBusConnection * 320222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_get_connection_unlocked (DBusPendingCall *pending) 321e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 322e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 323e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 324222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J return pending->connection; 325e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 326e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 327e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 328e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply message associated with the pending call to a timeout error 329e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 330e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 331e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param message the message we are sending the error reply to 332e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param serial serial number for the reply 333e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @return #FALSE on OOM 334e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 335e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_bool_t 336222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_set_timeout_error_unlocked (DBusPendingCall *pending, 337222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J DBusMessage *message, 338222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_uint32_t serial) 339e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 340e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusList *reply_link; 341e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusMessage *reply; 342e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 343e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J reply = dbus_message_new_error (message, DBUS_ERROR_NO_REPLY, 344d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington "Did not receive a reply. Possible causes include: " 345d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington "the remote application did not send a reply, " 346d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington "the message bus security policy blocked the reply, " 347d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington "the reply timeout expired, or " 348d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington "the network connection was broken."); 349e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J if (reply == NULL) 350e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return FALSE; 351e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 352e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J reply_link = _dbus_list_alloc_link (reply); 353e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J if (reply_link == NULL) 354e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J { 355e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_message_unref (reply); 356e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return FALSE; 357e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J } 358e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 359e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->timeout_link = reply_link; 360e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 361222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_pending_call_set_reply_serial_unlocked (pending, serial); 362e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 363e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return TRUE; 364e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 365e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 366a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 367222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * Increments the reference count on a pending call, 368222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * while the lock on its connection is already held. 369222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * 370222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @param pending the pending call object 371222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @returns the pending call object 372222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */ 373222bd07e9df5e3b5a367d1282b43fd3a827a7552John (JDBusPendingCall * 374222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_ref_unlocked (DBusPendingCall *pending) 375222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{ 376222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J pending->refcount.value += 1; 377222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 378222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J return pending; 379222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J} 380222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 381a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 382222bd07e9df5e3b5a367d1282b43fd3a827a7552John (Jstatic void 383222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_last_unref (DBusPendingCall *pending) 384222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{ 385222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J DBusConnection *connection; 386222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 387222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J /* If we get here, we should be already detached 388222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * from the connection, or never attached. 389222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */ 390222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_assert (!pending->timeout_added); 391222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 392222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J connection = pending->connection; 393222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 394222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J /* this assumes we aren't holding connection lock... */ 395222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_data_slot_list_free (&pending->slot_list); 396222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 397222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J if (pending->timeout != NULL) 398222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_timeout_unref (pending->timeout); 399222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 400222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J if (pending->timeout_link) 401222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J { 402222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_message_unref ((DBusMessage *)pending->timeout_link->data); 403222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_list_free_link (pending->timeout_link); 404222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J pending->timeout_link = NULL; 405222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J } 406222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 407222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J if (pending->reply) 408222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J { 409222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_message_unref (pending->reply); 410222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J pending->reply = NULL; 411222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J } 412222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 413222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_free (pending); 414222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 415222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_pending_call_free_data_slot (¬ify_user_data_slot); 416222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 417222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J /* connection lock should not be held. */ 418222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J /* Free the connection last to avoid a weird state while 419222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * calling out to application code where the pending exists 420222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * but not the connection. 421222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */ 422222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_connection_unref (connection); 423222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J} 424222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 425222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J/** 426222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * Decrements the reference count on a pending call, 427222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * freeing it if the count reaches 0. Assumes 428222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * connection lock is already held. 429222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * 430222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @param pending the pending call object 431222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */ 432222bd07e9df5e3b5a367d1282b43fd3a827a7552John (Jvoid 433222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_unref_and_unlock (DBusPendingCall *pending) 434222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{ 435222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_bool_t last_unref; 436222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 437222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_assert (pending->refcount.value > 0); 438222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 439222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J pending->refcount.value -= 1; 440222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J last_unref = pending->refcount.value == 0; 441222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 442222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_UNLOCK (pending->connection); 443222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J if (last_unref) 444222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_pending_call_last_unref (pending); 445222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J} 446222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 447a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 448174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * Checks whether the pending call has received a reply 449174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * yet, or not. Assumes connection lock is held. 450174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * 451174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param pending the pending call 452174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @returns #TRUE if a reply has been received 453174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */ 454174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtondbus_bool_t 455174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington_dbus_pending_call_get_completed_unlocked (DBusPendingCall *pending) 456174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington{ 457174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return pending->completed; 458174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington} 459174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 460174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtonstatic DBusDataSlotAllocator slot_allocator; 461174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (pending_call_slots); 462174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 463174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/** 464174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * Stores a pointer on a #DBusPendingCall, along 465174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * with an optional function to be used for freeing 466174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * the data when the data is set again, or when 467174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * the pending call is finalized. The slot number 468174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * must have been allocated with dbus_pending_call_allocate_data_slot(). 469174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * 470174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param pending the pending_call 471174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param slot the slot number 472174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param data the data to store 473174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param free_data_func finalizer function for the data 474174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @returns #TRUE if there was enough memory to store the data 475174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */ 476174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtondbus_bool_t 477174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington_dbus_pending_call_set_data_unlocked (DBusPendingCall *pending, 478174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington dbus_int32_t slot, 479174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington void *data, 480174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington DBusFreeFunction free_data_func) 481174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington{ 482174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington DBusFreeFunction old_free_func; 483174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington void *old_data; 484174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington dbus_bool_t retval; 485174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 486174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington retval = _dbus_data_slot_list_set (&slot_allocator, 487174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington &pending->slot_list, 488174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington slot, data, free_data_func, 489174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington &old_free_func, &old_data); 490174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 491174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington /* Drop locks to call out to app code */ 492174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington CONNECTION_UNLOCK (pending->connection); 493174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 494174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (retval) 495174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 496174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (old_free_func) 497174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington (* old_free_func) (old_data); 498174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 499174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 500174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington CONNECTION_LOCK (pending->connection); 501174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 502174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return retval; 503174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington} 504174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 505174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/** @} */ 506174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 507174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/** 508174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @defgroup DBusPendingCall DBusPendingCall 509174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @ingroup DBus 510174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @brief Pending reply to a method call message 511174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * 512174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * A DBusPendingCall is an object representing an 513174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * expected reply. A #DBusPendingCall can be created 514174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * when you send a message that should have a reply. 515174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * 516174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @{ 517174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */ 518174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 519174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/** 520174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @typedef DBusPendingCall 521174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * 522174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * Opaque data type representing a message pending. 523174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */ 524174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 525174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/** 526174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * Increments the reference count on a pending call. 527174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * 528174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param pending the pending call object 529174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @returns the pending call object 530174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */ 531174c63f176b9074ffe3cca8df016c53d68cafce9Havoc PenningtonDBusPendingCall * 532174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtondbus_pending_call_ref (DBusPendingCall *pending) 533174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington{ 534174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_return_val_if_fail (pending != NULL, NULL); 535174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 536174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington /* The connection lock is better than the global 537174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * lock in the atomic increment fallback 538174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */ 539174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#ifdef DBUS_HAVE_ATOMIC_INT 540174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_atomic_inc (&pending->refcount); 541174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#else 542174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington CONNECTION_LOCK (pending->connection); 543174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_assert (pending->refcount.value > 0); 544174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 545174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington pending->refcount.value += 1; 546174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington CONNECTION_UNLOCK (pending->connection); 547174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#endif 548174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 549174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return pending; 550174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington} 551174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 552174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/** 553a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Decrements the reference count on a pending call, 554a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * freeing it if the count reaches 0. 555a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 556a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param pending the pending call object 557a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 558a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtonvoid 559a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_pending_call_unref (DBusPendingCall *pending) 560a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 561a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington dbus_bool_t last_unref; 562a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 563a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington _dbus_return_if_fail (pending != NULL); 564a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 565222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J /* More efficient to use the connection lock instead of atomic 566222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * int fallback if we lack atomic int decrement 567222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */ 568222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#ifdef DBUS_HAVE_ATOMIC_INT 569a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington last_unref = (_dbus_atomic_dec (&pending->refcount) == 1); 570222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#else 571222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_LOCK (pending->connection); 572222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_assert (pending->refcount.value > 0); 573222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J pending->refcount.value -= 1; 574222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J last_unref = pending->refcount.value == 0; 575222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_UNLOCK (pending->connection); 576222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#endif 577222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 578a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington if (last_unref) 579222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_pending_call_last_unref(pending); 580a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 581a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 582a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 583a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Sets a notification function to be called when the reply is 584a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * received or the pending call times out. 585a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 586a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param pending the pending call 587a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param function notifier function 588a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param user_data data to pass to notifier function 589a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param free_user_data function to free the user data 590583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #FALSE if not enough memory 591a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 592583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t 593a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_pending_call_set_notify (DBusPendingCall *pending, 594a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington DBusPendingCallNotifyFunction function, 595a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington void *user_data, 596a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington DBusFreeFunction free_user_data) 597a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 598583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_return_val_if_fail (pending != NULL, FALSE); 599a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 600222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_LOCK (pending->connection); 601222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 602583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington /* could invoke application code! */ 603222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J if (!_dbus_pending_call_set_data_unlocked (pending, notify_user_data_slot, 604222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J user_data, free_user_data)) 605583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return FALSE; 606583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 607a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington pending->function = function; 608a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 609222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_UNLOCK (pending->connection); 610222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 611583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return TRUE; 612a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 613a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 614ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** 6151dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * Cancels the pending call, such that any reply or error received 6161dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * will just be ignored. Drops the dbus library's internal reference 6171dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * to the #DBusPendingCall so will free the call if nobody else is 6181dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * holding a reference. However you usually get a reference 6191dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * from dbus_connection_send() so probably your app owns a ref also. 620ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * 621ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call 622ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */ 623ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtonvoid 624ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_pending_call_cancel (DBusPendingCall *pending) 625ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington{ 62657657889128dc54069525cce47bce51365dbde0fJohn (J _dbus_return_if_fail (pending != NULL); 62757657889128dc54069525cce47bce51365dbde0fJohn (J 628222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_connection_remove_pending_call (pending->connection, 629222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J pending); 630ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington} 631a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 632ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** 633ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * Checks whether the pending call has received a reply 634222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * yet, or not. 635583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 636ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call 637222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @returns #TRUE if a reply has been received 638222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */ 639ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_bool_t 640ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_pending_call_get_completed (DBusPendingCall *pending) 641a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 642222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_bool_t completed; 643222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 64457657889128dc54069525cce47bce51365dbde0fJohn (J _dbus_return_val_if_fail (pending != NULL, FALSE); 64557657889128dc54069525cce47bce51365dbde0fJohn (J 646222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_LOCK (pending->connection); 647222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J completed = pending->completed; 648222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_UNLOCK (pending->connection); 649222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 650222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J return completed; 651a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 652a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 653ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** 6549e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * Gets the reply, or returns #NULL if none has been received 6559e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * yet. Ownership of the reply message passes to the caller. This 6569e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * function can only be called once per pending call, since the reply 6579e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * message is tranferred to the caller. 658583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 659ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call 660ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @returns the reply message or #NULL. 661ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */ 662ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc PenningtonDBusMessage* 6639e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Penningtondbus_pending_call_steal_reply (DBusPendingCall *pending) 664a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 6659e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington DBusMessage *message; 6669e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 66757657889128dc54069525cce47bce51365dbde0fJohn (J _dbus_return_val_if_fail (pending != NULL, NULL); 6689e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington _dbus_return_val_if_fail (pending->completed, NULL); 6699e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington _dbus_return_val_if_fail (pending->reply != NULL, NULL); 670222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 671222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_LOCK (pending->connection); 6729e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 6739e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington message = pending->reply; 6749e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington pending->reply = NULL; 6759e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 676222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_UNLOCK (pending->connection); 677222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 6789e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington return message; 679a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 680a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 681a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington/** 682a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * Block until the pending call is completed. The blocking is as with 683a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * dbus_connection_send_with_reply_and_block(); it does not enter the 684a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * main loop or process other messages, it simply waits for the reply 685a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * in question. 686a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * 687583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * If the pending call is already completed, this function returns 688583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * immediately. 689583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 69015c60238853f2896738c23b53e574b5d9cae1635John (J * @todo when you start blocking, the timeout is reset, but it should 691a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * really only use time remaining since the pending call was created. 69215c60238853f2896738c23b53e574b5d9cae1635John (J * This requires storing timestamps instead of intervals in the timeout 693a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * 694a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * @param pending the pending call 695a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington */ 696a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Penningtonvoid 697a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Penningtondbus_pending_call_block (DBusPendingCall *pending) 698a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington{ 69957657889128dc54069525cce47bce51365dbde0fJohn (J _dbus_return_if_fail (pending != NULL); 70057657889128dc54069525cce47bce51365dbde0fJohn (J 7019e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington _dbus_connection_block_pending_call (pending); 702a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington} 703a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington 704583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/** 705583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Allocates an integer ID to be used for storing application-specific 706583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * data on any DBusPendingCall. The allocated ID may then be used 707583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with dbus_pending_call_set_data() and dbus_pending_call_get_data(). 708583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The passed-in slot must be initialized to -1, and is filled in 709583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with the slot ID. If the passed-in slot is not -1, it's assumed 710583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * to be already allocated, and its refcount is incremented. 711583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 712583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The allocated slot is global, i.e. all DBusPendingCall objects will 713583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * have a slot with the given integer ID reserved. 714583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 715583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot_p address of a global variable storing the slot 716583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #FALSE on failure (no memory) 717583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */ 718583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t 719583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_allocate_data_slot (dbus_int32_t *slot_p) 720583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{ 72157657889128dc54069525cce47bce51365dbde0fJohn (J _dbus_return_val_if_fail (slot_p != NULL, FALSE); 72257657889128dc54069525cce47bce51365dbde0fJohn (J 723583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return _dbus_data_slot_allocator_alloc (&slot_allocator, 72414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J &_DBUS_LOCK_NAME (pending_call_slots), 725583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington slot_p); 726583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington} 727583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 728583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/** 729583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Deallocates a global ID for #DBusPendingCall data slots. 730583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * dbus_pending_call_get_data() and dbus_pending_call_set_data() may 731583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * no longer be used with this slot. Existing data stored on existing 732583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * DBusPendingCall objects will be freed when the #DBusPendingCall is 733583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * finalized, but may not be retrieved (and may only be replaced if 734583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * someone else reallocates the slot). When the refcount on the 735583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * passed-in slot reaches 0, it is set to -1. 736583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 737583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot_p address storing the slot to deallocate 738583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */ 739583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonvoid 740583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_free_data_slot (dbus_int32_t *slot_p) 741583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{ 74257657889128dc54069525cce47bce51365dbde0fJohn (J _dbus_return_if_fail (slot_p != NULL); 743583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_return_if_fail (*slot_p >= 0); 744222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 745583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_data_slot_allocator_free (&slot_allocator, slot_p); 746583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington} 747583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 748583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/** 749583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Stores a pointer on a #DBusPendingCall, along 750583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with an optional function to be used for freeing 751583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * the data when the data is set again, or when 752583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * the pending call is finalized. The slot number 753583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * must have been allocated with dbus_pending_call_allocate_data_slot(). 754583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 755583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param pending the pending_call 756583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot the slot number 757583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param data the data to store 758583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param free_data_func finalizer function for the data 759583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #TRUE if there was enough memory to store the data 760583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */ 761583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t 762222bd07e9df5e3b5a367d1282b43fd3a827a7552John (Jdbus_pending_call_set_data (DBusPendingCall *pending, 763222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_int32_t slot, 764222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J void *data, 765222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J DBusFreeFunction free_data_func) 766222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{ 767222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J dbus_bool_t retval; 768222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 769222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_return_val_if_fail (pending != NULL, FALSE); 770222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J _dbus_return_val_if_fail (slot >= 0, FALSE); 771222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 772222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J 773222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_LOCK (pending->connection); 774222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J retval = _dbus_pending_call_set_data_unlocked (pending, slot, data, free_data_func); 775222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_UNLOCK (pending->connection); 776583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return retval; 777583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington} 778583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 779583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/** 780583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Retrieves data previously set with dbus_pending_call_set_data(). 781583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The slot must still be allocated (must not have been freed). 782583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 783583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param pending the pending_call 784583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot the slot to get data from 785583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns the data, or #NULL if not found 786583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */ 787583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonvoid* 788583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_get_data (DBusPendingCall *pending, 789583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_int32_t slot) 790583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{ 791583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington void *res; 792583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 793583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_return_val_if_fail (pending != NULL, NULL); 794583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 795222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_LOCK (pending->connection); 796583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington res = _dbus_data_slot_list_get (&slot_allocator, 797583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington &pending->slot_list, 798583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington slot); 799222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J CONNECTION_UNLOCK (pending->connection); 800583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 801583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return res; 802583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington} 803583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 804ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** @} */ 805ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 806ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington#ifdef DBUS_BUILD_TESTS 807ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 808a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 809a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @ingroup DBusPendingCallInternals 810a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Unit test for DBusPendingCall. 811a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 812a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @returns #TRUE on success. 813a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 814a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_bool_t 815a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington_dbus_pending_call_test (const char *test_data_dir) 816a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 817a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 818a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington return TRUE; 819a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 820a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 821