X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_hosts.c;h=fac037070c8a6e2b7da59a3efe74a8668eb93d02;hb=d1b81fd3181ddae3787fa7ca9c0c7f922e7ddafd;hp=9e9c667317b6d80c1dfc02ed107dd21ffa96e640;hpb=49ab2114abe5e8c3abde24b8ec3f2bc74bfded83;p=awesomized%2Flibmemcached diff --git a/lib/memcached_hosts.c b/lib/memcached_hosts.c index 9e9c6673..fac03707 100644 --- a/lib/memcached_hosts.c +++ b/lib/memcached_hosts.c @@ -6,50 +6,47 @@ static memcached_return server_add(memcached_st *ptr, char *hostname, unsigned int port, memcached_connection type); -static void host_reset(memcached_server_st *host, char *new_hostname, unsigned int port, +static void host_reset(memcached_server_st *host, char *hostname, unsigned int port, memcached_connection type) { memset(host, 0, sizeof(memcached_server_st)); - host->hostname= new_hostname; + host->hostname= strdup(hostname); host->port= port; host->fd= -1; host->type= type; host->read_ptr= host->read_buffer; host->write_ptr= host->write_buffer; + host->sockaddr_inited= MEMCACHED_NOT_ALLOCATED; } memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *list) { unsigned int x; - unsigned int count; + uint16_t count; memcached_server_st *new_host_list; if (!list) return MEMCACHED_SUCCESS; - for (count= 0; list[count].hostname; count++); + count= list[0].count; new_host_list= (memcached_server_st *)realloc(ptr->hosts, - sizeof(memcached_server_st) * (count + ptr->number_of_hosts + 1)); + sizeof(memcached_server_st) * (count + ptr->number_of_hosts)); if (!new_host_list) return MEMCACHED_MEMORY_ALLOCATION_FAILURE; ptr->hosts= new_host_list; - for (x= 0; list[x].hostname; x++) + for (x= 0; x < count; x++) { - ptr->hosts[ptr->number_of_hosts].hostname= strdup(list[x].hostname); - ptr->hosts[ptr->number_of_hosts].port= list[x].port; - ptr->hosts[ptr->number_of_hosts].fd= list[x].fd; - ptr->hosts[ptr->number_of_hosts].stack_responses= list[x].stack_responses; - ptr->hosts[ptr->number_of_hosts].cursor_active= list[x].cursor_active; - ptr->hosts[ptr->number_of_hosts].type= list[x].type; + WATCHPOINT_ASSERT(list[x].hostname); + host_reset(&ptr->hosts[ptr->number_of_hosts], list[x].hostname, + list[x].port, list[x].type); ptr->number_of_hosts++; } - host_reset(&ptr->hosts[ptr->number_of_hosts], NULL, 0, - MEMCACHED_CONNECTION_UNKNOWN); + ptr->hosts[0].count= ptr->number_of_hosts; return MEMCACHED_SUCCESS; } @@ -93,41 +90,19 @@ static memcached_return server_add(memcached_st *ptr, char *hostname, memcached_connection type) { memcached_server_st *new_host_list; - char *new_hostname; LIBMEMCACHED_MEMCACHED_SERVER_ADD_START(); - if (ptr->number_of_hosts) - { - new_host_list= (memcached_server_st *)realloc(ptr->hosts, - sizeof(memcached_server_st) * (ptr->number_of_hosts+1)); - if (!new_host_list) - return MEMCACHED_MEMORY_ALLOCATION_FAILURE; - host_reset(&new_host_list[ptr->number_of_hosts], NULL, 0, - MEMCACHED_CONNECTION_UNKNOWN); - } - else - { - new_host_list= - (memcached_server_st *)malloc(sizeof(memcached_server_st) * 2); - if (!new_host_list) - return MEMCACHED_MEMORY_ALLOCATION_FAILURE; - host_reset(&new_host_list[0], NULL, 0, MEMCACHED_CONNECTION_UNKNOWN); - host_reset(&new_host_list[1], NULL, 0, MEMCACHED_CONNECTION_UNKNOWN); - } + new_host_list= (memcached_server_st *)realloc(ptr->hosts, + sizeof(memcached_server_st) * (ptr->number_of_hosts+1)); + if (!new_host_list) + return MEMCACHED_MEMORY_ALLOCATION_FAILURE; ptr->hosts= new_host_list; - new_hostname= - (char *)malloc(sizeof(char) * (strlen(hostname)+1)); - - if (!new_hostname) - return MEMCACHED_MEMORY_ALLOCATION_FAILURE; - - memcpy(new_hostname, hostname, strlen(hostname)); - new_hostname[strlen(hostname)]= 0; - host_reset(&ptr->hosts[ptr->number_of_hosts], new_hostname, port, type); + host_reset(&ptr->hosts[ptr->number_of_hosts], hostname, port, type); ptr->number_of_hosts++; + ptr->hosts[0].count++; LIBMEMCACHED_MEMCACHED_SERVER_ADD_END(); @@ -140,7 +115,6 @@ memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, { unsigned int count; memcached_server_st *new_host_list; - char *new_hostname; if (!hostname) return ptr; @@ -148,55 +122,45 @@ memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, if (!port) port= MEMCACHED_DEFAULT_PORT; - /* Always count so that we keep a free host at the end */ - if (ptr) + /* Increment count for hosts */ + count= 1; + if (ptr != NULL) { - for (count= 0; ptr[count].hostname; count++); - count+= 2; - new_host_list= (memcached_server_st *)realloc(ptr, sizeof(memcached_server_st) * count); - if (!new_host_list) - goto error; - host_reset(&new_host_list[count-1], NULL, 0, MEMCACHED_CONNECTION_UNKNOWN); - } - else + count+= ptr[0].count; + } + + new_host_list= (memcached_server_st *)realloc(ptr, sizeof(memcached_server_st) * count); + if (!new_host_list) { - count= 2; - new_host_list= (memcached_server_st *)malloc(sizeof(memcached_server_st) * count); - if (!new_host_list) - goto error; - host_reset(&new_host_list[0], NULL, 0, MEMCACHED_CONNECTION_UNKNOWN); - host_reset(&new_host_list[1], NULL, 0, MEMCACHED_CONNECTION_UNKNOWN); + *error= MEMCACHED_MEMORY_ALLOCATION_FAILURE; + return NULL; } - new_hostname= strdup(hostname); - - if (!new_hostname) - goto error; + host_reset(&new_host_list[count-1], hostname, port, MEMCACHED_CONNECTION_TCP); + new_host_list[0].count++; - host_reset(&new_host_list[count-2], new_hostname, port, MEMCACHED_CONNECTION_TCP); *error= MEMCACHED_SUCCESS; return new_host_list; -error: - *error= MEMCACHED_MEMORY_ALLOCATION_FAILURE; - - return NULL; } unsigned int memcached_server_list_count(memcached_server_st *ptr) { - unsigned int x; - for (x= 0; ptr[x].hostname; x++); - - return x; + if (ptr == NULL) + return 0; + + return ptr[0].count; } void memcached_server_list_free(memcached_server_st *ptr) { unsigned int x; - for (x= 0; ptr[x].hostname; x++) + if (ptr == NULL) + return; + + for (x= 0; x < ptr[0].count; x++) free(ptr[x].hostname); free(ptr);