X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_hosts.c;h=760eb39137615f1b1628d9855806484e1efd29a8;hb=2c213592852ceb196be1b1760d17284150fc0678;hp=4b871d6ba1136e55b040fbfeef37f9736c8d54ca;hpb=128e13163e0f26383f888fe0bb284d569562ca6c;p=m6w6%2Flibmemcached diff --git a/lib/memcached_hosts.c b/lib/memcached_hosts.c index 4b871d6b..760eb391 100644 --- a/lib/memcached_hosts.c +++ b/lib/memcached_hosts.c @@ -6,19 +6,62 @@ 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 *hostname, unsigned int port, +#define MEMCACHED_WHEEL_SIZE 1024 +#define MEMCACHED_STRIDE 4 +static void rebalance_wheel(memcached_st *ptr) +{ + unsigned int x; + unsigned int y; + unsigned int latch; + + /* Seed the Wheel */ + memset(ptr->wheel, 0, sizeof(unsigned int) * MEMCACHED_WHEEL_SIZE); + + for (latch= y= x= 0; x < MEMCACHED_WHEEL_SIZE; x++, latch++) + { + if (latch == MEMCACHED_STRIDE) + { + y++; + if (y == ptr->number_of_hosts) + y= 0; + latch= 0; + } + + ptr->wheel[x]= y; + } +} + +static void host_reset(memcached_st *ptr, memcached_server_st *host, + char *hostname, unsigned int port, memcached_connection type) { memset(host, 0, sizeof(memcached_server_st)); - memcpy(host->hostname, hostname, strlen(hostname)); + strncpy(host->hostname, hostname, MEMCACHED_MAX_HOST_LENGTH - 1); + host->root= ptr ? ptr : NULL; 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; } +void server_list_free(memcached_st *ptr, memcached_server_st *servers) +{ + unsigned int x; + + if (servers == NULL) + return; + + for (x= 0; x < servers->count; x++) + if (servers[x].address_info) + freeaddrinfo(servers[x].address_info); + + if (ptr && ptr->call_free) + ptr->call_free(ptr, servers); + else + free(servers); +} + memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *list) { unsigned int x; @@ -30,9 +73,14 @@ memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *l count= list[0].count; - new_host_list= - (memcached_server_st *)realloc(ptr->hosts, - sizeof(memcached_server_st) * (count + ptr->number_of_hosts)); + if (ptr->call_realloc) + new_host_list= + (memcached_server_st *)ptr->call_realloc(ptr, ptr->hosts, + sizeof(memcached_server_st) * (count + ptr->number_of_hosts)); + else + new_host_list= + (memcached_server_st *)realloc(ptr->hosts, + sizeof(memcached_server_st) * (count + ptr->number_of_hosts)); if (!new_host_list) return MEMCACHED_MEMORY_ALLOCATION_FAILURE; @@ -41,13 +89,15 @@ memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *l for (x= 0; x < count; x++) { - WATCHPOINT_ASSERT(list[x].hostname[0] == 0); - host_reset(&ptr->hosts[ptr->number_of_hosts], list[x].hostname, + WATCHPOINT_ASSERT(list[x].hostname[0] != 0); + host_reset(ptr, &ptr->hosts[ptr->number_of_hosts], list[x].hostname, list[x].port, list[x].type); ptr->number_of_hosts++; } ptr->hosts[0].count= ptr->number_of_hosts; + rebalance_wheel(ptr); + return MEMCACHED_SUCCESS; } @@ -93,17 +143,23 @@ static memcached_return server_add(memcached_st *ptr, char *hostname, LIBMEMCACHED_MEMCACHED_SERVER_ADD_START(); - new_host_list= (memcached_server_st *)realloc(ptr->hosts, - sizeof(memcached_server_st) * (ptr->number_of_hosts+1)); - if (!new_host_list) + if (ptr->call_realloc) + new_host_list= (memcached_server_st *)ptr->call_realloc(ptr, ptr->hosts, + sizeof(memcached_server_st) * (ptr->number_of_hosts+1)); + else + new_host_list= (memcached_server_st *)realloc(ptr->hosts, + sizeof(memcached_server_st) * (ptr->number_of_hosts+1)); + if (new_host_list == NULL) return MEMCACHED_MEMORY_ALLOCATION_FAILURE; ptr->hosts= new_host_list; - host_reset(&ptr->hosts[ptr->number_of_hosts], hostname, port, type); + host_reset(ptr, &ptr->hosts[ptr->number_of_hosts], hostname, port, type); ptr->number_of_hosts++; ptr->hosts[0].count++; + rebalance_wheel(ptr); + LIBMEMCACHED_MEMCACHED_SERVER_ADD_END(); return MEMCACHED_SUCCESS; @@ -116,8 +172,8 @@ memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, unsigned int count; memcached_server_st *new_host_list; - if (!hostname) - return ptr; + if (hostname == NULL || error == NULL) + return NULL; if (!port) port= MEMCACHED_DEFAULT_PORT; @@ -136,7 +192,9 @@ memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, return NULL; } - host_reset(&new_host_list[count-1], hostname, port, MEMCACHED_CONNECTION_TCP); + host_reset(NULL, &new_host_list[count-1], hostname, port, MEMCACHED_CONNECTION_TCP); + + /* Backwards compatibility hack */ new_host_list[0].count++; @@ -146,7 +204,6 @@ memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, unsigned int memcached_server_list_count(memcached_server_st *ptr) { - if (ptr == NULL) return 0; @@ -155,10 +212,5 @@ unsigned int memcached_server_list_count(memcached_server_st *ptr) void memcached_server_list_free(memcached_server_st *ptr) { - unsigned int x; - - if (ptr == NULL) - return; - - free(ptr); + server_list_free(NULL, ptr); }