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) 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.