#include <libmemcached/common.h>
-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->number_of_hosts= 0;
+ self->options.ready= false;
+ self->_events= 0;
+ self->_revents= 0;
self->cursor_active_= 0;
self->port_= port;
self->fd= INVALID_SOCKET;
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)
{
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,
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);
}
}
-void memcached_instance_free(org::libmemcached::Instance* self)
+void memcached_instance_free(memcached_instance_st* self)
{
- if (self == NULL)
+ if (self)
{
- return;
+ __instance_free(self);
}
-
- __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(org::libmemcached::Instance* source)
-{
- /* We just do a normal create if source is missing */
- if (source == NULL)
- {
- return NULL;
- }
-
- 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++)
{
- 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))
{
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)
{
}
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;
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)
{
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)
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 == 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 (memcached_server_get_last_disconnect(self->root) and
- memcached_server_get_last_disconnect(self->root)->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((memcached_instance_st*)(root->last_disconnected_server));
- memcached_instance_free((org::libmemcached::Instance*)(root->last_disconnected_server));
- root->last_disconnected_server= memcached_instance_clone(self);
- ((org::libmemcached::Instance*)memcached_server_get_last_disconnect(root))->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;
+ ((memcached_instance_st*)memcached_server_get_last_disconnect(root))->version= self->version;
}
-
- return (memcached_server_instance_st)self->last_disconnected_server;
}
-uint32_t memcached_instance_set_count(org::libmemcached::Instance* servers, uint32_t count)
+const memcached_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 (const memcached_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(const memcached_instance_st * self, const time_t absolute_time)
{
WATCHPOINT_ASSERT(self);
- if (self == NULL)
- return NULL;
-
- return self->hostname;
-}
-
-in_port_t memcached_instance_port(const memcached_server_instance_st self)
-{
- WATCHPOINT_ASSERT(self);
- if (self == NULL)
+ if (self)
{
- return 0;
+ ((memcached_instance_st*)self)->next_retry= absolute_time;
}
-
- return self->port();
}
-void memcached_instance_next_retry(memcached_server_instance_st self, const time_t absolute_time)
+bool memcached_instance_st::valid() const
{
- WATCHPOINT_ASSERT(self);
- if (self)
+ if (fd == INVALID_SOCKET)
{
- ((org::libmemcached::Instance*)self)->next_retry= absolute_time;
+ return false;
}
+
+ return true;
}
-uint32_t memcached_instance_response_count(const org::libmemcached::Instance* self)
+bool memcached_instance_st::is_shutting_down() const
{
- WATCHPOINT_ASSERT(self);
- if (self == NULL)
- {
- return 0;
- }
-
- return self->cursor_active_;
+ return options.is_shutting_down;
}