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) 117 #define MHD_itc_destroy_(itc) ((0 == close ((itc).fd)) || (EBADF != errno)) 128 #define MHD_ITC_IS_VALID_(itc) (-1 != ((itc).fd)) 134 #define MHD_itc_set_invalid_(itc) ((itc).fd = -1) 137 #elif defined(_MHD_ITC_PIPE) 141 #if defined(HAVE_PIPE2_FUNC) && defined(HAVE_FCNTL_H) 157 #ifdef HAVE_PIPE2_FUNC 158 # define MHD_itc_init_(itc) (!pipe2((itc).fd, O_CLOEXEC | O_NONBLOCK)) 160 # define MHD_itc_init_(itc) \ 161 ( (!pipe((itc).fd)) ? \ 162 (MHD_itc_nonblocking_((itc)) ? \ 164 (MHD_itc_destroy_((itc)), 0) ) \ 171 #define MHD_itc_last_strerror_() strerror(errno) 179 #define MHD_itc_activate_(itc, str) \ 180 ((write((itc).fd[1], (const void*)(str), 1) > 0) || (EAGAIN == errno)) 188 #define MHD_itc_r_fd_(itc) ((itc).fd[0]) 195 #define MHD_itc_w_fd_(itc) ((itc).fd[1]) 201 #define MHD_itc_clear_(itc) do \ 203 while(0 < read((itc).fd[0], &__b, sizeof(__b))) \ 211 #define MHD_itc_destroy_(itc) \ 212 ( (0 == close ((itc).fd[0])) ? \ 213 (0 == close ((itc).fd[1])) : \ 214 ((close ((itc).fd[1])), 0) ) 225 #define MHD_ITC_IS_VALID_(itc) (-1 != (itc).fd[0]) 231 #define MHD_itc_set_invalid_(itc) ((itc).fd[0] = (itc).fd[1] = -1) 233 #ifndef HAVE_PIPE2_FUNC 241 MHD_itc_nonblocking_ (
struct MHD_itc_ itc);
245 #elif defined(_MHD_ITC_SOCKETPAIR) 249 #include "mhd_sockets.h" 257 #ifdef MHD_socket_pair_nblk_ 258 # define MHD_itc_init_(itc) MHD_socket_pair_nblk_((itc).sk) 260 # define MHD_itc_init_(itc) \ 261 (MHD_socket_pair_((itc).sk) ? \ 262 (MHD_itc_nonblocking_((itc)) ? \ 264 (MHD_itc_destroy_((itc)), 0) ) \ 271 #define MHD_itc_last_strerror_() MHD_socket_last_strerr_() 279 #define MHD_itc_activate_(itc, str) \ 280 ((MHD_send_((itc).sk[1], (str), 1) > 0) || \ 281 (MHD_SCKT_ERR_IS_EAGAIN_(MHD_socket_get_error_()))) 288 #define MHD_itc_r_fd_(itc) ((itc).sk[0]) 295 #define MHD_itc_w_fd_(itc) ((itc).sk[1]) 301 #define MHD_itc_clear_(itc) do \ 303 while(0 < recv((itc).sk[0], \ 313 #define MHD_itc_destroy_(itc) \ 314 ( MHD_socket_close_((itc).sk[0]) ? \ 315 MHD_socket_close_((itc).sk[1]) : \ 316 ((void)MHD_socket_close_((itc).sk[1]), 0) ) 328 #define MHD_ITC_IS_VALID_(itc) (MHD_INVALID_SOCKET != (itc).sk[0]) 334 #define MHD_itc_set_invalid_(itc) ((itc).sk[0] = (itc).sk[1] = MHD_INVALID_SOCKET) 336 #ifndef MHD_socket_pair_nblk_ 337 # define MHD_itc_nonblocking_(pip) (MHD_socket_nonblocking_((pip).sk[0]) && MHD_socket_nonblocking_((pip).sk[1])) 347 #define MHD_itc_destroy_chk_(itc) do { \ 348 if (!MHD_itc_destroy_(itc)) \ 349 MHD_PANIC(_("Failed to destroy ITC.\n")); \ 361 #define MHD_ITC_IS_INVALID_(itc) (! MHD_ITC_IS_VALID_(itc)) Types for platform-independent inter-thread communication.