GNU libmicrohttpd 0.9.77
Loading...
Searching...
No Matches
mhd_locks.h
Go to the documentation of this file.
1/*
2 This file is part of libmicrohttpd
3 Copyright (C) 2016 Karlson2k (Evgeny Grin)
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
19*/
20
37#ifndef MHD_LOCKS_H
38#define MHD_LOCKS_H 1
39
40#include "mhd_options.h"
41
42#ifdef MHD_USE_THREADS
43
44#if defined(MHD_USE_W32_THREADS)
45# define MHD_W32_MUTEX_ 1
46# ifndef WIN32_LEAN_AND_MEAN
47# define WIN32_LEAN_AND_MEAN 1
48# endif /* !WIN32_LEAN_AND_MEAN */
49# include <windows.h>
50#elif defined(HAVE_PTHREAD_H) && defined(MHD_USE_POSIX_THREADS)
51# define MHD_PTHREAD_MUTEX_ 1
52# undef HAVE_CONFIG_H
53# include <pthread.h>
54# define HAVE_CONFIG_H 1
55#else
56# error No base mutex API is available.
57#endif
58
59#ifndef MHD_PANIC
60# include <stdio.h>
61# ifdef HAVE_STDLIB_H
62# include <stdlib.h>
63# endif /* HAVE_STDLIB_H */
64/* Simple implementation of MHD_PANIC, to be used outside lib */
65# define MHD_PANIC(msg) do { fprintf (stderr, \
66 "Abnormal termination at %d line in file %s: %s\n", \
67 (int) __LINE__, __FILE__, msg); abort (); \
68} while (0)
69#endif /* ! MHD_PANIC */
70
71#if defined(MHD_PTHREAD_MUTEX_)
72typedef pthread_mutex_t MHD_mutex_;
73#elif defined(MHD_W32_MUTEX_)
74typedef CRITICAL_SECTION MHD_mutex_;
75#endif
76
77#if defined(MHD_PTHREAD_MUTEX_)
83#define MHD_mutex_init_(pmutex) (! (pthread_mutex_init ((pmutex), NULL)))
84#elif defined(MHD_W32_MUTEX_)
90#define MHD_mutex_init_(pmutex) (InitializeCriticalSectionAndSpinCount ( \
91 (pmutex),16))
92#endif
93
94#if defined(MHD_PTHREAD_MUTEX_)
95# if defined(PTHREAD_MUTEX_INITIALIZER)
99# define MHD_MUTEX_STATIC_DEFN_INIT_(m) static MHD_mutex_ m = \
100 PTHREAD_MUTEX_INITIALIZER
101# endif /* PTHREAD_MUTEX_INITIALIZER */
102#endif
103
104#if defined(MHD_PTHREAD_MUTEX_)
110#define MHD_mutex_destroy_(pmutex) (! (pthread_mutex_destroy ((pmutex))))
111#elif defined(MHD_W32_MUTEX_)
117#define MHD_mutex_destroy_(pmutex) (DeleteCriticalSection ((pmutex)), ! 0)
118#endif
119
125#define MHD_mutex_destroy_chk_(pmutex) do { \
126 if (! MHD_mutex_destroy_ (pmutex)) \
127 MHD_PANIC (_ ("Failed to destroy mutex.\n")); \
128} while (0)
129
130
131#if defined(MHD_PTHREAD_MUTEX_)
139#define MHD_mutex_lock_(pmutex) (! (pthread_mutex_lock ((pmutex))))
140#elif defined(MHD_W32_MUTEX_)
148#define MHD_mutex_lock_(pmutex) (EnterCriticalSection ((pmutex)), ! 0)
149#endif
150
158#define MHD_mutex_lock_chk_(pmutex) do { \
159 if (! MHD_mutex_lock_ (pmutex)) \
160 MHD_PANIC (_ ("Failed to lock mutex.\n")); \
161} while (0)
162
163#if defined(MHD_PTHREAD_MUTEX_)
169#define MHD_mutex_unlock_(pmutex) (! (pthread_mutex_unlock ((pmutex))))
170#elif defined(MHD_W32_MUTEX_)
176#define MHD_mutex_unlock_(pmutex) (LeaveCriticalSection ((pmutex)), ! 0)
177#endif
178
184#define MHD_mutex_unlock_chk_(pmutex) do { \
185 if (! MHD_mutex_unlock_ (pmutex)) \
186 MHD_PANIC (_ ("Failed to unlock mutex.\n")); \
187} while (0)
188
189#else /* ! MHD_USE_THREADS */
190
191#define MHD_mutex_init_(ignore) (! 0)
192#define MHD_mutex_destroy_(ignore) (! 0)
193#define MHD_mutex_destroy_chk_(ignore) (void)0
194#define MHD_mutex_lock_(ignore) (! 0)
195#define MHD_mutex_lock_chk_(ignore) (void)0
196#define MHD_mutex_unlock_(ignore) (! 0)
197#define MHD_mutex_unlock_chk_(ignore) (void)0
198
199#endif /* ! MHD_USE_THREADS */
200
201#endif /* ! MHD_LOCKS_H */
additional automatic macros for MHD_config.h