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.