xref: /aosp_15_r20/external/curl/docs/libcurl/curl_multi_poll.md (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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