D-Bus 1.2.24
|
00001 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 00002 /* dbus-server-protected.h Used by subclasses of DBusServer object (internal to D-Bus implementation) 00003 * 00004 * Copyright (C) 2002 Red Hat Inc. 00005 * 00006 * Licensed under the Academic Free License version 2.1 00007 * 00008 * This program is free software; you can redistribute it and/or modify 00009 * it under the terms of the GNU General Public License as published by 00010 * the Free Software Foundation; either version 2 of the License, or 00011 * (at your option) any later version. 00012 * 00013 * This program is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 * GNU General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU General Public License 00019 * along with this program; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 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-address.h> 00031 #include <dbus/dbus-timeout.h> 00032 #include <dbus/dbus-watch.h> 00033 #include <dbus/dbus-resources.h> 00034 #include <dbus/dbus-dataslot.h> 00035 #include <dbus/dbus-string.h> 00036 00037 DBUS_BEGIN_DECLS 00038 00039 typedef struct DBusServerVTable DBusServerVTable; 00040 00044 struct DBusServerVTable 00045 { 00046 void (* finalize) (DBusServer *server); 00049 void (* disconnect) (DBusServer *server); 00051 }; 00052 00056 struct DBusServer 00057 { 00058 DBusAtomic refcount; 00059 const DBusServerVTable *vtable; 00060 DBusMutex *mutex; 00062 DBusGUID guid; 00064 DBusString guid_hex; 00066 DBusWatchList *watches; 00067 DBusTimeoutList *timeouts; 00069 char *address; 00071 int max_connections; 00073 DBusDataSlotList slot_list; 00075 DBusNewConnectionFunction new_connection_function; 00077 void *new_connection_data; 00079 DBusFreeFunction new_connection_free_data_function; 00084 char **auth_mechanisms; 00086 unsigned int disconnected : 1; 00088 #ifndef DBUS_DISABLE_CHECKS 00089 unsigned int have_server_lock : 1; 00090 #endif 00091 }; 00092 00093 dbus_bool_t _dbus_server_init_base (DBusServer *server, 00094 const DBusServerVTable *vtable, 00095 const DBusString *address); 00096 void _dbus_server_finalize_base (DBusServer *server); 00097 dbus_bool_t _dbus_server_add_watch (DBusServer *server, 00098 DBusWatch *watch); 00099 void _dbus_server_remove_watch (DBusServer *server, 00100 DBusWatch *watch); 00101 void _dbus_server_toggle_watch (DBusServer *server, 00102 DBusWatch *watch, 00103 dbus_bool_t enabled); 00104 dbus_bool_t _dbus_server_add_timeout (DBusServer *server, 00105 DBusTimeout *timeout); 00106 void _dbus_server_remove_timeout (DBusServer *server, 00107 DBusTimeout *timeout); 00108 void _dbus_server_toggle_timeout (DBusServer *server, 00109 DBusTimeout *timeout, 00110 dbus_bool_t enabled); 00111 00112 void _dbus_server_ref_unlocked (DBusServer *server); 00113 void _dbus_server_unref_unlocked (DBusServer *server); 00114 00115 typedef enum 00116 { 00117 DBUS_SERVER_LISTEN_NOT_HANDLED, 00118 DBUS_SERVER_LISTEN_OK, 00119 DBUS_SERVER_LISTEN_BAD_ADDRESS, 00120 DBUS_SERVER_LISTEN_DID_NOT_CONNECT 00121 } DBusServerListenResult; 00122 00123 DBusServerListenResult _dbus_server_listen_platform_specific (DBusAddressEntry *entry, 00124 DBusServer **server_p, 00125 DBusError *error); 00126 00127 #ifdef DBUS_DISABLE_CHECKS 00128 #define TOOK_LOCK_CHECK(server) 00129 #define RELEASING_LOCK_CHECK(server) 00130 #define HAVE_LOCK_CHECK(server) 00131 #else 00132 #define TOOK_LOCK_CHECK(server) do { \ 00133 _dbus_assert (!(server)->have_server_lock); \ 00134 (server)->have_server_lock = TRUE; \ 00135 } while (0) 00136 #define RELEASING_LOCK_CHECK(server) do { \ 00137 _dbus_assert ((server)->have_server_lock); \ 00138 (server)->have_server_lock = FALSE; \ 00139 } while (0) 00140 #define HAVE_LOCK_CHECK(server) _dbus_assert ((server)->have_server_lock) 00141 /* A "DO_NOT_HAVE_LOCK_CHECK" is impossible since we need the lock to check the flag */ 00142 #endif 00143 00144 #define TRACE_LOCKS 0 00145 00146 #define SERVER_LOCK(server) do { \ 00147 if (TRACE_LOCKS) { _dbus_verbose (" LOCK: %s\n", _DBUS_FUNCTION_NAME); } \ 00148 _dbus_mutex_lock ((server)->mutex); \ 00149 TOOK_LOCK_CHECK (server); \ 00150 } while (0) 00151 00152 #define SERVER_UNLOCK(server) do { \ 00153 if (TRACE_LOCKS) { _dbus_verbose (" UNLOCK: %s\n", _DBUS_FUNCTION_NAME); } \ 00154 RELEASING_LOCK_CHECK (server); \ 00155 _dbus_mutex_unlock ((server)->mutex); \ 00156 } while (0) 00157 00158 DBUS_END_DECLS 00159 00160 #endif /* DBUS_SERVER_PROTECTED_H */