int wswcurl_perform() { int ret = 0; wswcurl_req *r; if (!curlmulti) return 0; r = http_requests; while (r) { r->activity = 0; r = r->next; } //CURLDBG(("CURL BEFORE MULTI_PERFORM\n")); while ( curl_multi_perform(curlmulti, &ret) == CURLM_CALL_MULTI_PERFORM) { CURLDBG((" CURL MULTI LOOP\n")); } ret += wswcurl_checkmsg(); //CURLDBG(("CURL after checkmsg\n")); return ret; }
int wswcurl_perform() { int ret = 0; wswcurl_req *r, *next; if (!curlmulti) return 0; // process requests in FIFO manner // check for timed out requests and requests that need to be paused r = http_requests_hnode; while( r ) { next = r->prev; if (r->status == WSTATUS_QUEUED) { // queued if (curlmulti_num_handles < WMAXMULTIHANDLES) { if (curl_multi_add_handle(curlmulti, r->curl)) { CURLDBG(("OOPS: CURL MULTI ADD HANDLE FAIL!!!")); } r->status = WSTATUS_STARTED; r->last_action = wswcurl_now(); curlmulti_num_handles++; } else { // stay in queue } } // handle pauses for synchronous requests if( r->status == WSTATUS_STARTED && !r->callback_read ) { if( r->rxreceived >= r->rxreturned + WMAXBUFFERING ) { wswcurl_pause( r ); } } // handle timeouts if( r->status == WSTATUS_STARTED ) { time_t now = wswcurl_now(); if( r->paused ) { // paused r->last_action = now; } else if( r->timeout && ( r->last_action + r->timeout <= now ) ) { // timed out r->respcode = -1; r->status = -CURLE_OPERATION_TIMEDOUT; if( r->callback_done ) { r->callback_done( r, r->status, r->customp ); } } } r = next; } //CURLDBG(("CURL BEFORE MULTI_PERFORM\n")); while ( curl_multi_perform(curlmulti, &ret) == CURLM_CALL_MULTI_PERFORM) { CURLDBG((" CURL MULTI LOOP\n")); } ret += wswcurl_checkmsg(); //CURLDBG(("CURL after checkmsg\n")); return ret; }