xref: /aosp_15_r20/external/curl/docs/libcurl/curl_multi_wait.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_wait
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_poll (3)
11*6236dae4SAndroid Build Coastguard WorkerProtocol:
12*6236dae4SAndroid Build Coastguard Worker  - All
13*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.28.0
14*6236dae4SAndroid Build Coastguard Worker---
15*6236dae4SAndroid Build Coastguard Worker
16*6236dae4SAndroid Build Coastguard Worker# NAME
17*6236dae4SAndroid Build Coastguard Worker
18*6236dae4SAndroid Build Coastguard Workercurl_multi_wait - poll on all easy handles in a multi handle
19*6236dae4SAndroid Build Coastguard Worker
20*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS
21*6236dae4SAndroid Build Coastguard Worker
22*6236dae4SAndroid Build Coastguard Worker~~~c
23*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h>
24*6236dae4SAndroid Build Coastguard Worker
25*6236dae4SAndroid Build Coastguard WorkerCURLMcode curl_multi_wait(CURLM *multi_handle,
26*6236dae4SAndroid Build Coastguard Worker                          struct curl_waitfd extra_fds[],
27*6236dae4SAndroid Build Coastguard Worker                          unsigned int extra_nfds,
28*6236dae4SAndroid Build Coastguard Worker                          int timeout_ms,
29*6236dae4SAndroid Build Coastguard Worker                          int *numfds);
30*6236dae4SAndroid Build Coastguard Worker~~~
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION
33*6236dae4SAndroid Build Coastguard Worker
34*6236dae4SAndroid Build Coastguard Workercurl_multi_wait(3) polls all file descriptors used by the curl easy
35*6236dae4SAndroid Build Coastguard Workerhandles contained in the given multi handle set. It blocks until activity is
36*6236dae4SAndroid Build Coastguard Workerdetected on at least one of the handles or *timeout_ms* has passed.
37*6236dae4SAndroid Build Coastguard WorkerAlternatively, if the multi handle has a pending internal timeout that has a
38*6236dae4SAndroid Build Coastguard Workershorter expiry time than *timeout_ms*, that shorter time is being used
39*6236dae4SAndroid Build Coastguard Workerinstead to make sure timeout accuracy is reasonably kept.
40*6236dae4SAndroid Build Coastguard Worker
41*6236dae4SAndroid Build Coastguard WorkerThe calling application may pass additional *curl_waitfd* structures which
42*6236dae4SAndroid Build Coastguard Workerare similar to *poll(2)*'s *pollfd* structure to be waited on in the
43*6236dae4SAndroid Build Coastguard Workersame call.
44*6236dae4SAndroid Build Coastguard Worker
45*6236dae4SAndroid Build Coastguard WorkerOn completion, if *numfds* is non-NULL, it gets populated with the total
46*6236dae4SAndroid Build Coastguard Workernumber of file descriptors on which interesting events occurred. This number
47*6236dae4SAndroid Build Coastguard Workercan include both libcurl internal descriptors as well as descriptors provided
48*6236dae4SAndroid Build Coastguard Workerin *extra_fds*.
49*6236dae4SAndroid Build Coastguard Worker
50*6236dae4SAndroid Build Coastguard WorkerIf no extra file descriptors are provided and libcurl has no file descriptor
51*6236dae4SAndroid Build Coastguard Workerto offer to wait for, this function returns immediately. (Consider using
52*6236dae4SAndroid Build Coastguard Workercurl_multi_poll(3) to avoid this behavior.)
53*6236dae4SAndroid Build Coastguard Worker
54*6236dae4SAndroid Build Coastguard WorkerThis function is encouraged to be used instead of select(3) when using the
55*6236dae4SAndroid Build Coastguard Workermulti interface to allow applications to easier circumvent the common problem
56*6236dae4SAndroid Build Coastguard Workerwith 1024 maximum file descriptors.
57*6236dae4SAndroid Build Coastguard Worker
58*6236dae4SAndroid Build Coastguard Worker# curl_waitfd
59*6236dae4SAndroid Build Coastguard Worker
60*6236dae4SAndroid Build Coastguard Worker~~~c
61*6236dae4SAndroid Build Coastguard Workerstruct curl_waitfd {
62*6236dae4SAndroid Build Coastguard Worker  curl_socket_t fd;
63*6236dae4SAndroid Build Coastguard Worker  short events;
64*6236dae4SAndroid Build Coastguard Worker  short revents;
65*6236dae4SAndroid Build Coastguard Worker};
66*6236dae4SAndroid Build Coastguard Worker~~~
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker## CURL_WAIT_POLLIN
69*6236dae4SAndroid Build Coastguard Worker
70*6236dae4SAndroid Build Coastguard WorkerBit flag to *curl_waitfd.events* indicating the socket should poll on read
71*6236dae4SAndroid Build Coastguard Workerevents such as new data received.
72*6236dae4SAndroid Build Coastguard Worker
73*6236dae4SAndroid Build Coastguard Worker## CURL_WAIT_POLLPRI
74*6236dae4SAndroid Build Coastguard Worker
75*6236dae4SAndroid Build Coastguard WorkerBit flag to *curl_waitfd.events* indicating the socket should poll on high
76*6236dae4SAndroid Build Coastguard Workerpriority read events such as out of band data.
77*6236dae4SAndroid Build Coastguard Worker
78*6236dae4SAndroid Build Coastguard Worker## CURL_WAIT_POLLOUT
79*6236dae4SAndroid Build Coastguard Worker
80*6236dae4SAndroid Build Coastguard WorkerBit flag to *curl_waitfd.events* indicating the socket should poll on
81*6236dae4SAndroid Build Coastguard Workerwrite events such as the socket being clear to write without blocking.
82*6236dae4SAndroid Build Coastguard Worker
83*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS%
84*6236dae4SAndroid Build Coastguard Worker
85*6236dae4SAndroid Build Coastguard Worker# EXAMPLE
86*6236dae4SAndroid Build Coastguard Worker
87*6236dae4SAndroid Build Coastguard Worker~~~c
88*6236dae4SAndroid Build Coastguard Workerint main(void)
89*6236dae4SAndroid Build Coastguard Worker{
90*6236dae4SAndroid Build Coastguard Worker  CURL *easy;
91*6236dae4SAndroid Build Coastguard Worker  CURLM *multi = curl_multi_init();
92*6236dae4SAndroid Build Coastguard Worker  int still_running;
93*6236dae4SAndroid Build Coastguard Worker
94*6236dae4SAndroid Build Coastguard Worker  /* add the individual easy handle */
95*6236dae4SAndroid Build Coastguard Worker  curl_multi_add_handle(multi, easy);
96*6236dae4SAndroid Build Coastguard Worker
97*6236dae4SAndroid Build Coastguard Worker  do {
98*6236dae4SAndroid Build Coastguard Worker    CURLMcode mc;
99*6236dae4SAndroid Build Coastguard Worker    int numfds;
100*6236dae4SAndroid Build Coastguard Worker
101*6236dae4SAndroid Build Coastguard Worker    mc = curl_multi_perform(multi, &still_running);
102*6236dae4SAndroid Build Coastguard Worker
103*6236dae4SAndroid Build Coastguard Worker    if(mc == CURLM_OK) {
104*6236dae4SAndroid Build Coastguard Worker      /* wait for activity, timeout or "nothing" */
105*6236dae4SAndroid Build Coastguard Worker      mc = curl_multi_wait(multi, NULL, 0, 1000, &numfds);
106*6236dae4SAndroid Build Coastguard Worker    }
107*6236dae4SAndroid Build Coastguard Worker
108*6236dae4SAndroid Build Coastguard Worker    if(mc != CURLM_OK) {
109*6236dae4SAndroid Build Coastguard Worker      fprintf(stderr, "curl_multi failed, code %d.\n", mc);
110*6236dae4SAndroid Build Coastguard Worker      break;
111*6236dae4SAndroid Build Coastguard Worker    }
112*6236dae4SAndroid Build Coastguard Worker
113*6236dae4SAndroid Build Coastguard Worker  } while(still_running);
114*6236dae4SAndroid Build Coastguard Worker
115*6236dae4SAndroid Build Coastguard Worker  curl_multi_remove_handle(multi, easy);
116*6236dae4SAndroid Build Coastguard Worker}
117*6236dae4SAndroid Build Coastguard Worker~~~
118*6236dae4SAndroid Build Coastguard Worker
119*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY%
120*6236dae4SAndroid Build Coastguard Worker
121*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE
122*6236dae4SAndroid Build Coastguard Worker
123*6236dae4SAndroid Build Coastguard WorkerCURLMcode type, general libcurl multi interface error code. See
124*6236dae4SAndroid Build Coastguard Workerlibcurl-errors(3)
125