X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Finstance.cc;h=53f74f79365ee5d5a48e11a3f78e1497232db8e7;hb=4c1122cf139f7b073807f0a9187306518988a08f;hp=dea8dd62d10f512477391400f5f56b58f816a763;hpb=7acbb1495e0aaa29df7ffb09b90ec97fc949c48d;p=awesomized%2Flibmemcached diff --git a/libmemcached/instance.cc b/libmemcached/instance.cc index dea8dd62..53f74f79 100644 --- a/libmemcached/instance.cc +++ b/libmemcached/instance.cc @@ -37,13 +37,16 @@ #include -static inline void _server_init(org::libmemcached::Instance* self, memcached_st *root, +static inline void _server_init(memcached_instance_st* self, Memcached *root, const memcached_string_t& hostname, in_port_t port, uint32_t weight, memcached_connection_t type) { self->options.is_shutting_down= false; self->options.is_dead= false; + self->options.ready= false; + self->_events= 0; + self->_revents= 0; self->cursor_active_= 0; self->port_= port; self->fd= INVALID_SOCKET; @@ -51,6 +54,8 @@ static inline void _server_init(org::libmemcached::Instance* self, memcached_st self->request_id= 0; self->server_failure_counter= 0; self->server_failure_counter_query_id= 0; + self->server_timeout_counter= 0; + self->server_timeout_counter_query_id= 0; self->weight= weight ? weight : 1; // 1 is the default weight value self->io_wait_count.read= 0; self->io_wait_count.write= 0; @@ -81,15 +86,14 @@ static inline void _server_init(org::libmemcached::Instance* self, memcached_st self->version= UINT_MAX; } self->limit_maxbytes= 0; - memcpy(self->hostname, hostname.c_str, hostname.size); - self->hostname[hostname.size]= 0; + self->hostname(hostname); } -static org::libmemcached::Instance* _server_create(org::libmemcached::Instance* self, const memcached_st *memc) +static memcached_instance_st* _server_create(memcached_instance_st* self, const memcached_st *memc) { if (self == NULL) { - self= libmemcached_xmalloc(memc, org::libmemcached::Instance); + self= libmemcached_xmalloc(memc, memcached_instance_st); if (self == NULL) { @@ -108,8 +112,29 @@ static org::libmemcached::Instance* _server_create(org::libmemcached::Instance* return self; } -org::libmemcached::Instance* __instance_create_with(memcached_st *memc, - org::libmemcached::Instance* self, +void memcached_instance_st::events(short arg) +{ + if ((_events | arg) == _events) + { + return; + } + + _events|= arg; +} + +void memcached_instance_st::revents(short arg) +{ + if (arg) + { + options.ready= true; + } + + _revents= arg; + _events&= short(~arg); +} + +memcached_instance_st* __instance_create_with(memcached_st *memc, + memcached_instance_st* self, const memcached_string_t& hostname, const in_port_t port, uint32_t weight, @@ -136,24 +161,14 @@ org::libmemcached::Instance* __instance_create_with(memcached_st *memc, memcached_io_init_udp_header(self, 0); } - if (memc) - { - memcached_connect_try(self); - } - return self; } -void __instance_free(org::libmemcached::Instance* self) +void __instance_free(memcached_instance_st* self) { memcached_quit_server(self, false); - if (self->address_info) - { - freeaddrinfo(self->address_info); - self->address_info= NULL; - self->address_info_next= NULL; - } + self->clear_addrinfo(); assert(self->address_info_next == NULL); memcached_error_free(*self); @@ -168,7 +183,7 @@ void __instance_free(org::libmemcached::Instance* self) } } -void memcached_instance_free(org::libmemcached::Instance* self) +void memcached_instance_free(memcached_instance_st* self) { if (self) { @@ -176,25 +191,26 @@ void memcached_instance_free(org::libmemcached::Instance* self) } } -memcached_return_t memcached_server_cursor(const memcached_st *ptr, +memcached_return_t memcached_server_cursor(const memcached_st* shell, const memcached_server_fn *callback, void *context, uint32_t number_of_callbacks) { + const Memcached* memc= memcached2Memcached(shell); memcached_return_t rc; - if (memcached_failed(rc= initialize_const_query(ptr))) + if (memcached_failed(rc= initialize_const_query(memc))) { return rc; } size_t errors= 0; - for (uint32_t x= 0; x < memcached_instance_list_count(ptr); x++) + for (uint32_t x= 0; x < memcached_instance_list_count(memc); x++) { - org::libmemcached::Instance* instance= memcached_instance_by_position(ptr, x); + memcached_instance_st* instance= memcached_instance_by_position(memc, x); for (uint32_t y= 0; y < number_of_callbacks; y++) { - memcached_return_t ret= (*callback[y])(ptr, instance, context); + memcached_return_t ret= (*callback[y])(memc, instance, context); if (memcached_failed(ret)) { @@ -207,7 +223,7 @@ memcached_return_t memcached_server_cursor(const memcached_st *ptr, return errors ? MEMCACHED_SOME_ERRORS : MEMCACHED_SUCCESS; } -memcached_return_t memcached_server_execute(memcached_st *ptr, +memcached_return_t memcached_server_execute(memcached_st *memc, memcached_server_execute_fn callback, void *context) { @@ -217,11 +233,11 @@ memcached_return_t memcached_server_execute(memcached_st *ptr, } bool some_errors= false;; - for (uint32_t x= 0; x < memcached_instance_list_count(ptr); x++) + for (uint32_t x= 0; x < memcached_instance_list_count(memc); x++) { - org::libmemcached::Instance* instance= memcached_instance_fetch(ptr, x); + memcached_instance_st* instance= memcached_instance_fetch(memc, x); - memcached_return_t rc= (*callback)(ptr, instance, context); + memcached_return_t rc= (*callback)(memc, instance, context); if (rc == MEMCACHED_INVALID_ARGUMENTS) { return rc; @@ -236,11 +252,12 @@ memcached_return_t memcached_server_execute(memcached_st *ptr, return MEMCACHED_SUCCESS; } -memcached_server_instance_st memcached_server_by_key(memcached_st *ptr, +const memcached_instance_st * memcached_server_by_key(memcached_st *shell, const char *key, size_t key_length, memcached_return_t *error) { + Memcached* memc= memcached2Memcached(shell); memcached_return_t unused; if (error == NULL) { @@ -249,26 +266,26 @@ memcached_server_instance_st memcached_server_by_key(memcached_st *ptr, memcached_return_t rc; - if (memcached_failed(rc= initialize_const_query(ptr))) + if (memcached_failed(rc= initialize_const_query(memc))) { *error= rc; return NULL; } - if (memcached_failed((memcached_key_test(*ptr, (const char **)&key, &key_length, 1)))) + if (memcached_failed((memcached_key_test(*memc, (const char **)&key, &key_length, 1)))) { - *error= memcached_last_error(ptr); + *error= memcached_last_error(memc); return NULL; } - uint32_t server_key= memcached_generate_hash(ptr, key, key_length); - return memcached_instance_by_position(ptr, server_key); + uint32_t server_key= memcached_generate_hash(memc, key, key_length); + return memcached_instance_by_position(memc, server_key); } /* If we do not have a valid object to clone from, we toss an error. */ -static org::libmemcached::Instance* memcached_instance_clone(org::libmemcached::Instance* source) +static memcached_instance_st* memcached_instance_clone(memcached_instance_st* source) { /* We just do a normal create if source is missing */ if (source == NULL) @@ -276,15 +293,15 @@ static org::libmemcached::Instance* memcached_instance_clone(org::libmemcached:: return NULL; } - memcached_string_t hostname= { memcached_string_make_from_cstr(source->hostname) }; + memcached_string_t hostname_= { memcached_string_make_from_cstr(source->hostname()) }; return __instance_create_with(source->root, NULL, - hostname, + hostname_, source->port(), source->weight, source->type); } -void set_last_disconnected_host(org::libmemcached::Instance* self) +void set_last_disconnected_host(memcached_instance_st* self) { assert(self->root); if (self->root) @@ -298,33 +315,48 @@ void set_last_disconnected_host(org::libmemcached::Instance* self) // const_cast memcached_st *root= (memcached_st *)self->root; - memcached_instance_free((org::libmemcached::Instance*)(root->last_disconnected_server)); + memcached_instance_free((memcached_instance_st*)(root->last_disconnected_server)); // We set is_parsing so that no lookup happens root->state.is_parsing= true; root->last_disconnected_server= memcached_instance_clone(self); root->state.is_parsing= false; - ((org::libmemcached::Instance*)memcached_server_get_last_disconnect(root))->version= self->version; + ((memcached_instance_st*)memcached_server_get_last_disconnect(root))->version= self->version; } } -memcached_server_instance_st memcached_server_get_last_disconnect(const memcached_st *self) +const memcached_instance_st * memcached_server_get_last_disconnect(const memcached_st *shell) { - WATCHPOINT_ASSERT(self); - if (self == NULL) + const Memcached* self= memcached2Memcached(shell); + if (self) { - return 0; + return (const memcached_instance_st *)self->last_disconnected_server; } - return (memcached_server_instance_st)self->last_disconnected_server; + return 0; } -void memcached_instance_next_retry(memcached_server_instance_st self, const time_t absolute_time) +void memcached_instance_next_retry(const memcached_instance_st * self, const time_t absolute_time) { WATCHPOINT_ASSERT(self); if (self) { - ((org::libmemcached::Instance*)self)->next_retry= absolute_time; + ((memcached_instance_st*)self)->next_retry= absolute_time; + } +} + +bool memcached_instance_st::valid() const +{ + if (fd == INVALID_SOCKET) + { + return false; } + + return true; +} + +bool memcached_instance_st::is_shutting_down() const +{ + return options.is_shutting_down; }