45# define MHD_PANIC(msg) \
46 do { fprintf (stderr, \
47 "Abnormal termination at %d line in file %s: %s\n", \
48 (int) __LINE__, __FILE__, msg); abort (); \
52#if defined(_MHD_ITC_EVENTFD)
55#include <sys/eventfd.h>
68#define MHD_ITC_NUM_FDS_ (1)
75#define MHD_itc_init_(itc) \
76 (-1 != ((itc).fd = eventfd (0, EFD_CLOEXEC | EFD_NONBLOCK)))
81#define MHD_itc_last_strerror_() strerror (errno)
86static const uint64_t _MHD_itc_wr_data = 1;
94#define MHD_itc_activate_(itc, str) \
95 ((write ((itc).fd, (const void*) &_MHD_itc_wr_data, \
96 sizeof(_MHD_itc_wr_data)) > 0) || (EAGAIN == errno))
103#define MHD_itc_r_fd_(itc) ((itc).fd)
110#define MHD_itc_w_fd_(itc) ((itc).fd)
116#define MHD_itc_clear_(itc) \
118 (void) read ((itc).fd, (void*)&__b, sizeof(__b)); \
128#define MHD_itc_destroy_(itc) \
129 ((0 == close ((itc).fd)) || (EBADF != errno))
140#define MHD_ITC_IS_VALID_(itc) (-1 != ((itc).fd))
146#define MHD_itc_set_invalid_(itc) ((itc).fd = -1)
149#elif defined(_MHD_ITC_PIPE)
153#if defined(HAVE_PIPE2_FUNC) && defined(HAVE_FCNTL_H)
167#define MHD_ITC_NUM_FDS_ (2)
174#ifdef HAVE_PIPE2_FUNC
175# define MHD_itc_init_(itc) (! pipe2 ((itc).fd, O_CLOEXEC | O_NONBLOCK))
177# define MHD_itc_init_(itc) \
178 ( (! pipe ((itc).fd)) ? \
179 (MHD_itc_nonblocking_ ((itc)) ? \
181 (MHD_itc_destroy_ ((itc)), 0) ) \
188#define MHD_itc_last_strerror_() strerror (errno)
196#define MHD_itc_activate_(itc, str) \
197 ((write ((itc).fd[1], (const void*) (str), 1) > 0) || (EAGAIN == errno))
205#define MHD_itc_r_fd_(itc) ((itc).fd[0])
212#define MHD_itc_w_fd_(itc) ((itc).fd[1])
218#define MHD_itc_clear_(itc) do \
220 while (0 < read ((itc).fd[0], (void*) &__b, sizeof(__b))) \
221 {(void)0;} } while (0)
228#define MHD_itc_destroy_(itc) \
229 ( (0 == close ((itc).fd[0])) ? \
230 (0 == close ((itc).fd[1])) : \
231 ((close ((itc).fd[1])), 0) )
242#define MHD_ITC_IS_VALID_(itc) (-1 != (itc).fd[0])
248#define MHD_itc_set_invalid_(itc) ((itc).fd[0] = (itc).fd[1] = -1)
250#ifndef HAVE_PIPE2_FUNC
258MHD_itc_nonblocking_ (
struct MHD_itc_ itc);
263#elif defined(_MHD_ITC_SOCKETPAIR)
267#include "mhd_sockets.h"
273#define MHD_ITC_NUM_FDS_ (2)
280#ifdef MHD_socket_pair_nblk_
281# define MHD_itc_init_(itc) MHD_socket_pair_nblk_ ((itc).sk)
283# define MHD_itc_init_(itc) \
284 (MHD_socket_pair_ ((itc).sk) ? \
285 (MHD_itc_nonblocking_ ((itc)) ? \
287 (MHD_itc_destroy_ ((itc)), 0) ) \
294#define MHD_itc_last_strerror_() MHD_socket_last_strerr_ ()
302#define MHD_itc_activate_(itc, str) \
303 ((MHD_send_ ((itc).sk[1], (str), 1) > 0) || \
304 (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())))
311#define MHD_itc_r_fd_(itc) ((itc).sk[0])
318#define MHD_itc_w_fd_(itc) ((itc).sk[1])
324#define MHD_itc_clear_(itc) do \
326 while (0 < recv ((itc).sk[0], (void*) &__b, sizeof(__b), 0)) \
327 {(void)0;} } while (0)
334#define MHD_itc_destroy_(itc) \
335 (MHD_socket_close_ ((itc).sk[0]) ? \
336 MHD_socket_close_ ((itc).sk[1]) : \
337 ((void) MHD_socket_close_ ((itc).sk[1]), 0) )
349#define MHD_ITC_IS_VALID_(itc) (MHD_INVALID_SOCKET != (itc).sk[0])
355#define MHD_itc_set_invalid_(itc) \
356 ((itc).sk[0] = (itc).sk[1] = MHD_INVALID_SOCKET)
358#ifndef MHD_socket_pair_nblk_
359# define MHD_itc_nonblocking_(pip) \
360 (MHD_socket_nonblocking_ ((pip).sk[0]) && \
361 MHD_socket_nonblocking_ ((pip).sk[1]))
371#define MHD_itc_destroy_chk_(itc) do { \
372 if (! MHD_itc_destroy_ (itc)) \
373 MHD_PANIC (_ ("Failed to destroy ITC.\n")); \
385#define MHD_ITC_IS_INVALID_(itc) (! MHD_ITC_IS_VALID_ (itc))
Types for platform-independent inter-thread communication.