summaryrefslogtreecommitdiff
path: root/src/lib/eina/eina_lock.h
blob: 5260ed9c4bc18e83ea44748dfe2dc6f6b91d7291 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/* EINA - EFL data type library
 * Copyright (C) 2011 Vincent Torri
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library;
 * if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef EINA_LOCK_H_
#define EINA_LOCK_H_

#include "eina_config.h"
#include "eina_types.h"
#include "eina_error.h"

/**
 * @addtogroup Eina_Tools_Group Tools
 *
 * @{
 */

/**
 * @defgroup Eina_Lock_Group Lock
 *
 * @{
 */

typedef enum
{
   EINA_LOCK_FAIL     = EINA_FALSE,
   EINA_LOCK_SUCCEED  = EINA_TRUE,
   EINA_LOCK_DEADLOCK
} Eina_Lock_Result;

#ifdef _WIN32_WCE
# include "eina_inline_lock_wince.x"
#elif defined(_WIN32)
# include "eina_inline_lock_win32.x"
#else
# include "eina_inline_lock_posix.x"
#endif

EAPI extern Eina_Error EINA_ERROR_NOT_MAIN_LOOP;

/** @relates static Eina_Bool eina_lock_new(_Eina_Lock *mutex) */
static inline Eina_Bool eina_lock_new(Eina_Lock *mutex);
/** @relates static void eina_lock_free(_Eina_Lock *mutex) */
static inline void eina_lock_free(Eina_Lock *mutex);
/** @relates static Eina_Lock_Result eina_lock_take(_Eina_Lock *mutex) */
static inline Eina_Lock_Result eina_lock_take(Eina_Lock *mutex);
/** @relates static Eina_Lock_Result eina_lock_take_try(_Eina_Lock *mutex) */
static inline Eina_Lock_Result eina_lock_take_try(Eina_Lock *mutex);
/** @relates static Eina_Lock_Result eina_lock_release(_Eina_Lock *mutex) */
static inline Eina_Lock_Result eina_lock_release(Eina_Lock *mutex);
/** @relates static void eina_lock_debug(const _Eina_Lock *mutex) */
static inline void eina_lock_debug(const Eina_Lock *mutex);

/** @relates static Eina_Bool eina_condition_new(_Eina_Condition *cond, _Eina_Lock *mutex) */
static inline Eina_Bool eina_condition_new(Eina_Condition *cond, Eina_Lock *mutex);
/** @relates static void eina_condition_free(_Eina_Condition *cond) */
static inline void eina_condition_free(Eina_Condition *cond);
/** @relates static Eina_Bool eina_condition_wait(_Eina_Condition *cond) */
static inline Eina_Bool eina_condition_wait(Eina_Condition *cond);
/** @relates static Eina_Bool eina_condition_timedwait(_Eina_Condition *cond, double t) */
static inline Eina_Bool eina_condition_timedwait(Eina_Condition *cond, double t);
/** @relates static Eina_Bool eina_condition_broadcast(_Eina_Condition *cond) */
static inline Eina_Bool eina_condition_broadcast(Eina_Condition *cond);
/** @relates static Eina_Bool eina_condition_signal(_Eina_Condition *cond) */
static inline Eina_Bool eina_condition_signal(Eina_Condition *cond);

/** @relates static Eina_Bool eina_rwlock_new(_Eina_RWLock *mutex) */
static inline Eina_Bool eina_rwlock_new(Eina_RWLock *mutex);
/** @relates static void eina_rwlock_free(_Eina_RWLock *mutex) */
static inline void eina_rwlock_free(Eina_RWLock *mutex);
/** @relates static Eina_Lock_Result eina_rwlock_take_read(_Eina_RWLock *mutex) */
static inline Eina_Lock_Result eina_rwlock_take_read(Eina_RWLock *mutex);
/** @relates static Eina_Lock_Result eina_rwlock_take_write(_Eina_RWLock *mutex) */
static inline Eina_Lock_Result eina_rwlock_take_write(Eina_RWLock *mutex);
/** @relates static Eina_Lock_Result eina_rwlock_release(_Eina_RWLock *mutex) */
static inline Eina_Lock_Result eina_rwlock_release(Eina_RWLock *mutex);

/** @relates static Eina_Bool eina_tls_new(pthread_key_t *key) */
static inline Eina_Bool eina_tls_new(Eina_TLS *key);
/** @relates static void eina_tls_free(pthread_key_t key) */
static inline void eina_tls_free(Eina_TLS key);
/** @relates static void eina_tls_get(pthread_key_t key) */
static inline void *eina_tls_get(Eina_TLS key);
/** @relates static Eina_Bool eina_tls_set(pthread_key_t key, const void *data) */
static inline Eina_Bool eina_tls_set(Eina_TLS key, const void *data);
/** @relates static Eina_Bool eina_semaphore_new(sem_t *sem, int count_init) */
static inline Eina_Bool eina_semaphore_new(Eina_Semaphore *sem, int count_init);
/** @relates static Eina_Bool eina_semaphore_free(sem_t *sem) */
static inline Eina_Bool eina_semaphore_free(Eina_Semaphore *sem);
/** @relates static Eina_Bool eina_semaphore_lock(sem_t *sem) */
static inline Eina_Bool eina_semaphore_lock(Eina_Semaphore *sem);
/** @relates static Eina_Bool eina_semaphore_release(sem_t *sem, int count_release) */
static inline Eina_Bool eina_semaphore_release(Eina_Semaphore *sem, int count_release);

#ifdef EINA_HAVE_DEBUG_THREADS
# define EINA_MAIN_LOOP_CHECK_RETURN_VAL(val)				\
  do {									\
    if (EINA_UNLIKELY(!eina_main_loop_is()))				\
      {									\
	eina_error_set(EINA_ERROR_NOT_MAIN_LOOP);			\
	EINA_LOG_ERR("You are calling %s from outside"			\
		     "of the main loop threads in %s at line %i",	\
		     __FUNCTION__,					\
		     __FILE__,						\
		     __LINE__);						\
	return val;							\
      }									\
  } while (0)
# define EINA_MAIN_LOOP_CHECK_RETURN					\
  do {									\
    if (EINA_UNLIKELY(!eina_main_loop_is()))				\
      {									\
	eina_error_set(EINA_ERROR_NOT_MAIN_LOOP);			\
	EINA_LOG_ERR("You are calling %s from outside"			\
		     "of the main loop threads in %s at line %i",	\
		     __FUNCTION__,					\
		     __FILE__,						\
		     __LINE__);						\
	return ;							\
      }									\
  } while (0)
#else
/**
 * @def EINA_MAIN_LOOP_CHECK_RETURN_VAL
 * @brief The macro doesn't do anything unless EINA_HAVE_DEBUG_THREADS is defined.
 * @param val The value to be returned.
 */
# define EINA_MAIN_LOOP_CHECK_RETURN_VAL(val)
/**
 * @def EINA_MAIN_LOOP_CHECK_RETURN
 * @brief The macro doesn't do anything unless EINA_HAVE_DEBUG_THREADS is defined.
 */
# define EINA_MAIN_LOOP_CHECK_RETURN
#endif

/**
 * @}
 */

/**
 * @}
 */

#endif