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)
86 static 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
258 MHD_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.