• Home
  • Raw
  • Download

Lines Matching full:multi

68 static void singlesocket(struct Curl_multi *multi,
70 static int update_timer(struct Curl_multi *multi);
73 struct Curl_multi *multi,
75 static CURLMcode multi_timeout(struct Curl_multi *multi,
140 data->multi->num_alive--; in mstate()
262 * the list kept in the multi handle.
264 static CURLMcode multi_addmsg(struct Curl_multi *multi, in multi_addmsg() argument
267 if(!Curl_llist_insert_next(multi->msglist, multi->msglist->tail, msg)) in multi_addmsg()
287 struct Curl_multi *multi = calloc(1, sizeof(struct Curl_multi)); in Curl_multi_handle() local
289 if(!multi) in Curl_multi_handle()
292 multi->type = CURL_MULTI_HANDLE; in Curl_multi_handle()
294 if(Curl_mk_dnscache(&multi->hostcache)) in Curl_multi_handle()
297 if(sh_init(&multi->sockhash, hashsize)) in Curl_multi_handle()
300 if(Curl_conncache_init(&multi->conn_cache, chashsize)) in Curl_multi_handle()
303 multi->msglist = Curl_llist_alloc(multi_freeamsg); in Curl_multi_handle()
304 if(!multi->msglist) in Curl_multi_handle()
307 multi->pending = Curl_llist_alloc(multi_freeamsg); in Curl_multi_handle()
308 if(!multi->pending) in Curl_multi_handle()
312 multi->closure_handle = curl_easy_init(); in Curl_multi_handle()
313 if(!multi->closure_handle) in Curl_multi_handle()
316 multi->closure_handle->multi = multi; in Curl_multi_handle()
317 multi->closure_handle->state.conn_cache = &multi->conn_cache; in Curl_multi_handle()
319 multi->max_pipeline_length = 5; in Curl_multi_handle()
322 multi->maxconnects = -1; in Curl_multi_handle()
323 return (CURLM *) multi; in Curl_multi_handle()
327 Curl_hash_destroy(&multi->sockhash); in Curl_multi_handle()
328 Curl_hash_destroy(&multi->hostcache); in Curl_multi_handle()
329 Curl_conncache_destroy(&multi->conn_cache); in Curl_multi_handle()
330 Curl_close(multi->closure_handle); in Curl_multi_handle()
331 multi->closure_handle = NULL; in Curl_multi_handle()
332 Curl_llist_destroy(multi->msglist, NULL); in Curl_multi_handle()
333 Curl_llist_destroy(multi->pending, NULL); in Curl_multi_handle()
335 free(multi); in Curl_multi_handle()
349 struct Curl_multi *multi = (struct Curl_multi *)multi_handle; in curl_multi_add_handle() local
353 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_add_handle()
361 adding to more than one multi stack */ in curl_multi_add_handle()
362 if(data->multi) in curl_multi_add_handle()
372 * modification of easy nor multi handle allowed before this except for in curl_multi_add_handle()
373 * potential multi's connection cache growing which won't be undone in this in curl_multi_add_handle()
394 /* for multi interface connections, we share DNS cache automatically if the in curl_multi_add_handle()
398 data->dns.hostcache = &multi->hostcache; in curl_multi_add_handle()
402 /* Point to the multi's connection cache */ in curl_multi_add_handle()
403 data->state.conn_cache = &multi->conn_cache; in curl_multi_add_handle()
417 if(multi->easyp) { in curl_multi_add_handle()
418 struct SessionHandle *last = multi->easylp; in curl_multi_add_handle()
421 multi->easylp = data; /* the new last node */ in curl_multi_add_handle()
426 multi->easylp = multi->easyp = data; /* both first and last */ in curl_multi_add_handle()
429 /* make the SessionHandle refer back to this multi handle */ in curl_multi_add_handle()
430 data->multi = multi_handle; in curl_multi_add_handle()
441 multi->num_easy++; in curl_multi_add_handle()
444 multi->num_alive++; in curl_multi_add_handle()
456 memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall)); in curl_multi_add_handle()
458 update_timer(multi); in curl_multi_add_handle()
465 * Curl_hash_print(multi->sockhash, debug_print_sock_hash);
481 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in curl_multi_remove_handle() local
489 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_remove_handle()
497 if(!data->multi) in curl_multi_remove_handle()
509 multi->num_alive--; in curl_multi_remove_handle()
513 Curl_multi_process_pending_handles(multi); in curl_multi_remove_handle()
529 /* The timer must be shut down before data->multi is set to NULL, in curl_multi_remove_handle()
541 /* stop using the multi handle's DNS cache */ in curl_multi_remove_handle()
567 since we're not part of that multi handle anymore */ in curl_multi_remove_handle()
573 singlesocket(multi, easy); /* to let the application know what sockets that in curl_multi_remove_handle()
582 data->multi = NULL; /* clear the association to this multi handle */ in curl_multi_remove_handle()
587 for(e = multi->msglist->head; e; e = e->next) { in curl_multi_remove_handle()
591 Curl_llist_remove(multi->msglist, e, NULL); in curl_multi_remove_handle()
601 multi->easyp = data->next; /* point to first node */ in curl_multi_remove_handle()
607 multi->easylp = data->prev; /* point to last node */ in curl_multi_remove_handle()
611 multi->num_easy--; /* one less to care about now */ in curl_multi_remove_handle()
613 update_timer(multi); in curl_multi_remove_handle()
618 bool Curl_pipeline_wanted(const struct Curl_multi *multi, int bits) in Curl_pipeline_wanted() argument
620 return (multi && (multi->pipelining & bits)) ? TRUE : FALSE; in Curl_pipeline_wanted()
749 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in curl_multi_fdset() local
757 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_fdset()
760 data=multi->easyp; in curl_multi_fdset()
798 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in curl_multi_wait() local
808 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_wait()
814 (void)multi_timeout(multi, &timeout_internal); in curl_multi_wait()
818 /* Count up how many fds we have from the multi handle */ in curl_multi_wait()
819 data=multi->easyp; in curl_multi_wait()
857 data=multi->easyp; in curl_multi_wait()
934 * this multi handle that has changed state (pipelining become possible, the
936 * multi handle should move CONNECT_PEND handles back to CONNECT to have them
939 void Curl_multi_connchanged(struct Curl_multi *multi) in Curl_multi_connchanged() argument
941 multi->recheckstate = TRUE; in Curl_multi_connchanged()
952 static bool multi_ischanged(struct Curl_multi *multi, bool clear) in multi_ischanged() argument
954 bool retval = multi->recheckstate; in multi_ischanged()
956 multi->recheckstate = FALSE; in multi_ischanged()
960 static CURLMcode multi_runsingle(struct Curl_multi *multi, in multi_runsingle() argument
1011 if(multi_ischanged(multi, TRUE)) { in multi_runsingle()
1012 DEBUGF(infof(data, "multi changed, check CONNECT_PEND queue!\n")); in multi_runsingle()
1013 Curl_multi_process_pending_handles(multi); in multi_runsingle()
1097 if(!Curl_llist_insert_next(multi->pending, multi->pending->tail, data)) in multi_runsingle()
1120 multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)? in multi_runsingle()
1162 singlesocket(multi, data); in multi_runsingle()
1177 multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)? in multi_runsingle()
1242 multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)? in multi_runsingle()
1259 multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)? in multi_runsingle()
1443 Curl_multi_process_pending_handles(multi); in multi_runsingle()
1574 Curl_multi_process_pending_handles(multi); in multi_runsingle()
1636 Curl_multi_process_pending_handles(multi); in multi_runsingle()
1704 Curl_multi_process_pending_handles(multi); in multi_runsingle()
1754 rc = multi_addmsg(multi, msg); in multi_runsingle()
1758 } while((rc == CURLM_CALL_MULTI_PERFORM) || multi_ischanged(multi, FALSE)); in multi_runsingle()
1769 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in curl_multi_perform() local
1775 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_perform()
1778 data=multi->easyp; in curl_multi_perform()
1793 result = multi_runsingle(multi, now, data); in curl_multi_perform()
1819 multi->timetree = Curl_splaygetbest(now, multi->timetree, &t); in curl_multi_perform()
1822 (void)add_next_timeout(now, multi, t->payload); in curl_multi_perform()
1826 *running_handles = multi->num_alive; in curl_multi_perform()
1829 update_timer(multi); in curl_multi_perform()
1834 static void close_all_connections(struct Curl_multi *multi) in close_all_connections() argument
1838 conn = Curl_conncache_find_first_connection(&multi->conn_cache); in close_all_connections()
1841 conn->data = multi->closure_handle; in close_all_connections()
1848 conn = Curl_conncache_find_first_connection(&multi->conn_cache); in close_all_connections()
1854 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in curl_multi_cleanup() local
1858 if(GOOD_MULTI_HANDLE(multi)) { in curl_multi_cleanup()
1862 multi->type = 0; /* not good anymore */ in curl_multi_cleanup()
1865 close_all_connections(multi); in curl_multi_cleanup()
1867 if(multi->closure_handle) { in curl_multi_cleanup()
1868 sigpipe_ignore(multi->closure_handle, &pipe_st); in curl_multi_cleanup()
1871 multi->closure_handle->dns.hostcache = &multi->hostcache; in curl_multi_cleanup()
1872 Curl_hostcache_clean(multi->closure_handle, in curl_multi_cleanup()
1873 multi->closure_handle->dns.hostcache); in curl_multi_cleanup()
1875 Curl_close(multi->closure_handle); in curl_multi_cleanup()
1878 Curl_hash_destroy(&multi->sockhash); in curl_multi_cleanup()
1879 Curl_conncache_destroy(&multi->conn_cache); in curl_multi_cleanup()
1880 Curl_llist_destroy(multi->msglist, NULL); in curl_multi_cleanup()
1881 Curl_llist_destroy(multi->pending, NULL); in curl_multi_cleanup()
1884 data = multi->easyp; in curl_multi_cleanup()
1896 data->multi = NULL; /* clear the association */ in curl_multi_cleanup()
1901 Curl_hash_destroy(&multi->hostcache); in curl_multi_cleanup()
1904 Curl_pipeline_set_site_blacklist(NULL, &multi->pipelining_site_bl); in curl_multi_cleanup()
1905 Curl_pipeline_set_server_blacklist(NULL, &multi->pipelining_server_bl); in curl_multi_cleanup()
1907 free(multi); in curl_multi_cleanup()
1920 * This function is the primary way for a multi/multi_socket application to
1929 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in curl_multi_info_read() local
1934 if(GOOD_MULTI_HANDLE(multi) && Curl_llist_count(multi->msglist)) { in curl_multi_info_read()
1939 e = multi->msglist->head; in curl_multi_info_read()
1944 Curl_llist_remove(multi->msglist, e, NULL); in curl_multi_info_read()
1946 *msgs_in_queue = curlx_uztosi(Curl_llist_count(multi->msglist)); in curl_multi_info_read()
1959 static void singlesocket(struct Curl_multi *multi, in singlesocket() argument
1990 entry = Curl_hash_pick(&multi->sockhash, (char *)&s, sizeof(s)); in singlesocket()
2005 entry = sh_addentry(&multi->sockhash, s, data); in singlesocket()
2012 if(multi->socket_cb) in singlesocket()
2013 multi->socket_cb(data, in singlesocket()
2016 multi->socket_userp, in singlesocket()
2041 entry = Curl_hash_pick(&multi->sockhash, (char *)&s, sizeof(s)); in singlesocket()
2090 if(multi->socket_cb) in singlesocket()
2091 multi->socket_cb(data, in singlesocket()
2094 multi->socket_userp, in singlesocket()
2096 sh_delentry(&multi->sockhash, s); in singlesocket()
2118 struct Curl_multi *multi = conn->data->multi; in Curl_multi_closed() local
2119 if(multi) { in Curl_multi_closed()
2121 a multi handle, and only then this is necessary */ in Curl_multi_closed()
2123 Curl_hash_pick(&multi->sockhash, (char *)&s, sizeof(s)); in Curl_multi_closed()
2126 if(multi->socket_cb) in Curl_multi_closed()
2127 multi->socket_cb(conn->data, s, CURL_POLL_REMOVE, in Curl_multi_closed()
2128 multi->socket_userp, in Curl_multi_closed()
2132 sh_delentry(&multi->sockhash, s); in Curl_multi_closed()
2152 struct Curl_multi *multi, in add_next_timeout() argument
2188 multi->timetree = Curl_splayinsert(*tv, multi->timetree, in add_next_timeout()
2194 static CURLMcode multi_socket(struct Curl_multi *multi, in multi_socket() argument
2207 result = curl_multi_perform(multi, running_handles); in multi_socket()
2212 data=multi->easyp; in multi_socket()
2214 singlesocket(multi, data); in multi_socket()
2225 Curl_hash_pick(&multi->sockhash, (char *)&s, sizeof(s)); in multi_socket()
2263 result = multi_runsingle(multi, now, data); in multi_socket()
2274 singlesocket(multi, data); in multi_socket()
2291 memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall)); in multi_socket()
2305 result = multi_runsingle(multi, now, data); in multi_socket()
2311 singlesocket(multi, data); in multi_socket()
2317 multi->timetree = Curl_splaygetbest(now, multi->timetree, &t); in multi_socket()
2320 (void)add_next_timeout(now, multi, t->payload); in multi_socket()
2325 *running_handles = multi->num_alive; in multi_socket()
2333 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in curl_multi_setopt() local
2337 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_setopt()
2344 multi->socket_cb = va_arg(param, curl_socket_callback); in curl_multi_setopt()
2347 multi->socket_userp = va_arg(param, void *); in curl_multi_setopt()
2350 multi->pipelining = va_arg(param, long); in curl_multi_setopt()
2353 multi->timer_cb = va_arg(param, curl_multi_timer_callback); in curl_multi_setopt()
2356 multi->timer_userp = va_arg(param, void *); in curl_multi_setopt()
2359 multi->maxconnects = va_arg(param, long); in curl_multi_setopt()
2362 multi->max_host_connections = va_arg(param, long); in curl_multi_setopt()
2365 multi->max_pipeline_length = va_arg(param, long); in curl_multi_setopt()
2368 multi->content_length_penalty_size = va_arg(param, long); in curl_multi_setopt()
2371 multi->chunk_length_penalty_size = va_arg(param, long); in curl_multi_setopt()
2375 &multi->pipelining_site_bl); in curl_multi_setopt()
2379 &multi->pipelining_server_bl); in curl_multi_setopt()
2382 multi->max_total_connections = va_arg(param, long); in curl_multi_setopt()
2392 /* we define curl_multi_socket() in the public multi.h header */
2425 static CURLMcode multi_timeout(struct Curl_multi *multi, in multi_timeout() argument
2430 if(multi->timetree) { in multi_timeout()
2435 multi->timetree = Curl_splay(tv_zero, multi->timetree); in multi_timeout()
2437 if(Curl_splaycomparekeys(multi->timetree->key, now) > 0) { in multi_timeout()
2439 *timeout_ms = curlx_tvdiff(multi->timetree->key, now); in multi_timeout()
2463 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in curl_multi_timeout() local
2466 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_timeout()
2469 return multi_timeout(multi, timeout_ms); in curl_multi_timeout()
2476 static int update_timer(struct Curl_multi *multi) in update_timer() argument
2480 if(!multi->timer_cb) in update_timer()
2482 if(multi_timeout(multi, &timeout_ms)) { in update_timer()
2487 if(Curl_splaycomparekeys(none, multi->timer_lastcall)) { in update_timer()
2488 multi->timer_lastcall = none; in update_timer()
2491 return multi->timer_cb((CURLM*)multi, -1, multi->timer_userp); in update_timer()
2496 /* When multi_timeout() is done, multi->timetree points to the node with the in update_timer()
2500 if(Curl_splaycomparekeys(multi->timetree->key, multi->timer_lastcall) == 0) in update_timer()
2503 multi->timer_lastcall = multi->timetree->key; in update_timer()
2505 return multi->timer_cb((CURLM*)multi, timeout_ms, multi->timer_userp); in update_timer()
2579 struct Curl_multi *multi = data->multi; in Curl_expire() local
2583 /* this is only interesting while there is still an associated multi struct in Curl_expire()
2585 if(!multi) in Curl_expire()
2595 rc = Curl_splayremovebyaddr(multi->timetree, in Curl_expire()
2597 &multi->timetree); in Curl_expire()
2642 rc = Curl_splayremovebyaddr(multi->timetree, in Curl_expire()
2644 &multi->timetree); in Curl_expire()
2651 multi->timetree = Curl_splayinsert(*nowp, in Curl_expire()
2652 multi->timetree, in Curl_expire()
2656 Curl_splayprint(multi->timetree, 0, TRUE); in Curl_expire()
2704 struct Curl_multi *multi = (struct Curl_multi *)multi_handle; in curl_multi_assign() local
2707 there = Curl_hash_pick(&multi->sockhash, (char *)&s, in curl_multi_assign()
2718 size_t Curl_multi_max_host_connections(struct Curl_multi *multi) in Curl_multi_max_host_connections() argument
2720 return multi ? multi->max_host_connections : 0; in Curl_multi_max_host_connections()
2723 size_t Curl_multi_max_total_connections(struct Curl_multi *multi) in Curl_multi_max_total_connections() argument
2725 return multi ? multi->max_total_connections : 0; in Curl_multi_max_total_connections()
2728 curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi) in Curl_multi_content_length_penalty_size() argument
2730 return multi ? multi->content_length_penalty_size : 0; in Curl_multi_content_length_penalty_size()
2733 curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi) in Curl_multi_chunk_length_penalty_size() argument
2735 return multi ? multi->chunk_length_penalty_size : 0; in Curl_multi_chunk_length_penalty_size()
2738 struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi) in Curl_multi_pipelining_site_bl() argument
2740 return multi->pipelining_site_bl; in Curl_multi_pipelining_site_bl()
2743 struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi) in Curl_multi_pipelining_server_bl() argument
2745 return multi->pipelining_server_bl; in Curl_multi_pipelining_server_bl()
2748 void Curl_multi_process_pending_handles(struct Curl_multi *multi) in Curl_multi_process_pending_handles() argument
2750 struct curl_llist_element *e = multi->pending->head; in Curl_multi_process_pending_handles()
2760 Curl_llist_remove(multi->pending, e, NULL); in Curl_multi_process_pending_handles()
2773 struct Curl_multi *multi=(struct Curl_multi *)multi_handle; in Curl_multi_dump() local
2776 fprintf(stderr, "* Multi status: %d handles, %d alive\n", in Curl_multi_dump()
2777 multi->num_easy, multi->num_alive); in Curl_multi_dump()
2778 for(data=multi->easyp; data; data = data->next) { in Curl_multi_dump()
2787 Curl_hash_pick(&multi->sockhash, (char *)&s, sizeof(s)); in Curl_multi_dump()