From 5024a718c0429ce7042d5d6ec096a65a95775d21 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko <pmwkaa@gmail.com> Date: Thu, 6 Jun 2013 17:26:11 +0400 Subject: [PATCH] tp.h: fix buffer allocation supporting any writer https://github.com/mailru/tarantool/issues/20 --- connector/c/include/tp.h | 2 +- test/connector_c/tp.c | 120 +++++++++++++++++++++++++------------ test/connector_c/tp.result | 6 ++ 3 files changed, 90 insertions(+), 38 deletions(-) diff --git a/connector/c/include/tp.h b/connector/c/include/tp.h index d31b31a85d..9d2dcb08b4 100644 --- a/connector/c/include/tp.h +++ b/connector/c/include/tp.h @@ -334,7 +334,7 @@ tp_function_unused static char* tp_realloc(struct tp *p, size_t required, size_t *size) { size_t toalloc = tp_size(p) * 2; if (tp_unlikely(toalloc < required)) - toalloc = required; + toalloc = tp_size(p) + required; *size = toalloc; return realloc(p->s, toalloc); } diff --git a/test/connector_c/tp.c b/test/connector_c/tp.c index dbcc04ded3..3b36a5ebbc 100644 --- a/test/connector_c/tp.c +++ b/test/connector_c/tp.c @@ -1,8 +1,13 @@ +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> #include <stdio.h> #include <tp.h> -#if 0 static void reply_print(struct tp *rep) { while (tp_next(rep)) { printf("tuple fields: %d\n", tp_tuplecount(rep)); @@ -17,47 +22,87 @@ static void reply_print(struct tp *rep) { } } -static int reply(void) { - struct tp rep; - tp_init(&rep, NULL, 0, tp_realloc, NULL); - - while (1) { - ssize_t to_read = tp_req(&rep); - printf("to_read: %zu\n", to_read); - if (to_read <= 0) - break; - ssize_t new_size = tp_ensure(&rep, to_read); - printf("new_size: %zu\n", new_size); - if (new_size == -1) - return -1; - int rc = fread(rep.p, to_read, 1, stdin); - if (rc != 1) - return 1; - tp_use(&rep, to_read); - } - - ssize_t server_code = tp_reply(&rep); - - printf("op: %d\n", tp_replyop(&rep)); - printf("count: %d\n", tp_replycount(&rep)); - printf("code: %zu\n", server_code); - - if (server_code != 0) { - printf("error: %-.*s\n", tp_replyerrorlen(&rep), - tp_replyerror(&rep)); +static inline int +test_check_read(void) +{ + int sock; + struct sockaddr_in tt; + if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { + printf("Failed to create socket\n"); return 1; - } + } + + memset(&tt, 0, sizeof(tt)); + tt.sin_family = AF_INET; + tt.sin_addr.s_addr = inet_addr("127.0.0.1"); + tt.sin_port = htons(33013); + if (connect(sock, (struct sockaddr *) &tt, sizeof(tt)) < 0) { + printf("Failed to connect\n"); + return 1; + } + + { + struct tp req; + tp_init(&req, NULL, 0, tp_realloc, NULL); + tp_insert(&req, 0, 0); + tp_tuple(&req); + tp_sz(&req, "_i32"); + tp_sz(&req, "0e72ae1a-d0be-4e49-aeb9-aebea074363c"); + write(sock, tp_buf(&req), tp_used(&req)); + tp_free(&req); + } + + { + struct tp req; + tp_init(&req, NULL, 0, tp_realloc, NULL); + tp_select(&req, 0, 0, 0, 1); + tp_tuple(&req); + tp_sz(&req, "_i32"); + write(sock, tp_buf(&req), tp_used(&req)); + tp_free(&req); + } + + { + struct tp rep; + tp_init(&rep, NULL, 0, tp_realloc, NULL); + while (1) { + ssize_t to_read = tp_req(&rep); + if (to_read <= 0) + break; + ssize_t new_size = tp_ensure(&rep, to_read); + if (new_size == -1) { + // no memory (?) + return 1; + } + ssize_t res = read(sock, rep.p, to_read); + if (res == 0) { + // eof + return 1; + } else if (res < 0) { + // error + return 1; + } + tp_use(&rep, res); + } - reply_print(&rep); + ssize_t server_code = tp_reply(&rep); - /* - tp_rewind(&rep); - reply_print(&rep); - */ + printf("op: %d\n", tp_replyop(&rep)); + printf("count: %d\n", tp_replycount(&rep)); + printf("code: %zu\n", server_code); - return 0; + if (server_code != 0) { + printf("error: %-.*s\n", tp_replyerrorlen(&rep), + tp_replyerror(&rep)); + tp_free(&rep); + return 1; + } + reply_print(&rep); + tp_free(&rep); + } + + return 0; } -#endif static inline void test_check_buffer_initialized(void) { @@ -76,6 +121,7 @@ main(int argc, char *argv[]) (void)argv; test_check_buffer_initialized(); + assert(test_check_read() == 0); #if 0 if (argc == 2 && !strcmp(argv[1], "--reply")) diff --git a/test/connector_c/tp.result b/test/connector_c/tp.result index e69de29bb2..a98a068570 100644 --- a/test/connector_c/tp.result +++ b/test/connector_c/tp.result @@ -0,0 +1,6 @@ +op: 17 +count: 1 +code: 0 +tuple fields: 2 +tuple size: 42 +[_i32, 0e72ae1a-d0be-4e49-aeb9-aebea074363c] -- GitLab