1*6236dae4SAndroid Build Coastguard Worker--- 2*6236dae4SAndroid Build Coastguard Workerc: Copyright (C) Daniel Stenberg, <[email protected]>, et al. 3*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl 4*6236dae4SAndroid Build Coastguard WorkerTitle: curl_multi_poll 5*6236dae4SAndroid Build Coastguard WorkerSection: 3 6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl 7*6236dae4SAndroid Build Coastguard WorkerSee-also: 8*6236dae4SAndroid Build Coastguard Worker - curl_multi_fdset (3) 9*6236dae4SAndroid Build Coastguard Worker - curl_multi_perform (3) 10*6236dae4SAndroid Build Coastguard Worker - curl_multi_wait (3) 11*6236dae4SAndroid Build Coastguard Worker - curl_multi_wakeup (3) 12*6236dae4SAndroid Build Coastguard WorkerProtocol: 13*6236dae4SAndroid Build Coastguard Worker - All 14*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.66.0 15*6236dae4SAndroid Build Coastguard Worker--- 16*6236dae4SAndroid Build Coastguard Worker 17*6236dae4SAndroid Build Coastguard Worker# NAME 18*6236dae4SAndroid Build Coastguard Worker 19*6236dae4SAndroid Build Coastguard Workercurl_multi_poll - poll on all easy handles in a multi handle 20*6236dae4SAndroid Build Coastguard Worker 21*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS 22*6236dae4SAndroid Build Coastguard Worker 23*6236dae4SAndroid Build Coastguard Worker~~~c 24*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h> 25*6236dae4SAndroid Build Coastguard Worker 26*6236dae4SAndroid Build Coastguard WorkerCURLMcode curl_multi_poll(CURLM *multi_handle, 27*6236dae4SAndroid Build Coastguard Worker struct curl_waitfd extra_fds[], 28*6236dae4SAndroid Build Coastguard Worker unsigned int extra_nfds, 29*6236dae4SAndroid Build Coastguard Worker int timeout_ms, 30*6236dae4SAndroid Build Coastguard Worker int *numfds); 31*6236dae4SAndroid Build Coastguard Worker~~~ 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard Workercurl_multi_poll(3) polls all file descriptors used by the curl easy 36*6236dae4SAndroid Build Coastguard Workerhandles contained in the given multi handle set. It blocks until activity is 37*6236dae4SAndroid Build Coastguard Workerdetected on at least one of the handles or *timeout_ms* has passed. 38*6236dae4SAndroid Build Coastguard WorkerAlternatively, if the multi handle has a pending internal timeout that has a 39*6236dae4SAndroid Build Coastguard Workershorter expiry time than *timeout_ms*, that shorter time is used instead 40*6236dae4SAndroid Build Coastguard Workerto make sure timeout accuracy is reasonably kept. 41*6236dae4SAndroid Build Coastguard Worker 42*6236dae4SAndroid Build Coastguard WorkerThe calling application may pass additional curl_waitfd structures which are 43*6236dae4SAndroid Build Coastguard Workersimilar to *poll(2)*'s *pollfd* structure to be waited on in the same 44*6236dae4SAndroid Build Coastguard Workercall. 45*6236dae4SAndroid Build Coastguard Worker 46*6236dae4SAndroid Build Coastguard WorkerOn completion, if *numfds* is non-NULL, it gets populated with the total 47*6236dae4SAndroid Build Coastguard Workernumber of file descriptors on which interesting events occurred. This number 48*6236dae4SAndroid Build Coastguard Workercan include both libcurl internal descriptors as well as descriptors provided 49*6236dae4SAndroid Build Coastguard Workerin *extra_fds*. 50*6236dae4SAndroid Build Coastguard Worker 51*6236dae4SAndroid Build Coastguard WorkerThe curl_multi_wakeup(3) function can be used from another thread to 52*6236dae4SAndroid Build Coastguard Workerwake up this function and return faster. This is one of the details 53*6236dae4SAndroid Build Coastguard Workerthat makes this function different than curl_multi_wait(3) which cannot 54*6236dae4SAndroid Build Coastguard Workerbe woken up this way. 55*6236dae4SAndroid Build Coastguard Worker 56*6236dae4SAndroid Build Coastguard WorkerIf no extra file descriptors are provided and libcurl has no file descriptor 57*6236dae4SAndroid Build Coastguard Workerto offer to wait for, this function instead waits during *timeout_ms* 58*6236dae4SAndroid Build Coastguard Workermilliseconds (or shorter if an internal timer indicates so). This is the other 59*6236dae4SAndroid Build Coastguard Workerdetail that makes this function different than curl_multi_wait(3). 60*6236dae4SAndroid Build Coastguard Worker 61*6236dae4SAndroid Build Coastguard WorkerThis function is encouraged to be used instead of select(3) when using the 62*6236dae4SAndroid Build Coastguard Workermulti interface to allow applications to easier circumvent the common problem 63*6236dae4SAndroid Build Coastguard Workerwith 1024 maximum file descriptors. 64*6236dae4SAndroid Build Coastguard Worker 65*6236dae4SAndroid Build Coastguard Worker# curl_waitfd 66*6236dae4SAndroid Build Coastguard Worker 67*6236dae4SAndroid Build Coastguard Worker~~~c 68*6236dae4SAndroid Build Coastguard Workerstruct curl_waitfd { 69*6236dae4SAndroid Build Coastguard Worker curl_socket_t fd; 70*6236dae4SAndroid Build Coastguard Worker short events; 71*6236dae4SAndroid Build Coastguard Worker short revents; 72*6236dae4SAndroid Build Coastguard Worker}; 73*6236dae4SAndroid Build Coastguard Worker~~~ 74*6236dae4SAndroid Build Coastguard Worker 75*6236dae4SAndroid Build Coastguard Worker## CURL_WAIT_POLLIN 76*6236dae4SAndroid Build Coastguard Worker 77*6236dae4SAndroid Build Coastguard WorkerBit flag to curl_waitfd.events indicating the socket should poll on read 78*6236dae4SAndroid Build Coastguard Workerevents such as new data received. 79*6236dae4SAndroid Build Coastguard Worker 80*6236dae4SAndroid Build Coastguard Worker## CURL_WAIT_POLLPRI 81*6236dae4SAndroid Build Coastguard Worker 82*6236dae4SAndroid Build Coastguard WorkerBit flag to curl_waitfd.events indicating the socket should poll on high 83*6236dae4SAndroid Build Coastguard Workerpriority read events such as out of band data. 84*6236dae4SAndroid Build Coastguard Worker 85*6236dae4SAndroid Build Coastguard Worker## CURL_WAIT_POLLOUT 86*6236dae4SAndroid Build Coastguard Worker 87*6236dae4SAndroid Build Coastguard WorkerBit flag to curl_waitfd.events indicating the socket should poll on write 88*6236dae4SAndroid Build Coastguard Workerevents such as the socket being clear to write without blocking. 89*6236dae4SAndroid Build Coastguard Worker 90*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS% 91*6236dae4SAndroid Build Coastguard Worker 92*6236dae4SAndroid Build Coastguard Worker# EXAMPLE 93*6236dae4SAndroid Build Coastguard Worker 94*6236dae4SAndroid Build Coastguard Worker~~~c 95*6236dae4SAndroid Build Coastguard Workerextern void handle_fd(int); 96*6236dae4SAndroid Build Coastguard Worker 97*6236dae4SAndroid Build Coastguard Workerint main(void) 98*6236dae4SAndroid Build Coastguard Worker{ 99*6236dae4SAndroid Build Coastguard Worker CURL *easy_handle; 100*6236dae4SAndroid Build Coastguard Worker CURLM *multi_handle; 101*6236dae4SAndroid Build Coastguard Worker int still_running = 0; 102*6236dae4SAndroid Build Coastguard Worker int myfd; /* this is our own file descriptor */ 103*6236dae4SAndroid Build Coastguard Worker 104*6236dae4SAndroid Build Coastguard Worker /* add the individual easy handle */ 105*6236dae4SAndroid Build Coastguard Worker curl_multi_add_handle(multi_handle, easy_handle); 106*6236dae4SAndroid Build Coastguard Worker 107*6236dae4SAndroid Build Coastguard Worker do { 108*6236dae4SAndroid Build Coastguard Worker CURLMcode mc; 109*6236dae4SAndroid Build Coastguard Worker int numfds; 110*6236dae4SAndroid Build Coastguard Worker 111*6236dae4SAndroid Build Coastguard Worker mc = curl_multi_perform(multi_handle, &still_running); 112*6236dae4SAndroid Build Coastguard Worker 113*6236dae4SAndroid Build Coastguard Worker if(mc == CURLM_OK) { 114*6236dae4SAndroid Build Coastguard Worker struct curl_waitfd myown; 115*6236dae4SAndroid Build Coastguard Worker myown.fd = myfd; 116*6236dae4SAndroid Build Coastguard Worker myown.events = CURL_WAIT_POLLIN; /* wait for input */ 117*6236dae4SAndroid Build Coastguard Worker myown.revents = 0; /* clear it */ 118*6236dae4SAndroid Build Coastguard Worker 119*6236dae4SAndroid Build Coastguard Worker /* wait for activity on curl's descriptors or on our own, 120*6236dae4SAndroid Build Coastguard Worker or timeout */ 121*6236dae4SAndroid Build Coastguard Worker mc = curl_multi_poll(multi_handle, &myown, 1, 1000, &numfds); 122*6236dae4SAndroid Build Coastguard Worker 123*6236dae4SAndroid Build Coastguard Worker if(myown.revents) { 124*6236dae4SAndroid Build Coastguard Worker /* did our descriptor receive an event? */ 125*6236dae4SAndroid Build Coastguard Worker handle_fd(myfd); 126*6236dae4SAndroid Build Coastguard Worker } 127*6236dae4SAndroid Build Coastguard Worker } 128*6236dae4SAndroid Build Coastguard Worker 129*6236dae4SAndroid Build Coastguard Worker if(mc != CURLM_OK) { 130*6236dae4SAndroid Build Coastguard Worker fprintf(stderr, "curl_multi failed, code %d.\n", mc); 131*6236dae4SAndroid Build Coastguard Worker break; 132*6236dae4SAndroid Build Coastguard Worker } 133*6236dae4SAndroid Build Coastguard Worker 134*6236dae4SAndroid Build Coastguard Worker } while(still_running); 135*6236dae4SAndroid Build Coastguard Worker 136*6236dae4SAndroid Build Coastguard Worker curl_multi_remove_handle(multi_handle, easy_handle); 137*6236dae4SAndroid Build Coastguard Worker} 138*6236dae4SAndroid Build Coastguard Worker~~~ 139*6236dae4SAndroid Build Coastguard Worker 140*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY% 141*6236dae4SAndroid Build Coastguard Worker 142*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE 143*6236dae4SAndroid Build Coastguard Worker 144*6236dae4SAndroid Build Coastguard WorkerCURLMcode type, general libcurl multi interface error code. See 145*6236dae4SAndroid Build Coastguard Workerlibcurl-errors(3) 146