00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef DBUS_SERVER_PROTECTED_H
00024 #define DBUS_SERVER_PROTECTED_H
00025
00026 #include <config.h>
00027 #include <dbus/dbus-internals.h>
00028 #include <dbus/dbus-threads-internal.h>
00029 #include <dbus/dbus-server.h>
00030 #include <dbus/dbus-timeout.h>
00031 #include <dbus/dbus-watch.h>
00032 #include <dbus/dbus-resources.h>
00033 #include <dbus/dbus-dataslot.h>
00034 #include <dbus/dbus-string.h>
00035
00036 DBUS_BEGIN_DECLS
00037
00038 typedef struct DBusServerVTable DBusServerVTable;
00039 typedef union DBusGUID DBusGUID;
00040
00044 union DBusGUID
00045 {
00046 dbus_uint32_t as_uint32s[4];
00047 unsigned char as_bytes[16];
00048 };
00049
00053 struct DBusServerVTable
00054 {
00055 void (* finalize) (DBusServer *server);
00058 void (* disconnect) (DBusServer *server);
00060 };
00061
00065 struct DBusServer
00066 {
00067 DBusAtomic refcount;
00068 const DBusServerVTable *vtable;
00069 DBusMutex *mutex;
00071 DBusGUID guid;
00073 DBusString guid_hex;
00075 DBusWatchList *watches;
00076 DBusTimeoutList *timeouts;
00078 char *address;
00080 int max_connections;
00082 DBusDataSlotList slot_list;
00084 DBusNewConnectionFunction new_connection_function;
00086 void *new_connection_data;
00088 DBusFreeFunction new_connection_free_data_function;
00093 char **auth_mechanisms;
00095 unsigned int disconnected : 1;
00097 #ifndef DBUS_DISABLE_CHECKS
00098 unsigned int have_server_lock : 1;
00099 #endif
00100 };
00101
00102 dbus_bool_t _dbus_server_init_base (DBusServer *server,
00103 const DBusServerVTable *vtable,
00104 const DBusString *address);
00105 void _dbus_server_finalize_base (DBusServer *server);
00106 dbus_bool_t _dbus_server_add_watch (DBusServer *server,
00107 DBusWatch *watch);
00108 void _dbus_server_remove_watch (DBusServer *server,
00109 DBusWatch *watch);
00110 void _dbus_server_toggle_watch (DBusServer *server,
00111 DBusWatch *watch,
00112 dbus_bool_t enabled);
00113 dbus_bool_t _dbus_server_add_timeout (DBusServer *server,
00114 DBusTimeout *timeout);
00115 void _dbus_server_remove_timeout (DBusServer *server,
00116 DBusTimeout *timeout);
00117 void _dbus_server_toggle_timeout (DBusServer *server,
00118 DBusTimeout *timeout,
00119 dbus_bool_t enabled);
00120
00121 void _dbus_server_ref_unlocked (DBusServer *server);
00122 void _dbus_server_unref_unlocked (DBusServer *server);
00123
00124 #ifdef DBUS_DISABLE_CHECKS
00125 #define TOOK_LOCK_CHECK(server)
00126 #define RELEASING_LOCK_CHECK(server)
00127 #define HAVE_LOCK_CHECK(server)
00128 #else
00129 #define TOOK_LOCK_CHECK(server) do { \
00130 _dbus_assert (!(server)->have_server_lock); \
00131 (server)->have_server_lock = TRUE; \
00132 } while (0)
00133 #define RELEASING_LOCK_CHECK(server) do { \
00134 _dbus_assert ((server)->have_server_lock); \
00135 (server)->have_server_lock = FALSE; \
00136 } while (0)
00137 #define HAVE_LOCK_CHECK(server) _dbus_assert ((server)->have_server_lock)
00138
00139 #endif
00140
00141 #define TRACE_LOCKS 0
00142
00143 #define SERVER_LOCK(server) do { \
00144 if (TRACE_LOCKS) { _dbus_verbose (" LOCK: %s\n", _DBUS_FUNCTION_NAME); } \
00145 _dbus_mutex_lock ((server)->mutex); \
00146 TOOK_LOCK_CHECK (server); \
00147 } while (0)
00148
00149 #define SERVER_UNLOCK(server) do { \
00150 if (TRACE_LOCKS) { _dbus_verbose (" UNLOCK: %s\n", _DBUS_FUNCTION_NAME); } \
00151 RELEASING_LOCK_CHECK (server); \
00152 _dbus_mutex_unlock ((server)->mutex); \
00153 } while (0)
00154
00155 DBUS_END_DECLS
00156
00157 #endif