]>
Commit | Line | Data |
---|---|---|
191fac58 | 1 | --- curl-7.21.3/include/curl/multi.h~ 2010-09-18 23:00:21.000000000 +0200 |
2 | +++ curl-7.21.3/include/curl/multi.h 2010-12-16 09:17:03.909735667 +0100 | |
3 | @@ -132,6 +132,17 @@ | |
4 | fd_set *write_fd_set, | |
5 | fd_set *exc_fd_set, | |
2e570606 | 6 | int *max_fd); |
191fac58 | 7 | + /* Name: curl_multi_select() |
2e570606 ER |
8 | + * |
9 | + * Desc: Calls select() or poll() internally so app can call | |
191fac58 | 10 | + * curl_multi_perform() as soon as one of them is ready. This is to |
11 | + * fix FD_SETSIZE problem curl_multi_fdset() has. | |
2e570606 ER |
12 | + * |
13 | + * Returns: CURLMcode type, general multi error code. | |
14 | + */ | |
15 | +CURL_EXTERN CURLMcode curl_multi_select(CURLM *multi_handle, | |
191fac58 | 16 | + int timeout_ms, |
17 | + int *ret); | |
18 | ||
19 | /* | |
2e570606 | 20 | * Name: curl_multi_perform() |
191fac58 | 21 | --- curl-7.21.3/lib/multi.c~ 2010-12-15 10:04:43.000000000 +0100 |
22 | +++ curl-7.21.3/lib/multi.c 2010-12-16 09:20:29.652705567 +0100 | |
2e570606 | 23 | @@ -42,6 +42,7 @@ |
2e570606 ER |
24 | #include "timeval.h" |
25 | #include "http.h" | |
191fac58 | 26 | #include "warnless.h" |
2e570606 ER |
27 | +#include "select.h" |
28 | ||
29 | #define _MPRINTF_REPLACE /* use our functions only */ | |
30 | #include <curl/mprintf.h> | |
191fac58 | 31 | @@ -930,6 +931,80 @@ |
2e570606 ER |
32 | return CURLM_OK; |
33 | } | |
34 | ||
35 | +CURLMcode curl_multi_select(CURLM *multi_handle, int timeout_ms, int *ret) { | |
36 | + struct Curl_multi *multi=(struct Curl_multi *)multi_handle; | |
37 | + struct Curl_one_easy *easy; | |
38 | + curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE]; | |
39 | + int bitmap; | |
40 | + int i; | |
41 | + unsigned int nfds = 0; | |
42 | + struct pollfd *ufds; | |
43 | + int nret = -1; | |
44 | + | |
45 | + if(!GOOD_MULTI_HANDLE(multi)) | |
46 | + return CURLM_BAD_HANDLE; | |
47 | + | |
48 | + easy=multi->easy.next; | |
49 | + while(easy != &multi->easy) { | |
50 | + bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE); | |
51 | + | |
52 | + for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) { | |
53 | + curl_socket_t s = CURL_SOCKET_BAD; | |
54 | + | |
55 | + if(bitmap & GETSOCK_READSOCK(i)) { | |
56 | + ++nfds; | |
57 | + s = sockbunch[i]; | |
58 | + } | |
59 | + if(bitmap & GETSOCK_WRITESOCK(i)) { | |
60 | + ++nfds; | |
61 | + s = sockbunch[i]; | |
62 | + } | |
63 | + if(s == CURL_SOCKET_BAD) { | |
64 | + break; | |
65 | + } | |
66 | + } | |
67 | + | |
68 | + easy = easy->next; /* check next handle */ | |
69 | + } | |
70 | + | |
71 | + ufds = (struct pollfd *)malloc(nfds * sizeof(struct pollfd)); | |
72 | + nfds = 0; | |
73 | + | |
74 | + easy=multi->easy.next; | |
75 | + while(easy != &multi->easy) { | |
76 | + bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE); | |
77 | + | |
78 | + for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) { | |
79 | + curl_socket_t s = CURL_SOCKET_BAD; | |
80 | + | |
81 | + if(bitmap & GETSOCK_READSOCK(i)) { | |
82 | + ufds[nfds].fd = sockbunch[i]; | |
83 | + ufds[nfds].events = POLLIN; | |
84 | + ++nfds; | |
85 | + s = sockbunch[i]; | |
86 | + } | |
87 | + if(bitmap & GETSOCK_WRITESOCK(i)) { | |
88 | + ufds[nfds].fd = sockbunch[i]; | |
89 | + ufds[nfds].events = POLLOUT; | |
90 | + ++nfds; | |
91 | + s = sockbunch[i]; | |
92 | + } | |
93 | + if(s == CURL_SOCKET_BAD) { | |
94 | + break; | |
95 | + } | |
96 | + } | |
97 | + | |
98 | + easy = easy->next; /* check next handle */ | |
99 | + } | |
100 | + | |
101 | + nret = Curl_poll(ufds, nfds, timeout_ms); | |
102 | + free(ufds); | |
103 | + if (ret) { | |
104 | + *ret = nret; | |
105 | + } | |
106 | + return CURLM_OK; | |
107 | +} | |
108 | + | |
109 | static CURLMcode multi_runsingle(struct Curl_multi *multi, | |
191fac58 | 110 | struct timeval now, |
2e570606 | 111 | struct Curl_one_easy *easy) |