X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=libmemcached%2Fserver.c;h=f480750d8679079c5003ce4448c834777da91c6d;hb=2c51ea585ccfbf3a14fed6d28f9115292ad0e6fc;hp=516cd2c460c62ed4bd9e8602f4514499e347e7c0;hpb=ce11ec5eadbc51ff26aa6b64f52cf36e6b703f46;p=awesomized%2Flibmemcached diff --git a/libmemcached/server.c b/libmemcached/server.c index 516cd2c4..f480750d 100644 --- a/libmemcached/server.c +++ b/libmemcached/server.c @@ -19,6 +19,7 @@ static inline void _server_init(memcached_server_st *self, const memcached_st *r uint32_t weight, memcached_connection_t type) { self->options.sockaddr_inited= false; + self->options.is_shutting_down= false; self->number_of_hosts= 0; self->cursor_active= 0; self->port= port; @@ -53,14 +54,14 @@ static inline void _server_init(memcached_server_st *self, const memcached_st *r if (hostname == NULL) self->hostname[0]= 0; else - strncpy(self->hostname, hostname, MEMCACHED_MAX_HOST_LENGTH - 1); + strncpy(self->hostname, hostname, NI_MAXHOST - 1); } static memcached_server_st *_server_create(memcached_server_st *self, const memcached_st *memc) { if (self == NULL) { - self= (memcached_server_st *)memc->call_malloc(memc, sizeof(memcached_server_st)); + self= (memcached_server_st *)libmemcached_malloc(memc, sizeof(memcached_server_st)); if (! self) return NULL; /* MEMCACHED_MEMORY_ALLOCATION_FAILURE */ @@ -100,7 +101,7 @@ memcached_server_st *memcached_server_create_with(const memcached_st *memc, memc void memcached_server_free(memcached_server_st *self) { - memcached_quit_server(self, 0); + memcached_quit_server(self, false); if (self->cached_server_error) free(self->cached_server_error); @@ -110,7 +111,7 @@ void memcached_server_free(memcached_server_st *self) if (memcached_is_allocated(self)) { - self->root->call_free(self->root, self); + libmemcached_free(self->root, self); } else { @@ -227,3 +228,38 @@ void memcached_server_list_free(memcached_server_st *ptr) { server_list_free(NULL, ptr); } + +/** + @todo allow lists to query themselves even if they lack a root +*/ +memcached_return_t memcached_server_remove(memcached_server_st *st_ptr) +{ + uint32_t x, host_index; + memcached_st *root= (memcached_st *)st_ptr->root; + memcached_server_st *list; + + if (root == NULL) + return MEMCACHED_FAILURE; + + list= memcached_server_list(root); + + for (x= 0, host_index= 0; x < memcached_server_count(root); x++) + { + if (strncmp(list[x].hostname, st_ptr->hostname, NI_MAXHOST) != 0 || list[x].port != st_ptr->port) + { + if (host_index != x) + memcpy(list+host_index, list+x, sizeof(memcached_server_st)); + host_index++; + } + } + root->number_of_hosts= host_index; + + if (st_ptr->address_info) + { + freeaddrinfo(st_ptr->address_info); + st_ptr->address_info= NULL; + } + run_distribution(root); + + return MEMCACHED_SUCCESS; +}