• Home
  • Raw
  • Download

Lines Matching full:multi

66 static void singlesocket(struct Curl_multi *multi,
68 static int update_timer(struct Curl_multi *multi);
71 struct Curl_multi *multi,
73 static CURLMcode multi_timeout(struct Curl_multi *multi,
147 data->multi->num_alive--; in mstate()
276 * the list kept in the multi handle.
278 static CURLMcode multi_addmsg(struct Curl_multi *multi, in multi_addmsg() argument
281 if(!Curl_llist_insert_next(multi->msglist, multi->msglist->tail, msg)) in multi_addmsg()
301 struct Curl_multi *multi = calloc(1, sizeof(struct Curl_multi)); in Curl_multi_handle() local
303 if(!multi) in Curl_multi_handle()
306 multi->type = CURL_MULTI_HANDLE; in Curl_multi_handle()
308 if(Curl_mk_dnscache(&multi->hostcache)) in Curl_multi_handle()
311 if(sh_init(&multi->sockhash, hashsize)) in Curl_multi_handle()
314 if(Curl_conncache_init(&multi->conn_cache, chashsize)) in Curl_multi_handle()
317 multi->msglist = Curl_llist_alloc(multi_freeamsg); in Curl_multi_handle()
318 if(!multi->msglist) in Curl_multi_handle()
321 multi->pending = Curl_llist_alloc(multi_freeamsg); in Curl_multi_handle()
322 if(!multi->pending) in Curl_multi_handle()
326 multi->closure_handle = curl_easy_init(); in Curl_multi_handle()
327 if(!multi->closure_handle) in Curl_multi_handle()
330 multi->closure_handle->multi = multi; in Curl_multi_handle()
331 multi->closure_handle->state.conn_cache = &multi->conn_cache; in Curl_multi_handle()
333 multi->max_pipeline_length = 5; in Curl_multi_handle()
336 multi->maxconnects = -1; in Curl_multi_handle()
337 return multi; in Curl_multi_handle()
341 Curl_hash_destroy(&multi->sockhash); in Curl_multi_handle()
342 Curl_hash_destroy(&multi->hostcache); in Curl_multi_handle()
343 Curl_conncache_destroy(&multi->conn_cache); in Curl_multi_handle()
344 Curl_close(multi->closure_handle); in Curl_multi_handle()
345 multi->closure_handle = NULL; in Curl_multi_handle()
346 Curl_llist_destroy(multi->msglist, NULL); in Curl_multi_handle()
347 Curl_llist_destroy(multi->pending, NULL); in Curl_multi_handle()
349 free(multi); in Curl_multi_handle()
359 CURLMcode curl_multi_add_handle(struct Curl_multi *multi, in curl_multi_add_handle() argument
365 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_add_handle()
373 adding to more than one multi stack */ in curl_multi_add_handle()
374 if(data->multi) in curl_multi_add_handle()
384 * modification of easy nor multi handle allowed before this except for in curl_multi_add_handle()
385 * potential multi's connection cache growing which won't be undone in this in curl_multi_add_handle()
406 /* for multi interface connections, we share DNS cache automatically if the in curl_multi_add_handle()
410 data->dns.hostcache = &multi->hostcache; in curl_multi_add_handle()
414 /* Point to the multi's connection cache */ in curl_multi_add_handle()
415 data->state.conn_cache = &multi->conn_cache; in curl_multi_add_handle()
424 if(multi->easyp) { in curl_multi_add_handle()
425 struct Curl_easy *last = multi->easylp; in curl_multi_add_handle()
428 multi->easylp = data; /* the new last node */ in curl_multi_add_handle()
433 multi->easylp = multi->easyp = data; /* both first and last */ in curl_multi_add_handle()
436 /* make the Curl_easy refer back to this multi handle */ in curl_multi_add_handle()
437 data->multi = multi; in curl_multi_add_handle()
448 multi->num_easy++; in curl_multi_add_handle()
451 multi->num_alive++; in curl_multi_add_handle()
463 memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall)); in curl_multi_add_handle()
465 update_timer(multi); in curl_multi_add_handle()
472 * Curl_hash_print(multi->sockhash, debug_print_sock_hash);
490 /* data->multi->maxconnects can be negative, deal with it. */ in ConnectionDone()
492 (data->multi->maxconnects < 0) ? data->multi->num_easy * 4: in ConnectionDone()
493 data->multi->maxconnects; in ConnectionDone()
646 CURLMcode curl_multi_remove_handle(struct Curl_multi *multi, in curl_multi_remove_handle() argument
655 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_remove_handle()
663 if(!data->multi) in curl_multi_remove_handle()
675 multi->num_alive--; in curl_multi_remove_handle()
679 Curl_multi_process_pending_handles(multi); in curl_multi_remove_handle()
695 /* The timer must be shut down before data->multi is set to NULL, in curl_multi_remove_handle()
701 /* stop using the multi handle's DNS cache */ in curl_multi_remove_handle()
734 since we're not part of that multi handle anymore */ in curl_multi_remove_handle()
740 singlesocket(multi, easy); /* to let the application know what sockets that in curl_multi_remove_handle()
749 data->multi = NULL; /* clear the association to this multi handle */ in curl_multi_remove_handle()
754 for(e = multi->msglist->head; e; e = e->next) { in curl_multi_remove_handle()
758 Curl_llist_remove(multi->msglist, e, NULL); in curl_multi_remove_handle()
768 multi->easyp = data->next; /* point to first node */ in curl_multi_remove_handle()
774 multi->easylp = data->prev; /* point to last node */ in curl_multi_remove_handle()
778 multi->num_easy--; /* one less to care about now */ in curl_multi_remove_handle()
780 update_timer(multi); in curl_multi_remove_handle()
785 bool Curl_pipeline_wanted(const struct Curl_multi *multi, int bits) in Curl_pipeline_wanted() argument
787 return (multi && (multi->pipelining & bits)) ? TRUE : FALSE; in Curl_pipeline_wanted()
909 CURLMcode curl_multi_fdset(struct Curl_multi *multi, in curl_multi_fdset() argument
923 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_fdset()
926 data=multi->easyp; in curl_multi_fdset()
958 CURLMcode curl_multi_wait(struct Curl_multi *multi, in curl_multi_wait() argument
974 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_wait()
980 (void)multi_timeout(multi, &timeout_internal); in curl_multi_wait()
984 /* Count up how many fds we have from the multi handle */ in curl_multi_wait()
985 data=multi->easyp; in curl_multi_wait()
1023 data=multi->easyp; in curl_multi_wait()
1100 * this multi handle that has changed state (pipelining become possible, the
1102 * multi handle should move CONNECT_PEND handles back to CONNECT to have them
1105 void Curl_multi_connchanged(struct Curl_multi *multi) in Curl_multi_connchanged() argument
1107 multi->recheckstate = TRUE; in Curl_multi_connchanged()
1118 static bool multi_ischanged(struct Curl_multi *multi, bool clear) in multi_ischanged() argument
1120 bool retval = multi->recheckstate; in multi_ischanged()
1122 multi->recheckstate = FALSE; in multi_ischanged()
1126 CURLMcode Curl_multi_add_perform(struct Curl_multi *multi, in Curl_multi_add_perform() argument
1132 rc = curl_multi_add_handle(multi, data); in Curl_multi_add_perform()
1230 * to re-establish the connection. Otherwise, let the multi logic in multi_do()
1233 if(!data->multi) { in multi_do()
1255 * multi_do_more() is called during the DO_MORE multi state. It is basically a
1281 static CURLMcode multi_runsingle(struct Curl_multi *multi, in multi_runsingle() argument
1332 if(multi_ischanged(multi, TRUE)) { in multi_runsingle()
1333 DEBUGF(infof(data, "multi changed, check CONNECT_PEND queue!\n")); in multi_runsingle()
1334 Curl_multi_process_pending_handles(multi); in multi_runsingle()
1418 if(!Curl_llist_insert_next(multi->pending, multi->pending->tail, data)) in multi_runsingle()
1441 multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)? in multi_runsingle()
1491 singlesocket(multi, data); in multi_runsingle()
1506 multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)? in multi_runsingle()
1573 multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)? in multi_runsingle()
1590 multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)? in multi_runsingle()
1774 Curl_multi_process_pending_handles(multi); in multi_runsingle()
1906 Curl_multi_process_pending_handles(multi); in multi_runsingle()
1968 Curl_multi_process_pending_handles(multi); in multi_runsingle()
2036 Curl_multi_process_pending_handles(multi); in multi_runsingle()
2086 rc = multi_addmsg(multi, msg); in multi_runsingle()
2090 } while((rc == CURLM_CALL_MULTI_PERFORM) || multi_ischanged(multi, FALSE)); in multi_runsingle()
2099 CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles) in curl_multi_perform() argument
2106 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_perform()
2109 data=multi->easyp; in curl_multi_perform()
2115 result = multi_runsingle(multi, now, data); in curl_multi_perform()
2135 multi->timetree = Curl_splaygetbest(now, multi->timetree, &t); in curl_multi_perform()
2138 (void)add_next_timeout(now, multi, t->payload); in curl_multi_perform()
2142 *running_handles = multi->num_alive; in curl_multi_perform()
2145 update_timer(multi); in curl_multi_perform()
2150 static void close_all_connections(struct Curl_multi *multi) in close_all_connections() argument
2154 conn = Curl_conncache_find_first_connection(&multi->conn_cache); in close_all_connections()
2157 conn->data = multi->closure_handle; in close_all_connections()
2166 conn = Curl_conncache_find_first_connection(&multi->conn_cache); in close_all_connections()
2170 CURLMcode curl_multi_cleanup(struct Curl_multi *multi) in curl_multi_cleanup() argument
2175 if(GOOD_MULTI_HANDLE(multi)) { in curl_multi_cleanup()
2179 multi->type = 0; /* not good anymore */ in curl_multi_cleanup()
2182 close_all_connections(multi); in curl_multi_cleanup()
2184 if(multi->closure_handle) { in curl_multi_cleanup()
2185 sigpipe_ignore(multi->closure_handle, &pipe_st); in curl_multi_cleanup()
2188 multi->closure_handle->dns.hostcache = &multi->hostcache; in curl_multi_cleanup()
2189 Curl_hostcache_clean(multi->closure_handle, in curl_multi_cleanup()
2190 multi->closure_handle->dns.hostcache); in curl_multi_cleanup()
2192 Curl_close(multi->closure_handle); in curl_multi_cleanup()
2195 Curl_hash_destroy(&multi->sockhash); in curl_multi_cleanup()
2196 Curl_conncache_destroy(&multi->conn_cache); in curl_multi_cleanup()
2197 Curl_llist_destroy(multi->msglist, NULL); in curl_multi_cleanup()
2198 Curl_llist_destroy(multi->pending, NULL); in curl_multi_cleanup()
2201 data = multi->easyp; in curl_multi_cleanup()
2213 data->multi = NULL; /* clear the association */ in curl_multi_cleanup()
2218 Curl_hash_destroy(&multi->hostcache); in curl_multi_cleanup()
2221 Curl_pipeline_set_site_blacklist(NULL, &multi->pipelining_site_bl); in curl_multi_cleanup()
2222 Curl_pipeline_set_server_blacklist(NULL, &multi->pipelining_server_bl); in curl_multi_cleanup()
2224 free(multi); in curl_multi_cleanup()
2237 * This function is the primary way for a multi/multi_socket application to
2244 CURLMsg *curl_multi_info_read(struct Curl_multi *multi, int *msgs_in_queue) in curl_multi_info_read() argument
2250 if(GOOD_MULTI_HANDLE(multi) && Curl_llist_count(multi->msglist)) { in curl_multi_info_read()
2255 e = multi->msglist->head; in curl_multi_info_read()
2260 Curl_llist_remove(multi->msglist, e, NULL); in curl_multi_info_read()
2262 *msgs_in_queue = curlx_uztosi(Curl_llist_count(multi->msglist)); in curl_multi_info_read()
2275 static void singlesocket(struct Curl_multi *multi, in singlesocket() argument
2305 entry = sh_getentry(&multi->sockhash, s); in singlesocket()
2320 entry = sh_addentry(&multi->sockhash, s, data); in singlesocket()
2327 if(multi->socket_cb) in singlesocket()
2328 multi->socket_cb(data, in singlesocket()
2331 multi->socket_userp, in singlesocket()
2352 entry = sh_getentry(&multi->sockhash, s); in singlesocket()
2398 if(multi->socket_cb) in singlesocket()
2399 multi->socket_cb(data, in singlesocket()
2402 multi->socket_userp, in singlesocket()
2404 sh_delentry(&multi->sockhash, s); in singlesocket()
2425 struct Curl_multi *multi = conn->data->multi; in Curl_multi_closed() local
2426 if(multi) { in Curl_multi_closed()
2428 a multi handle, and only then this is necessary */ in Curl_multi_closed()
2429 struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s); in Curl_multi_closed()
2432 if(multi->socket_cb) in Curl_multi_closed()
2433 multi->socket_cb(conn->data, s, CURL_POLL_REMOVE, in Curl_multi_closed()
2434 multi->socket_userp, in Curl_multi_closed()
2438 sh_delentry(&multi->sockhash, s); in Curl_multi_closed()
2458 struct Curl_multi *multi, in add_next_timeout() argument
2494 multi->timetree = Curl_splayinsert(*tv, multi->timetree, in add_next_timeout()
2500 static CURLMcode multi_socket(struct Curl_multi *multi, in multi_socket() argument
2513 result = curl_multi_perform(multi, running_handles); in multi_socket()
2518 data=multi->easyp; in multi_socket()
2520 singlesocket(multi, data); in multi_socket()
2530 struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s); in multi_socket()
2568 result = multi_runsingle(multi, now, data); in multi_socket()
2579 singlesocket(multi, data); in multi_socket()
2596 memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall)); in multi_socket()
2610 result = multi_runsingle(multi, now, data); in multi_socket()
2616 singlesocket(multi, data); in multi_socket()
2622 multi->timetree = Curl_splaygetbest(now, multi->timetree, &t); in multi_socket()
2625 (void)add_next_timeout(now, multi, t->payload); in multi_socket()
2630 *running_handles = multi->num_alive; in multi_socket()
2635 CURLMcode curl_multi_setopt(struct Curl_multi *multi, in curl_multi_setopt() argument
2641 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_setopt()
2648 multi->socket_cb = va_arg(param, curl_socket_callback); in curl_multi_setopt()
2651 multi->socket_userp = va_arg(param, void *); in curl_multi_setopt()
2654 multi->push_cb = va_arg(param, curl_push_callback); in curl_multi_setopt()
2657 multi->push_userp = va_arg(param, void *); in curl_multi_setopt()
2660 multi->pipelining = va_arg(param, long); in curl_multi_setopt()
2663 multi->timer_cb = va_arg(param, curl_multi_timer_callback); in curl_multi_setopt()
2666 multi->timer_userp = va_arg(param, void *); in curl_multi_setopt()
2669 multi->maxconnects = va_arg(param, long); in curl_multi_setopt()
2672 multi->max_host_connections = va_arg(param, long); in curl_multi_setopt()
2675 multi->max_pipeline_length = va_arg(param, long); in curl_multi_setopt()
2678 multi->content_length_penalty_size = va_arg(param, long); in curl_multi_setopt()
2681 multi->chunk_length_penalty_size = va_arg(param, long); in curl_multi_setopt()
2685 &multi->pipelining_site_bl); in curl_multi_setopt()
2689 &multi->pipelining_server_bl); in curl_multi_setopt()
2692 multi->max_total_connections = va_arg(param, long); in curl_multi_setopt()
2702 /* we define curl_multi_socket() in the public multi.h header */
2705 CURLMcode curl_multi_socket(struct Curl_multi *multi, curl_socket_t s, in curl_multi_socket() argument
2708 CURLMcode result = multi_socket(multi, FALSE, s, 0, running_handles); in curl_multi_socket()
2710 update_timer(multi); in curl_multi_socket()
2714 CURLMcode curl_multi_socket_action(struct Curl_multi *multi, curl_socket_t s, in curl_multi_socket_action() argument
2717 CURLMcode result = multi_socket(multi, FALSE, s, in curl_multi_socket_action()
2720 update_timer(multi); in curl_multi_socket_action()
2724 CURLMcode curl_multi_socket_all(struct Curl_multi *multi, int *running_handles) in curl_multi_socket_all() argument
2727 CURLMcode result = multi_socket(multi, TRUE, CURL_SOCKET_BAD, 0, in curl_multi_socket_all()
2730 update_timer(multi); in curl_multi_socket_all()
2734 static CURLMcode multi_timeout(struct Curl_multi *multi, in multi_timeout() argument
2739 if(multi->timetree) { in multi_timeout()
2744 multi->timetree = Curl_splay(tv_zero, multi->timetree); in multi_timeout()
2746 if(Curl_splaycomparekeys(multi->timetree->key, now) > 0) { in multi_timeout()
2748 *timeout_ms = curlx_tvdiff(multi->timetree->key, now); in multi_timeout()
2769 CURLMcode curl_multi_timeout(struct Curl_multi *multi, in curl_multi_timeout() argument
2773 if(!GOOD_MULTI_HANDLE(multi)) in curl_multi_timeout()
2776 return multi_timeout(multi, timeout_ms); in curl_multi_timeout()
2783 static int update_timer(struct Curl_multi *multi) in update_timer() argument
2787 if(!multi->timer_cb) in update_timer()
2789 if(multi_timeout(multi, &timeout_ms)) { in update_timer()
2794 if(Curl_splaycomparekeys(none, multi->timer_lastcall)) { in update_timer()
2795 multi->timer_lastcall = none; in update_timer()
2798 return multi->timer_cb(multi, -1, multi->timer_userp); in update_timer()
2803 /* When multi_timeout() is done, multi->timetree points to the node with the in update_timer()
2807 if(Curl_splaycomparekeys(multi->timetree->key, multi->timer_lastcall) == 0) in update_timer()
2810 multi->timer_lastcall = multi->timetree->key; in update_timer()
2812 return multi->timer_cb(multi, timeout_ms, multi->timer_userp); in update_timer()
2886 struct Curl_multi *multi = data->multi; in Curl_expire() local
2890 /* this is only interesting while there is still an associated multi struct in Curl_expire()
2892 if(!multi) in Curl_expire()
2902 rc = Curl_splayremovebyaddr(multi->timetree, in Curl_expire()
2904 &multi->timetree); in Curl_expire()
2949 rc = Curl_splayremovebyaddr(multi->timetree, in Curl_expire()
2951 &multi->timetree); in Curl_expire()
2958 multi->timetree = Curl_splayinsert(*nowp, in Curl_expire()
2959 multi->timetree, in Curl_expire()
2963 Curl_splayprint(multi->timetree, 0, TRUE); in Curl_expire()
3007 CURLMcode curl_multi_assign(struct Curl_multi *multi, curl_socket_t s, in curl_multi_assign() argument
3012 there = sh_getentry(&multi->sockhash, s); in curl_multi_assign()
3022 size_t Curl_multi_max_host_connections(struct Curl_multi *multi) in Curl_multi_max_host_connections() argument
3024 return multi ? multi->max_host_connections : 0; in Curl_multi_max_host_connections()
3027 size_t Curl_multi_max_total_connections(struct Curl_multi *multi) in Curl_multi_max_total_connections() argument
3029 return multi ? multi->max_total_connections : 0; in Curl_multi_max_total_connections()
3032 curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi) in Curl_multi_content_length_penalty_size() argument
3034 return multi ? multi->content_length_penalty_size : 0; in Curl_multi_content_length_penalty_size()
3037 curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi) in Curl_multi_chunk_length_penalty_size() argument
3039 return multi ? multi->chunk_length_penalty_size : 0; in Curl_multi_chunk_length_penalty_size()
3042 struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi) in Curl_multi_pipelining_site_bl() argument
3044 return multi->pipelining_site_bl; in Curl_multi_pipelining_site_bl()
3047 struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi) in Curl_multi_pipelining_server_bl() argument
3049 return multi->pipelining_server_bl; in Curl_multi_pipelining_server_bl()
3052 void Curl_multi_process_pending_handles(struct Curl_multi *multi) in Curl_multi_process_pending_handles() argument
3054 struct curl_llist_element *e = multi->pending->head; in Curl_multi_process_pending_handles()
3064 Curl_llist_remove(multi->pending, e, NULL); in Curl_multi_process_pending_handles()
3075 void Curl_multi_dump(struct Curl_multi *multi) in Curl_multi_dump() argument
3079 fprintf(stderr, "* Multi status: %d handles, %d alive\n", in Curl_multi_dump()
3080 multi->num_easy, multi->num_alive); in Curl_multi_dump()
3081 for(data=multi->easyp; data; data = data->next) { in Curl_multi_dump()
3089 struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s); in Curl_multi_dump()