#include <libmemcached/common.h>
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+
void initialize_binary_request(org::libmemcached::Instance* server, protocol_binary_request_header& header)
{
server->request_id++;
do {
/* Just try a single read to grab what's available */
ssize_t nr;
- if ((nr= recv(ptr->fd,
+ if ((nr= ::recv(ptr->fd,
ptr->read_ptr + ptr->read_data_length,
MEMCACHED_MAX_BUFFER - ptr->read_data_length,
- MSG_DONTWAIT)) <= 0)
+ MSG_NOSIGNAL)) <= 0)
{
if (nr == 0)
{
int local_errno= EINVAL;
int err;
socklen_t len= sizeof (err);
- if (getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len) == 0)
+ if (getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, (char*)&err, &len) == 0)
{
if (err == 0) // treat this as EINTR
{
int flags;
if (with_flush)
{
- flags= MSG_NOSIGNAL|MSG_DONTWAIT;
+ flags= MSG_NOSIGNAL;
}
else
{
- flags= MSG_NOSIGNAL|MSG_DONTWAIT|MSG_MORE;
+ flags= MSG_NOSIGNAL|MSG_MORE;
}
ssize_t sent_length= ::send(ptr->fd, local_write_ptr, write_length, flags);
ssize_t data_read;
do
{
- data_read= ::recv(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER, MSG_DONTWAIT);
+ data_read= ::recv(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER, MSG_NOSIGNAL);
if (data_read == SOCKET_ERROR)
{
switch (get_socket_errno())
char buffer[MEMCACHED_MAX_BUFFER];
do
{
- data_read= recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_DONTWAIT);
+ data_read= ::recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_NOSIGNAL);
if (data_read == SOCKET_ERROR)
{
switch (get_socket_errno())
return (complete_total == total);
}
-
-void memcached_io_close(org::libmemcached::Instance* ptr)
+void org::libmemcached::Instance::start_close_socket()
{
- if (ptr->fd == INVALID_SOCKET)
+ if (fd != INVALID_SOCKET)
{
- return;
+ shutdown(fd, SHUT_WR);
+ options.is_shutting_down= true;
}
+}
- /* in case of death shutdown to avoid blocking at close() */
- if (shutdown(ptr->fd, SHUT_RDWR) == SOCKET_ERROR && get_socket_errno() != ENOTCONN)
+void org::libmemcached::Instance::close_socket()
+{
+ if (fd != INVALID_SOCKET)
{
- WATCHPOINT_NUMBER(ptr->fd);
- WATCHPOINT_ERRNO(get_socket_errno());
- WATCHPOINT_ASSERT(get_socket_errno());
- }
+ /* in case of death shutdown to avoid blocking at close() */
+ if (shutdown(fd, SHUT_RDWR) == SOCKET_ERROR and get_socket_errno() != ENOTCONN)
+ {
+ WATCHPOINT_NUMBER(fd);
+ WATCHPOINT_ERRNO(get_socket_errno());
+ WATCHPOINT_ASSERT(get_socket_errno());
+ }
- if (closesocket(ptr->fd) == SOCKET_ERROR)
- {
- WATCHPOINT_ERRNO(get_socket_errno());
+ if (closesocket(fd) == SOCKET_ERROR)
+ {
+ WATCHPOINT_ERRNO(get_socket_errno());
+ }
+ state= MEMCACHED_SERVER_STATE_NEW;
+ fd= INVALID_SOCKET;
}
- ptr->state= MEMCACHED_SERVER_STATE_NEW;
- ptr->fd= INVALID_SOCKET;
}
-org::libmemcached::Instance* memcached_io_get_readable_server(memcached_st *memc)
+org::libmemcached::Instance* memcached_io_get_readable_server(memcached_st *memc, memcached_return_t&)
{
#define MAX_SERVERS_TO_POLL 100
struct pollfd fds[MAX_SERVERS_TO_POLL];
return instance;
}
- if (memcached_instance_response_count(instance) > 0)
+ if (instance->response_count() > 0)
{
fds[host_index].events= POLLIN;
fds[host_index].revents= 0;
{
org::libmemcached::Instance* instance= memcached_instance_fetch(memc, x);
- if (memcached_instance_response_count(instance) > 0)
+ if (instance->response_count() > 0)
{
return instance;
}