43 # define MHD_PANIC(msg) do { fprintf (stderr, \
44 "Abnormal termination at %d line in file %s: %s\n", \
45 (int)__LINE__, __FILE__, msg); abort();} while(0)
48 #if defined(_MHD_ITC_EVENTFD)
51 #include <sys/eventfd.h>
66 #define MHD_itc_init_(itc) (-1 != ((itc).fd = eventfd (0, EFD_CLOEXEC | EFD_NONBLOCK)))
71 #define MHD_itc_last_strerror_() strerror(errno)
76 static const uint64_t _MHD_itc_wr_data = 1;
84 #define MHD_itc_activate_(itc, str) \
85 ((write((itc).fd, (const void*)&_MHD_itc_wr_data, 8) > 0) || (EAGAIN == errno))
92 #define MHD_itc_r_fd_(itc) ((itc).fd)
99 #define MHD_itc_w_fd_(itc) ((itc).fd)
105 #define MHD_itc_clear_(itc) \
106 do { uint64_t __b; int __r; \
107 __r = read((itc).fd, &__b, sizeof(__b)); \
108 (void)__r; } while(0)
115 #define MHD_itc_destroy_(itc) ((0 != close ((itc).fd)) || (EBADF != errno))
126 #define MHD_ITC_IS_VALID_(itc) (-1 != ((itc).fd))
132 #define MHD_itc_set_invalid_(itc) ((itc).fd = -1)
135 #elif defined(_MHD_ITC_PIPE)
139 #if defined(HAVE_PIPE2_FUNC) && defined(HAVE_FCNTL_H)
155 #ifdef HAVE_PIPE2_FUNC
156 # define MHD_itc_init_(itc) (!pipe2((itc).fd, O_CLOEXEC | O_NONBLOCK))
158 # define MHD_itc_init_(itc) \
159 ( (!pipe((itc).fd)) ? \
160 (MHD_itc_nonblocking_((itc)) ? \
162 (MHD_itc_destroy_((itc)), 0) ) \
169 #define MHD_itc_last_strerror_() strerror(errno)
177 #define MHD_itc_activate_(itc, str) \
178 ((write((itc).fd[1], (const void*)(str), 1) > 0) || (EAGAIN == errno))
186 #define MHD_itc_r_fd_(itc) ((itc).fd[0])
193 #define MHD_itc_w_fd_(itc) ((itc).fd[1])
199 #define MHD_itc_clear_(itc) do \
201 while(0 < read((itc).fd[0], &__b, sizeof(__b))) \
209 #define MHD_itc_destroy_(itc) \
210 ( (0 == close ((itc).fd[0])) ? \
211 (0 == close ((itc).fd[1])) : \
212 ((close ((itc).fd[1])), 0) )
223 #define MHD_ITC_IS_VALID_(itc) (-1 != (itc).fd[0])
229 #define MHD_itc_set_invalid_(itc) ((itc).fd[0] = (itc).fd[1] = -1)
231 #ifndef HAVE_PIPE2_FUNC
239 MHD_itc_nonblocking_ (
struct MHD_itc_ itc);
243 #elif defined(_MHD_ITC_SOCKETPAIR)
247 #include "mhd_sockets.h"
255 #ifdef MHD_socket_pair_nblk_
256 # define MHD_itc_init_(itc) MHD_socket_pair_nblk_((itc).sk)
258 # define MHD_itc_init_(itc) \
259 (MHD_socket_pair_((itc).sk) ? \
260 (MHD_itc_nonblocking_((itc)) ? \
262 (MHD_itc_destroy_((itc)), 0) ) \
269 #define MHD_itc_last_strerror_() MHD_socket_last_strerr_()
277 #define MHD_itc_activate_(itc, str) \
278 ((MHD_send_((itc).sk[1], (str), 1) > 0) || \
279 (MHD_SCKT_ERR_IS_EAGAIN_(MHD_socket_get_error_())))
286 #define MHD_itc_r_fd_(itc) ((itc).sk[0])
293 #define MHD_itc_w_fd_(itc) ((itc).sk[1])
299 #define MHD_itc_clear_(itc) do \
301 while(0 < recv((itc).sk[0], \
311 #define MHD_itc_destroy_(itc) \
312 ( MHD_socket_close_((itc).sk[0]) ? \
313 MHD_socket_close_((itc).sk[1]) : \
314 ((void)MHD_socket_close_((itc).sk[1]), 0) )
326 #define MHD_ITC_IS_VALID_(itc) (MHD_INVALID_SOCKET != (itc).sk[0])
332 #define MHD_itc_set_invalid_(itc) ((itc).sk[0] = (itc).sk[1] = MHD_INVALID_SOCKET)
334 #ifndef MHD_socket_pair_nblk_
335 # define MHD_itc_nonblocking_(pip) (MHD_socket_nonblocking_((pip).sk[0]) && MHD_socket_nonblocking_((pip).sk[1]))
345 #define MHD_itc_destroy_chk_(itc) do { \
346 if (!MHD_itc_destroy_(itc)) \
347 MHD_PANIC(_("Failed to destroy ITC.\n")); \
359 #define MHD_ITC_IS_INVALID_(itc) (! MHD_ITC_IS_VALID_(itc))
Types for platform-independent inter-thread communication.