X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Finstance.cc;h=593465d8684b324b2026286b18e9a766faabb481;hb=326e812b0ca940bf90aaadf69312a0316091d0cb;hp=0662b8f627c60c27959880c132efd787bfead4f8;hpb=999006a8904a0f08293f1df7bda81bff914b091a;p=awesomized%2Flibmemcached diff --git a/libmemcached/instance.cc b/libmemcached/instance.cc index 0662b8f6..593465d8 100644 --- a/libmemcached/instance.cc +++ b/libmemcached/instance.cc @@ -35,21 +35,20 @@ * */ -/* - This is a partial implementation for fetching/creating memcached_instance_st objects. -*/ #include -static inline void _server_init(memcached_instance_st *self, memcached_st *root, +static inline void _server_init(org::libmemcached::Instance* 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->number_of_hosts= 0; - self->cursor_active= 0; - self->port= port; + self->options.ready= false; + self->_events= 0; + self->_revents= 0; + self->cursor_active_= 0; + self->port_= port; self->fd= INVALID_SOCKET; self->io_bytes_sent= 0; self->request_id= 0; @@ -89,11 +88,11 @@ static inline void _server_init(memcached_instance_st *self, memcached_st *root, self->hostname[hostname.size]= 0; } -static memcached_instance_st *_server_create(memcached_instance_st *self, const memcached_st *memc) +static org::libmemcached::Instance* _server_create(org::libmemcached::Instance* self, const memcached_st *memc) { if (self == NULL) { - self= libmemcached_xmalloc(memc, struct memcached_instance_st); + self= libmemcached_xmalloc(memc, org::libmemcached::Instance); if (self == NULL) { @@ -112,12 +111,33 @@ static memcached_instance_st *_server_create(memcached_instance_st *self, const return self; } -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, - const memcached_connection_t type) +void org::libmemcached::Instance::events(short arg) +{ + if ((_events | arg) == _events) + { + return; + } + + _events|= arg; +} + +void org::libmemcached::Instance::revents(short arg) +{ + if (arg) + { + options.ready= true; + } + + _revents= arg; + _events&= short(~arg); +} + +org::libmemcached::Instance* __instance_create_with(memcached_st *memc, + org::libmemcached::Instance* self, + const memcached_string_t& hostname, + const in_port_t port, + uint32_t weight, + const memcached_connection_t type) { if (memcached_is_valid_servername(hostname) == false) { @@ -140,15 +160,10 @@ memcached_instance_st *__instance_create_with(memcached_st *memc, memcached_io_init_udp_header(self, 0); } - if (memc) - { - memcached_connect_try(self); - } - return self; } -void __instance_free(memcached_instance_st *self) +void __instance_free(org::libmemcached::Instance* self) { memcached_quit_server(self, false); @@ -158,6 +173,7 @@ void __instance_free(memcached_instance_st *self) self->address_info= NULL; self->address_info_next= NULL; } + assert(self->address_info_next == NULL); memcached_error_free(*self); @@ -171,61 +187,34 @@ void __instance_free(memcached_instance_st *self) } } -void memcached_instance_free(memcached_instance_st *self) +void memcached_instance_free(org::libmemcached::Instance* self) { - if (self == NULL) - { - return; - } - - if (memcached_instance_count(self)) - { - memcached_instance_list_free(self, memcached_instance_count(self)); - return; - } - - __instance_free(self); -} - -/* - If we do not have a valid object to clone from, we toss an error. -*/ -memcached_server_st *memcached_instance_2_server(memcached_instance_st *source) -{ - /* We just do a normal create if source is missing */ - if (source == NULL) + if (self) { - return NULL; + __instance_free(self); } - - memcached_string_t hostname= { memcached_string_make_from_cstr(source->hostname) }; - return __server_create_with(source->root, NULL, - hostname, - source->port, source->weight, - source->type); - } -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++) { - memcached_server_instance_st instance= - memcached_server_instance_by_position(ptr, x); + org::libmemcached::Instance* 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)) { @@ -238,7 +227,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) { @@ -248,11 +237,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++) { - memcached_instance_st* instance= memcached_server_instance_fetch(ptr, x); + org::libmemcached::Instance* 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; @@ -267,39 +256,40 @@ memcached_return_t memcached_server_execute(memcached_st *ptr, return MEMCACHED_SUCCESS; } -memcached_server_instance_st memcached_server_by_key(memcached_st *ptr, +memcached_server_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 (not error) + if (error == NULL) { error= &unused; } 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_server_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 memcached_instance_st *memcached_instance_clone(memcached_instance_st *source) +static org::libmemcached::Instance* memcached_instance_clone(org::libmemcached::Instance* source) { /* We just do a normal create if source is missing */ if (source == NULL) @@ -311,80 +301,72 @@ static memcached_instance_st *memcached_instance_clone(memcached_instance_st *so return __instance_create_with(source->root, NULL, hostname, - source->port, source->weight, + source->port(), source->weight, source->type); } -void set_last_disconnected_host(memcached_server_write_instance_st self) +void set_last_disconnected_host(org::libmemcached::Instance* self) { assert(self->root); - if (self->root == NULL) + if (self->root) { - return; - } + if (memcached_server_get_last_disconnect(self->root) and + memcached_server_get_last_disconnect(self->root)->version == self->version) + { + return; + } - if (self->root->last_disconnected_server and self->root->last_disconnected_server->version == self->version) - { - return; - } + // const_cast + memcached_st *root= (memcached_st *)self->root; - // const_cast - memcached_st *root= (memcached_st *)self->root; + memcached_instance_free((org::libmemcached::Instance*)(root->last_disconnected_server)); - memcached_instance_free(root->last_disconnected_server); - root->last_disconnected_server= memcached_instance_clone(self); - root->last_disconnected_server->version= self->version; -} + // 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; -memcached_server_instance_st memcached_server_get_last_disconnect(const memcached_st *self) -{ - WATCHPOINT_ASSERT(self); - if (self == NULL) - { - return 0; + ((org::libmemcached::Instance*)memcached_server_get_last_disconnect(root))->version= self->version; } - - return self->last_disconnected_server; } -uint32_t memcached_instance_set_count(memcached_instance_st *servers, uint32_t count) +memcached_server_instance_st memcached_server_get_last_disconnect(const memcached_st *shell) { - WATCHPOINT_ASSERT(servers); - if (servers == NULL) + const Memcached* self= memcached2Memcached(shell); + if (self) { - return 0; + return (memcached_server_instance_st)self->last_disconnected_server; } - return servers->number_of_hosts= count; + return 0; } -const char *memcached_instance_name(const memcached_server_instance_st self) +void memcached_instance_next_retry(memcached_server_instance_st self, const time_t absolute_time) { WATCHPOINT_ASSERT(self); - if (self == NULL) - return NULL; - - return self->hostname; + if (self) + { + ((org::libmemcached::Instance*)self)->next_retry= absolute_time; + } } -in_port_t memcached_instance_port(const memcached_server_instance_st self) -{ - WATCHPOINT_ASSERT(self); - if (self == NULL) +namespace org { +namespace libmemcached { + + bool Instance::valid() const { - return 0; - } + if (fd == INVALID_SOCKET) + { + return false; + } - return self->port; -} + return true; + } -uint32_t memcached_instance_response_count(const memcached_instance_st* self) -{ - WATCHPOINT_ASSERT(self); - if (self == NULL) + bool Instance::is_shutting_down() const { - return 0; + return options.is_shutting_down; } - return self->cursor_active; -} +} // namespace libmemcached +} // namespace org