X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=example%2Fmemcached_light.c;h=c4495b5946802eca82b3e4ae11ada8573d9bf9ac;hb=d4c5a2229396c74f3e66767f01ce4c8853eba92b;hp=b373a12f7fe7050945187142e8164aa75ef90b5a;hpb=9131482f7923cf9e90b5a715b38e70e3a229b052;p=awesomized%2Flibmemcached diff --git a/example/memcached_light.c b/example/memcached_light.c index b373a12f..c4495b59 100644 --- a/example/memcached_light.c +++ b/example/memcached_light.c @@ -15,8 +15,15 @@ * the more "logical" interface. * memcached_light.c - This file sets up all of the sockets and run the main * message loop. + * + * + * config.h is included so that I can use the ntohll/htonll on platforms that + * doesn't have that (this is a private function inside libmemcached, so you + * cannot use it directly from libmemcached without special modifications to + * the library) */ +#include "config.h" #include #include #include @@ -31,15 +38,17 @@ #include #include -#include "common.h" +#include #include "storage.h" +#include "memcached_light.h" -extern struct memcached_binary_protocol_callback_st interface_v0_impl; -extern struct memcached_binary_protocol_callback_st interface_v1_impl; +extern memcached_binary_protocol_callback_st interface_v0_impl; +extern memcached_binary_protocol_callback_st interface_v1_impl; static int server_sockets[1024]; static int num_server_sockets= 0; static void* socket_userdata_map[1024]; +static bool verbose= false; /** * Create a socket and bind it to a specific port number @@ -82,12 +91,14 @@ static int server_socket(const char *port) { } if ((flags & O_NONBLOCK) != O_NONBLOCK) + { if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) == -1) { perror("Failed to set socket to nonblocking mode"); close(sock); continue; } + } flags= 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&flags, sizeof(flags)) != 0) @@ -153,25 +164,33 @@ static const char* comcode2str(uint8_t cmd) /** * Print out the command we are about to execute */ -static void pre_execute(const void *cookie, protocol_binary_request_header *header) +static void pre_execute(const void *cookie __attribute__((unused)), + protocol_binary_request_header *header __attribute__((unused))) { - const char *cmd= comcode2str(header->request.opcode); - if (cmd != NULL) - fprintf(stderr, "pre_execute from %p: %s\n", cookie, cmd); - else - fprintf(stderr, "pre_execute from %p: 0x%02x\n", cookie, header->request.opcode); + if (verbose) + { + const char *cmd= comcode2str(header->request.opcode); + if (cmd != NULL) + fprintf(stderr, "pre_execute from %p: %s\n", cookie, cmd); + else + fprintf(stderr, "pre_execute from %p: 0x%02x\n", cookie, header->request.opcode); + } } /** * Print out the command we just executed */ -static void post_execute(const void *cookie, protocol_binary_request_header *header) +static void post_execute(const void *cookie __attribute__((unused)), + protocol_binary_request_header *header __attribute__((unused))) { - const char *cmd= comcode2str(header->request.opcode); - if (cmd != NULL) - fprintf(stderr, "post_execute from %p: %s\n", cookie, cmd); - else - fprintf(stderr, "post_execute from %p: 0x%02x\n", cookie, header->request.opcode); + if (verbose) + { + const char *cmd= comcode2str(header->request.opcode); + if (cmd != NULL) + fprintf(stderr, "post_execute from %p: %s\n", cookie, cmd); + else + fprintf(stderr, "post_execute from %p: 0x%02x\n", cookie, header->request.opcode); + } } /** @@ -209,9 +228,15 @@ int main(int argc, char **argv) { bool port_specified= false; int cmd; - struct memcached_binary_protocol_callback_st *interface= &interface_v0_impl; + memcached_binary_protocol_callback_st *interface= &interface_v0_impl; + + /* + * We need to initialize the handlers manually due to a bug in the + * warnings generated by struct initialization in gcc (all the way up to 4.4) + */ + initialize_interface_v0_handler(); - while ((cmd= getopt(argc, argv, "1p:?")) != EOF) + while ((cmd= getopt(argc, argv, "v1p:?")) != EOF) { switch (cmd) { case '1': @@ -221,13 +246,22 @@ int main(int argc, char **argv) port_specified= true; (void)server_socket(optarg); break; + case 'v': + verbose= true; + break; case '?': /* FALLTHROUGH */ default: - (void)fprintf(stderr, "Usage: %s [-p port]\n", argv[0]); + (void)fprintf(stderr, "Usage: %s [-p port] [-v] [-1]\n", argv[0]); return 1; } } + if (!initialize_storage()) + { + /* Error message already printed */ + return 1; + } + if (!port_specified) (void)server_socket("9999"); @@ -246,8 +280,8 @@ int main(int argc, char **argv) interface->post_execute= post_execute; interface->unknown= unknown; - struct memcached_binary_protocol_st *protocol_handle; - if ((protocol_handle= memcached_binary_protocol_create_instance()) == NULL) + struct memcached_protocol_st *protocol_handle; + if ((protocol_handle= memcached_protocol_create_instance()) == NULL) { fprintf(stderr, "Failed to allocate protocol handle\n"); return 1; @@ -266,7 +300,8 @@ int main(int argc, char **argv) return 0; } -static void work(void) { +static void work(void) +{ #define MAX_SERVERS_TO_POLL 100 struct pollfd fds[MAX_SERVERS_TO_POLL]; int max_poll; @@ -309,11 +344,11 @@ static void work(void) { continue; } - struct memcached_binary_protocol_st *protocol; + struct memcached_protocol_st *protocol; protocol= socket_userdata_map[fds[x].fd]; - struct memcached_binary_protocol_client_st* c; - c= memcached_binary_protocol_create_client(protocol, sock); + struct memcached_protocol_client_st* c; + c= memcached_protocol_create_client(protocol, sock); if (c == NULL) { fprintf(stderr, "Failed to create client\n"); @@ -331,23 +366,22 @@ static void work(void) { else { /* drive the client */ - struct memcached_binary_protocol_client_st* c; + struct memcached_protocol_client_st* c; c= socket_userdata_map[fds[x].fd]; assert(c != NULL); fds[max_poll].events= 0; - switch (memcached_binary_protocol_client_work(c)) - { - case WRITE_EVENT: - case READ_WRITE_EVENT: + memcached_protocol_event_t events= memcached_protocol_client_work(c); + if (events & MEMCACHED_PROTOCOL_WRITE_EVENT) fds[max_poll].events= POLLOUT; - /* FALLTHROUGH */ - case READ_EVENT: - fds[max_poll].events |= POLLIN; - break; - case ERROR_EVENT: - default: /* ERROR or unknown state.. close */ - memcached_binary_protocol_client_destroy(c); + + if (events & MEMCACHED_PROTOCOL_READ_EVENT) + fds[max_poll].events= POLLIN; + + if (!(events & MEMCACHED_PROTOCOL_PAUSE_EVENT || + fds[max_poll].events != 0)) + { + memcached_protocol_client_destroy(c); close(fds[x].fd); fds[x].events= 0;