diff options
| -rw-r--r-- | lib/multi.c | 12 | ||||
| -rw-r--r-- | lib/url.c | 85 | ||||
| -rw-r--r-- | lib/url.h | 4 | ||||
| -rw-r--r-- | lib/urldata.h | 2 | 
4 files changed, 62 insertions, 41 deletions
| diff --git a/lib/multi.c b/lib/multi.c index 77c6a9fb4..2f7f32870 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -423,6 +423,18 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle,    /* increase the node-counter */    multi->num_easy++; + +  if((multi->num_easy+5) > multi->connc->num) { +    /* we want the connection cache to have room for all easy transfers, and +       some more so we have a margin of 5 for now, but we add the new amount +       plus 10 to not have to do it for every new handle added */ +    CURLcode res = Curl_ch_connc(easy_handle, multi->connc, +                                 multi->num_easy + 10); +    if(res) +      /* TODO: we need to do some cleaning up here! */ +      return res; +  } +    /* increase the alive-counter */    multi->num_alive++; @@ -346,6 +346,49 @@ struct conncache *Curl_mk_connc(int type)    return c;  } +/* Change number of entries of a connection cache */ +CURLcode Curl_ch_connc(struct SessionHandle *data, +                       struct conncache *c, +                       long newamount) +{ +  int i; +  struct connectdata **newptr; + +  if(newamount < c->num) { +    /* Since this number is *decreased* from the existing number, we must +       close the possibly open connections that live on the indexes that +       are being removed! + +       NOTE: for conncache_multi cases we must make sure that we only +       close handles not in use. +    */ +    for(i=newamount; i< c->num; i++) +      Curl_disconnect(c->connects[i]); + +    /* If the most recent connection is no longer valid, mark it +       invalid. */ +    if(data->state.lastconnect <= newamount) +      data->state.lastconnect = -1; +  } +  if(newamount > 0) { +    newptr= (struct connectdata **) +      realloc(c->connects, sizeof(struct connectdata *) * newamount); +    if(!newptr) +      /* we closed a few connections in vain, but so what? */ +      return CURLE_OUT_OF_MEMORY; + +    /* nullify the newly added pointers */ +    for(i=c->num; i<newamount; i++) +      newptr[i] = NULL; + +    c->connects = newptr; +    c->num = newamount; +  } +  /* we no longer support less than 1 as size for the connection cache, and +     I'm not sure it ever worked to set it to zero */ +  return CURLE_OK; +} +  /* Free a connection cache. This is called from Curl_close() and     curl_multi_cleanup(). */  void Curl_rm_connc(struct conncache *c) @@ -521,45 +564,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,       * Set the absolute number of maximum simultaneous alive connection that       * libcurl is allowed to have.       */ -    { -      long newconnects= va_arg(param, long); -      struct connectdata **newptr; -      long i; - -      if(newconnects < data->state.connc->num) { -        /* Since this number is *decreased* from the existing number, we must -           close the possibly open connections that live on the indexes that -           are being removed! - -           NOTE: for conncache_multi cases we must make sure that we only -           close handles not in use. -        */ -        for(i=newconnects; i< data->state.connc->num; i++) -          Curl_disconnect(data->state.connc->connects[i]); - -        /* If the most recent connection is no longer valid, mark it -           invalid. */ -        if(data->state.lastconnect <= newconnects) -          data->state.lastconnect = -1; -      } -      if(newconnects > 0) { -        newptr= (struct connectdata **) -          realloc(data->state.connc->connects, -                  sizeof(struct connectdata *) * newconnects); -        if(!newptr) -          /* we closed a few connections in vain, but so what? */ -          return CURLE_OUT_OF_MEMORY; - -        /* nullify the newly added pointers */ -        for(i=data->state.connc->num; i<newconnects; i++) -          newptr[i] = NULL; - -        data->state.connc->connects = newptr; -        data->state.connc->num = newconnects; -      } -      /* we no longer support less than 1 as size for the connection cache, -         and I'm not sure it ever worked to set it to zero */ -    } +    result = Curl_ch_connc(data, data->state.connc, va_arg(param, long));      break;    case CURLOPT_FORBID_REUSE:      /* @@ -3115,7 +3120,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,    conn->connectindex = -1;    /* no index */    conn->bits.httpproxy = (bool)(data->change.proxy  /* http proxy or not */ -                             && *data->change.proxy  +                             && *data->change.proxy                               && (data->set.proxytype == CURLPROXY_HTTP));    /* Default protocol-independent behavior doesn't support persistent @@ -50,6 +50,10 @@ void Curl_safefree(void *ptr);  struct conncache *Curl_mk_connc(int type);  /* free a connection cache */  void Curl_rm_connc(struct conncache *c); +/* Change number of entries of a connection cache */ +CURLcode Curl_ch_connc(struct SessionHandle *data, +                       struct conncache *c, +                       long newamount);  int Curl_protocol_getsock(struct connectdata *conn,                            curl_socket_t *socks, diff --git a/lib/urldata.h b/lib/urldata.h index 9f8e6de80..d90c6cd08 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -951,7 +951,7 @@ struct conncache {    /* 'connects' will be an allocated array with pointers. If the pointer is       set, it holds an allocated connection. */    struct connectdata **connects; -  long num;           /* size of the 'connects' array */ +  long num;           /* number of entries of the 'connects' array */    enum {      CONNCACHE_PRIVATE, /* used for an easy handle alone */      CONNCACHE_MULTI    /* shared within a multi handle */ | 
