D-Bus 1.4.0
|
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 <dbus/dbus-internals.h> 00027 #include <dbus/dbus-threads-internal.h> 00028 #include <dbus/dbus-server.h> 00029 #include <dbus/dbus-address.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 00043 struct DBusServerVTable 00044 { 00045 void (* finalize) (DBusServer *server); 00048 void (* disconnect) (DBusServer *server); 00050 }; 00051 00055 struct DBusServer 00056 { 00057 DBusAtomic refcount; 00058 const DBusServerVTable *vtable; 00059 DBusMutex *mutex; 00061 DBusGUID guid; 00063 DBusString guid_hex; 00065 DBusWatchList *watches; 00066 DBusTimeoutList *timeouts; 00068 char *address; 00070 int max_connections; 00072 DBusDataSlotList slot_list; 00074 DBusNewConnectionFunction new_connection_function; 00076 void *new_connection_data; 00078 DBusFreeFunction new_connection_free_data_function; 00083 char **auth_mechanisms; 00085 unsigned int disconnected : 1; 00087 #ifndef DBUS_DISABLE_CHECKS 00088 unsigned int have_server_lock : 1; 00089 #endif 00090 }; 00091 00092 dbus_bool_t _dbus_server_init_base (DBusServer *server, 00093 const DBusServerVTable *vtable, 00094 const DBusString *address); 00095 void _dbus_server_finalize_base (DBusServer *server); 00096 dbus_bool_t _dbus_server_add_watch (DBusServer *server, 00097 DBusWatch *watch); 00098 void _dbus_server_remove_watch (DBusServer *server, 00099 DBusWatch *watch); 00100 void _dbus_server_toggle_watch (DBusServer *server, 00101 DBusWatch *watch, 00102 dbus_bool_t enabled); 00103 dbus_bool_t _dbus_server_add_timeout (DBusServer *server, 00104 DBusTimeout *timeout); 00105 void _dbus_server_remove_timeout (DBusServer *server, 00106 DBusTimeout *timeout); 00107 void _dbus_server_toggle_timeout (DBusServer *server, 00108 DBusTimeout *timeout, 00109 dbus_bool_t enabled); 00110 00111 void _dbus_server_ref_unlocked (DBusServer *server); 00112 void _dbus_server_unref_unlocked (DBusServer *server); 00113 00114 typedef enum 00115 { 00116 DBUS_SERVER_LISTEN_NOT_HANDLED, 00117 DBUS_SERVER_LISTEN_OK, 00118 DBUS_SERVER_LISTEN_BAD_ADDRESS, 00119 DBUS_SERVER_LISTEN_DID_NOT_CONNECT 00120 } DBusServerListenResult; 00121 00122 DBusServerListenResult _dbus_server_listen_platform_specific (DBusAddressEntry *entry, 00123 DBusServer **server_p, 00124 DBusError *error); 00125 00126 #ifdef DBUS_DISABLE_CHECKS 00127 #define TOOK_LOCK_CHECK(server) 00128 #define RELEASING_LOCK_CHECK(server) 00129 #define HAVE_LOCK_CHECK(server) 00130 #else 00131 #define TOOK_LOCK_CHECK(server) do { \ 00132 _dbus_assert (!(server)->have_server_lock); \ 00133 (server)->have_server_lock = TRUE; \ 00134 } while (0) 00135 #define RELEASING_LOCK_CHECK(server) do { \ 00136 _dbus_assert ((server)->have_server_lock); \ 00137 (server)->have_server_lock = FALSE; \ 00138 } while (0) 00139 #define HAVE_LOCK_CHECK(server) _dbus_assert ((server)->have_server_lock) 00140 /* A "DO_NOT_HAVE_LOCK_CHECK" is impossible since we need the lock to check the flag */ 00141 #endif 00142 00143 #define TRACE_LOCKS 0 00144 00145 #define SERVER_LOCK(server) do { \ 00146 if (TRACE_LOCKS) { _dbus_verbose ("LOCK\n"); } \ 00147 _dbus_mutex_lock ((server)->mutex); \ 00148 TOOK_LOCK_CHECK (server); \ 00149 } while (0) 00150 00151 #define SERVER_UNLOCK(server) do { \ 00152 if (TRACE_LOCKS) { _dbus_verbose ("UNLOCK\n"); } \ 00153 RELEASING_LOCK_CHECK (server); \ 00154 _dbus_mutex_unlock ((server)->mutex); \ 00155 } while (0) 00156 00157 DBUS_END_DECLS 00158 00159 #endif /* DBUS_SERVER_PROTECTED_H */