1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 27652304bff969afb3969603149bb385efe861fe8John (J/* dbus-internals.h random utility stuff (internal to D-Bus implementation) 3954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * 4e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. 5954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * 643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 7954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * 8954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * This program is free software; you can redistribute it and/or modify 9954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * it under the terms of the GNU General Public License as published by 10954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 11954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * (at your option) any later version. 12954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * 13954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * This program is distributed in the hope that it will be useful, 14954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 15954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * GNU General Public License for more details. 17954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * 18954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * You should have received a copy of the GNU General Public License 19954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * along with this program; if not, write to the Free Software 205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * 22954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */ 23041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#ifdef DBUS_INSIDE_DBUS_H 24041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#error "You can't include dbus-internals.h in the public header dbus.h" 25041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#endif 26954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 27954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#ifndef DBUS_INTERNALS_H 28954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#define DBUS_INTERNALS_H 29954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 30954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include <dbus/dbus-memory.h> 31954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include <dbus/dbus-types.h> 32041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include <dbus/dbus-errors.h> 33d4b870e7f91b7018524f7b85dc00b90cc64453bfHavoc Pennington#include <dbus/dbus-sysdeps.h> 347ce7502e1ae23766ba40105327de787c2d1cef9dHavoc Pennington#include <dbus/dbus-threads-internal.h> 35954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 36a9ff341aa66588c12275529ee2d16843b493cb4fOlivier AndrieuDBUS_BEGIN_DECLS 37954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 382f48b5a5a19f171fc42ff91c1b259351640fcaccRalf Habacker#ifndef DBUS_SESSION_BUS_DEFAULT_ADDRESS 39f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira#define DBUS_SESSION_BUS_DEFAULT_ADDRESS "autolaunch:" 402f48b5a5a19f171fc42ff91c1b259351640fcaccRalf Habacker#endif 41f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira 42eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Penningtonvoid _dbus_warn (const char *format, 43eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington ...) _DBUS_GNUC_PRINTF (1, 2); 446ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington 45f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtonvoid _dbus_warn_check_failed (const char *format, 46f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington ...) _DBUS_GNUC_PRINTF (1, 2); 47f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington 48f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington 49c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) 50c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _DBUS_FUNCTION_NAME __func__ 51b88d6bad1c5c0cd44c9c0a0c5a4f2ee7ba48d908Ralf Habacker#elif defined(__GNUC__) || defined(_MSC_VER) 52c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _DBUS_FUNCTION_NAME __FUNCTION__ 53c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#else 54c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _DBUS_FUNCTION_NAME "unknown function" 55c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#endif 56c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 5775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington/* 5875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * (code from GLib) 5975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * 6075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * The _DBUS_LIKELY and _DBUS_UNLIKELY macros let the programmer give hints to 6175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * the compiler about the expected result of an expression. Some compilers 6275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * can use this information for optimizations. 6375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * 6475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * The _DBUS_BOOLEAN_EXPR macro is intended to trigger a gcc warning when 6575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * putting assignments in the macro arg 6675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington */ 6775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) 6875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_BOOLEAN_EXPR(expr) \ 6975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington __extension__ ({ \ 7075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington int _dbus_boolean_var_; \ 7175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington if (expr) \ 7275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington _dbus_boolean_var_ = 1; \ 7375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington else \ 7475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington _dbus_boolean_var_ = 0; \ 7575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington _dbus_boolean_var_; \ 7675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington}) 7775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_LIKELY(expr) (__builtin_expect (_DBUS_BOOLEAN_EXPR(expr), 1)) 7875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_UNLIKELY(expr) (__builtin_expect (_DBUS_BOOLEAN_EXPR(expr), 0)) 7975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#else 8075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_LIKELY(expr) (expr) 8175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_UNLIKELY(expr) (expr) 8275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#endif 8375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington 846ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#ifdef DBUS_ENABLE_VERBOSE_MODE 857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington 867f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker/* 877f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker at least gnu cc and msvc compiler are known to 887f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker have support for variable macro argument lists 897f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker add other compilers is required 907f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker*/ 917f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#if defined(__GNUC__) || defined(_MSC_VER) 927f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#define DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS 937f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#endif 947f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker 957f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#ifdef DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS 967f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habackervoid _dbus_verbose_real (const char *file, const int line, const char *function, 977f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker const char *format,...) _DBUS_GNUC_PRINTF (4, 5); 987f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker# define _dbus_verbose(fmt,...) _dbus_verbose_real( __FILE__,__LINE__,__FUNCTION__,fmt, ## __VA_ARGS__) 997f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#else 1007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonvoid _dbus_verbose_real (const char *format, 1017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington ...) _DBUS_GNUC_PRINTF (1, 2); 1027f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker# define _dbus_verbose _dbus_verbose_real 1037f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#endif 1047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonvoid _dbus_verbose_reset_real (void); 10505d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (Jdbus_bool_t _dbus_is_verbose_real (void); 1067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington 107eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington# define _dbus_verbose_reset _dbus_verbose_reset_real 10805d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J# define _dbus_is_verbose _dbus_is_verbose_real 1096ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#else 1106ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington# ifdef HAVE_ISO_VARARGS 1116ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington# define _dbus_verbose(...) 1126ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington# elif defined (HAVE_GNUC_VARARGS) 1136ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington# define _dbus_verbose(format...) 1146ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington# else 11579aafc193176253454dd455a4cfc45a1a2e36c00John (Jstatic void _dbus_verbose(const char * x,...) {;} 1166ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington# endif 117eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington# define _dbus_verbose_reset() 11805d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J# define _dbus_is_verbose() FALSE 1196ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#endif /* !DBUS_ENABLE_VERBOSE_MODE */ 120041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 121041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonconst char* _dbus_strerror (int error_number); 122041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 1236ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#ifdef DBUS_DISABLE_ASSERT 1246ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#define _dbus_assert(condition) 1256ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#else 1262f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Penningtonvoid _dbus_real_assert (dbus_bool_t condition, 1272f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington const char *condition_text, 1282f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington const char *file, 129aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington int line, 130aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington const char *func); 131954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#define _dbus_assert(condition) \ 132aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington _dbus_real_assert ((condition) != 0, #condition, __FILE__, __LINE__, _DBUS_FUNCTION_NAME) 1336ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#endif /* !DBUS_DISABLE_ASSERT */ 134954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 1356ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#ifdef DBUS_DISABLE_ASSERT 1366ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#define _dbus_assert_not_reached(explanation) 1376ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#else 1382f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Penningtonvoid _dbus_real_assert_not_reached (const char *explanation, 1392f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington const char *file, 140bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington int line) _DBUS_GNUC_NORETURN; 141954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#define _dbus_assert_not_reached(explanation) \ 1422f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington _dbus_real_assert_not_reached (explanation, __FILE__, __LINE__) 1436ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#endif /* !DBUS_DISABLE_ASSERT */ 144954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 145c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#ifdef DBUS_DISABLE_CHECKS 146c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _dbus_return_if_fail(condition) 147c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _dbus_return_val_if_fail(condition, val) 148c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#else 149fdcd044555dc51cd52e8e3e8626acd45489d4eb6Romain Pokrzywka 150e183399391bb1740c2013b44b89c05cbad3796eaRalf Habackerextern const char *_dbus_return_if_fail_warning_format; 151c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 152f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington#define _dbus_return_if_fail(condition) do { \ 153f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington _dbus_assert ((*(const char*)_DBUS_FUNCTION_NAME) != '_'); \ 154f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington if (!(condition)) { \ 155f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington _dbus_warn_check_failed (_dbus_return_if_fail_warning_format, \ 156f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington _DBUS_FUNCTION_NAME, #condition, __FILE__, __LINE__); \ 157f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington return; \ 158c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington } } while (0) 159c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 160d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington#define _dbus_return_val_if_fail(condition, val) do { \ 161aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington _dbus_assert ((*(const char*)_DBUS_FUNCTION_NAME) != '_'); \ 162d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington if (!(condition)) { \ 163f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington _dbus_warn_check_failed (_dbus_return_if_fail_warning_format, \ 164f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington _DBUS_FUNCTION_NAME, #condition, __FILE__, __LINE__); \ 165d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington return (val); \ 166c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington } } while (0) 167c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 168c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#endif /* !DBUS_DISABLE_ASSERT */ 169c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 170d4b870e7f91b7018524f7b85dc00b90cc64453bfHavoc Pennington#define _DBUS_N_ELEMENTS(array) ((int) (sizeof ((array)) / sizeof ((array)[0]))) 171954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 172c096c5cb9ac636626e158ed327b3d9279c4de347Fridrich Å trba#define _DBUS_POINTER_TO_INT(pointer) ((intptr_t)(pointer)) 173c096c5cb9ac636626e158ed327b3d9279c4de347Fridrich Å trba#define _DBUS_INT_TO_POINTER(integer) ((void*)((intptr_t)(integer))) 174954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 175041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#define _DBUS_ZERO(object) (memset (&(object), '\0', sizeof ((object)))) 176041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 177c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#define _DBUS_STRUCT_OFFSET(struct_type, member) \ 178c096c5cb9ac636626e158ed327b3d9279c4de347Fridrich Å trba ((intptr_t) ((unsigned char*) &((struct_type*) 0)->member)) 179c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington 180d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#ifdef DBUS_DISABLE_CHECKS 181d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/* this is an assert and not an error, but in the typical --disable-checks case (you're trying 182d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * to really minimize code size), disabling these assertions makes sense. 183d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */ 184d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#define _DBUS_ASSERT_ERROR_IS_SET(error) 185d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#define _DBUS_ASSERT_ERROR_IS_CLEAR(error) 1860d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu#define _DBUS_ASSERT_ERROR_CONTENT_IS_SET(error) 1870d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu#define _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR(error) 188d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#else 189ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington#define _DBUS_ASSERT_ERROR_IS_SET(error) _dbus_assert ((error) == NULL || dbus_error_is_set ((error))) 190ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington#define _DBUS_ASSERT_ERROR_IS_CLEAR(error) _dbus_assert ((error) == NULL || !dbus_error_is_set ((error))) 1910d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu#define _DBUS_ASSERT_ERROR_CONTENT_IS_SET(error) _dbus_assert (dbus_error_is_set ((error))) 1920d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu#define _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR(error) _dbus_assert (!dbus_error_is_set ((error))) 193d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#endif 19429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 195c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _dbus_return_if_error_is_set(error) _dbus_return_if_fail ((error) == NULL || !dbus_error_is_set ((error))) 196c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _dbus_return_val_if_error_is_set(error, val) _dbus_return_val_if_fail ((error) == NULL || !dbus_error_is_set ((error)), (val)) 197c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 1981b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/* This alignment thing is from ORBit2 */ 1991b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/* Align a value upward to a boundary, expressed as a number of bytes. 2001b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * E.g. align to an 8-byte boundary with argument of 8. 2011b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 2021b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 2031b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/* 2041b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * (this + boundary - 1) 2051b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * & 2061b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * ~(boundary - 1) 2071b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 2081b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 2091b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson#define _DBUS_ALIGN_VALUE(this, boundary) \ 210c096c5cb9ac636626e158ed327b3d9279c4de347Fridrich Å trba (( ((uintptr_t)(this)) + (((uintptr_t)(boundary)) -1)) & (~(((uintptr_t)(boundary))-1))) 2111b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 2121b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson#define _DBUS_ALIGN_ADDRESS(this, boundary) \ 2131b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson ((void*)_DBUS_ALIGN_VALUE(this, boundary)) 2141b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 2159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21644ed933284589134603913b05f55ca55e8c5a566Havoc Penningtonchar* _dbus_strdup (const char *str); 217cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Penningtonvoid* _dbus_memdup (const void *mem, 218cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington size_t n_bytes); 21944ed933284589134603913b05f55ca55e8c5a566Havoc Penningtondbus_bool_t _dbus_string_array_contains (const char **array, 22044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington const char *str); 22144ed933284589134603913b05f55ca55e8c5a566Havoc Penningtonchar** _dbus_dup_string_array (const char **array); 22244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 2233ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT16_MIN ((dbus_int16_t) 0x8000) 2243ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT16_MAX ((dbus_int16_t) 0x7fff) 2253ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_UINT16_MAX ((dbus_uint16_t)0xffff) 2263ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT32_MIN ((dbus_int32_t) 0x80000000) 2273ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT32_MAX ((dbus_int32_t) 0x7fffffff) 2283ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_UINT32_MAX ((dbus_uint32_t)0xffffffff) 2293ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/* using 32-bit here is sort of bogus */ 2303ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT_MIN _DBUS_INT32_MIN 2313ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT_MAX _DBUS_INT32_MAX 2323ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_UINT_MAX _DBUS_UINT32_MAX 233b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington#ifdef DBUS_HAVE_INT64 2343ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT64_MAX DBUS_INT64_CONSTANT (0x7fffffffffffffff) 235b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington#define _DBUS_UINT64_MAX DBUS_UINT64_CONSTANT (0xffffffffffffffff) 236b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington#endif 237ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington#define _DBUS_ONE_KILOBYTE 1024 238ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington#define _DBUS_ONE_MEGABYTE 1024 * _DBUS_ONE_KILOBYTE 2397265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington#define _DBUS_ONE_HOUR_IN_MILLISECONDS (1000 * 60 * 60) 2407265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington#define _DBUS_USEC_PER_SECOND (1000000) 241041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 242c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#undef MAX 243c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#define MAX(a, b) (((a) > (b)) ? (a) : (b)) 244c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington 245c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#undef MIN 246c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#define MIN(a, b) (((a) < (b)) ? (a) : (b)) 247c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington 248c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#undef ABS 249c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#define ABS(a) (((a) < 0) ? -(a) : (a)) 250c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington 251f3228b477df95ba247c90cc54189ce6d62059251Havoc Pennington#define _DBUS_ISASCII(c) ((c) != '\0' && (((c) & ~0x7f) == 0)) 252f3228b477df95ba247c90cc54189ce6d62059251Havoc Pennington 253041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtontypedef void (* DBusForeachFunction) (void *element, 254041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington void *data); 255041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 256041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_bool_t _dbus_set_fd_nonblocking (int fd, 257ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington DBusError *error); 258576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington 259b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Penningtonvoid _dbus_verbose_bytes (const unsigned char *data, 2609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int len, 2619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int offset); 262b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Penningtonvoid _dbus_verbose_bytes_of_string (const DBusString *str, 263b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Pennington int start, 264b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Pennington int len); 265b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Pennington 266daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlinconst char* _dbus_header_field_to_string (int header_field); 267ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 268e183399391bb1740c2013b44b89c05cbad3796eaRalf Habackerextern const char *_dbus_no_memory_message; 269fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu#define _DBUS_SET_OOM(error) dbus_set_error_const ((error), DBUS_ERROR_NO_MEMORY, _dbus_no_memory_message) 27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 27107a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#ifdef DBUS_BUILD_TESTS 27207a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington/* Memory debugging */ 273c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonvoid _dbus_set_fail_alloc_counter (int until_next_fail); 274c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonint _dbus_get_fail_alloc_counter (void); 275bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonvoid _dbus_set_fail_alloc_failures (int failures_per_failure); 276bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonint _dbus_get_fail_alloc_failures (void); 277c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtondbus_bool_t _dbus_decrement_fail_alloc_counter (void); 278c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtondbus_bool_t _dbus_disable_mem_pools (void); 279c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonint _dbus_get_malloc_blocks_outstanding (void); 280bf99381351b802fb3348a24037898222aae631e2Havoc Pennington 281bf99381351b802fb3348a24037898222aae631e2Havoc Penningtontypedef dbus_bool_t (* DBusTestMemoryFunction) (void *data); 282bf99381351b802fb3348a24037898222aae631e2Havoc Penningtondbus_bool_t _dbus_test_oom_handling (const char *description, 283bf99381351b802fb3348a24037898222aae631e2Havoc Pennington DBusTestMemoryFunction func, 284bf99381351b802fb3348a24037898222aae631e2Havoc Pennington void *data); 28507a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#else 28607a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#define _dbus_set_fail_alloc_counter(n) 28707a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#define _dbus_get_fail_alloc_counter _DBUS_INT_MAX 288ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 289ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington/* These are constant expressions so that blocks 290ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington * they protect should be optimized away 291ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington */ 292c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _dbus_decrement_fail_alloc_counter() (FALSE) 293c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _dbus_disable_mem_pools() (FALSE) 294c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _dbus_get_malloc_blocks_outstanding (0) 29507a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#endif /* !DBUS_BUILD_TESTS */ 29607a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington 297c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtontypedef void (* DBusShutdownFunction) (void *data); 298c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtondbus_bool_t _dbus_register_shutdown_func (DBusShutdownFunction function, 299c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington void *data); 300c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 301c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonextern int _dbus_current_generation; 302c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 303c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington/* Thread initializers */ 304c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _DBUS_LOCK_NAME(name) _dbus_lock_##name 305c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _DBUS_DECLARE_GLOBAL_LOCK(name) extern DBusMutex *_dbus_lock_##name 306c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _DBUS_DEFINE_GLOBAL_LOCK(name) DBusMutex *_dbus_lock_##name 307cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington#define _DBUS_LOCK(name) _dbus_mutex_lock (_dbus_lock_##name) 308cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington#define _DBUS_UNLOCK(name) _dbus_mutex_unlock (_dbus_lock_##name) 309c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington 310eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington/* 1-5 */ 311c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (list); 312c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (connection_slots); 313583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (pending_call_slots); 314c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (server_slots); 315958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (message_slots); 316eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington/* 5-10 */ 317c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (bus); 318eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (bus_datas); 319bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (shutdown_funcs); 32088cd5da3c0ec86fed29942b062c2f7bf0f8fda44Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (system_users); 321a58180de0e720f7fca46a5af69a7b27b5e102a1dHavoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (message_cache); 3229293e823767daee79386cc797510808f4eed01a3Lennart Poettering/* 10-14 */ 323ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (shared_connections); 3247cd52919443f190fa1601a3d1bac5c8ce8d9ecc1John (J_DBUS_DECLARE_GLOBAL_LOCK (win_fds); 3257cd52919443f190fa1601a3d1bac5c8ce8d9ecc1John (J_DBUS_DECLARE_GLOBAL_LOCK (sid_atom_cache); 326d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (machine_uuid); 3279293e823767daee79386cc797510808f4eed01a3Lennart Poettering 3289293e823767daee79386cc797510808f4eed01a3Lennart Poettering#if !DBUS_USE_SYNC 3299293e823767daee79386cc797510808f4eed01a3Lennart Poettering_DBUS_DECLARE_GLOBAL_LOCK (atomic); 330eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington#define _DBUS_N_GLOBAL_LOCKS (15) 3319293e823767daee79386cc797510808f4eed01a3Lennart Poettering#else 3329293e823767daee79386cc797510808f4eed01a3Lennart Poettering#define _DBUS_N_GLOBAL_LOCKS (14) 3339293e823767daee79386cc797510808f4eed01a3Lennart Poettering#endif 334c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington 335bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_bool_t _dbus_threads_init_debug (void); 336bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington 337aa4f823781185fb18187714798795d7e4b0c9b65Havoc Penningtondbus_bool_t _dbus_address_append_escaped (DBusString *escaped, 338aa4f823781185fb18187714798795d7e4b0c9b65Havoc Pennington const DBusString *unescaped); 339aa4f823781185fb18187714798795d7e4b0c9b65Havoc Pennington 340fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Penningtonvoid _dbus_set_bad_address (DBusError *error, 341fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington const char *address_problem_type, 342fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington const char *address_problem_field, 343fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington const char *address_problem_other); 344fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington 345d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#define DBUS_UUID_LENGTH_BYTES 16 346dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington#define DBUS_UUID_LENGTH_WORDS (DBUS_UUID_LENGTH_BYTES / 4) 347dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington#define DBUS_UUID_LENGTH_HEX (DBUS_UUID_LENGTH_BYTES * 2) 348d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 349d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/** 350d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * A globally unique ID ; we have one for each DBusServer, and also one for each 351d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * machine with libdbus installed on it. 352d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */ 353d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonunion DBusGUID 354d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{ 355dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington dbus_uint32_t as_uint32s[DBUS_UUID_LENGTH_WORDS]; /**< guid as four uint32 values */ 35615ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington char as_bytes[DBUS_UUID_LENGTH_BYTES]; /**< guid as 16 single-byte values */ 357d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}; 358d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 359d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonvoid _dbus_generate_uuid (DBusGUID *uuid); 360d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t _dbus_uuid_encode (const DBusGUID *uuid, 361d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington DBusString *encoded); 362d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t _dbus_read_uuid_file (const DBusString *filename, 363d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington DBusGUID *uuid, 364d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_bool_t create_if_not_found, 365d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington DBusError *error); 366d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 367d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t _dbus_get_local_machine_uuid_encoded (DBusString *uuid_str); 368fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington 369a9ff341aa66588c12275529ee2d16843b493cb4fOlivier AndrieuDBUS_END_DECLS 370954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington 371954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#endif /* DBUS_INTERNALS_H */ 372