From 306d61522a4decb33c761969a3bd0df9ed696d14 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 12 Mar 2009 15:12:32 +0000 Subject: [PATCH] * Removed userspace buffering. Everyone has TCP_CORK or TCP_NOPUSH nowadays. --- citadel/server.h | 4 --- citadel/sysdep.c | 79 ++++++++-------------------------------------- citadel/user_ops.c | 4 +-- 3 files changed, 15 insertions(+), 72 deletions(-) diff --git a/citadel/server.h b/citadel/server.h index 0860adb4a..577494ed5 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -123,10 +123,6 @@ struct CitContext { int redirect_ssl; #endif - int buffering; - char *output_buffer; /* hold output for one big dump */ - int buffer_len; - /* A linked list of all instant messages sent to us. */ struct ExpressMessage *FirstExpressMessage; int disable_exp; /* Set to 1 to disable incoming pages */ diff --git a/citadel/sysdep.c b/citadel/sysdep.c index 2e10704c7..995742b40 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -548,9 +548,8 @@ void CtdlFillSystemContext(struct CitContext *context, char *name) } /* - * The following functions implement output buffering. If the kernel supplies - * native TCP buffering (Linux & *BSD), use that; otherwise, emulate it with - * user-space buffering. + * The following functions implement output buffering on operating systems which + * support it (such as Linux and various BSD flavors). */ #ifndef HAVE_DARWIN #ifdef TCP_CORK @@ -563,64 +562,27 @@ void CtdlFillSystemContext(struct CitContext *context, char *name) #endif /* TCP_CORK */ #endif /* HAVE_DARWIN */ -#ifdef HAVE_TCP_BUFFERING static unsigned on = 1, off = 0; -void buffer_output(void) { - struct CitContext *ctx = MyContext(); - setsockopt(ctx->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4); - ctx->buffering = 1; -} -void unbuffer_output(void) { - struct CitContext *ctx = MyContext(); - setsockopt(ctx->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4); - ctx->buffering = 0; -} - -void flush_output(void) { - struct CitContext *ctx = MyContext(); - setsockopt(ctx->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4); - setsockopt(ctx->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4); -} -#else -#ifdef HAVE_DARWIN -/* Stub functions for Darwin/OS X where TCP buffering isn't liked at all */ void buffer_output(void) { - CC->buffering = 0; +#ifdef HAVE_TCP_BUFFERING + setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4); +#endif } + void unbuffer_output(void) { - CC->buffering = 0; -} -void flush_output(void) { -} -#else -void buffer_output(void) { - if (CC->buffering == 0) { - CC->buffering = 1; - CC->buffer_len = 0; - CC->output_buffer = malloc(SIZ); - } +#ifdef HAVE_TCP_BUFFERING + setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4); +#endif } void flush_output(void) { - if (CC->buffering == 1) { - client_write(CC->output_buffer, CC->buffer_len); - CC->buffer_len = 0; - } -} - -void unbuffer_output(void) { - if (CC->buffering == 1) { - CC->buffering = 0; - /* We don't call flush_output because we can't. */ - client_write(CC->output_buffer, CC->buffer_len); - CC->buffer_len = 0; - free(CC->output_buffer); - CC->output_buffer = NULL; - } +#ifdef HAVE_TCP_BUFFERING + struct CitContext *CCC = CC; + setsockopt(CCC->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4); + setsockopt(CCC->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4); +#endif } -#endif /* HAVE_DARWIN */ -#endif /* HAVE_TCP_BUFFERING */ @@ -651,19 +613,6 @@ int client_write(char *buf, int nbytes) return 0; } -#ifndef HAVE_TCP_BUFFERING - /* If we're buffering for later, do that now. */ - if (Ctx->buffering) { - old_buffer_len = Ctx->buffer_len; - Ctx->buffer_len += nbytes; - Ctx->output_buffer = realloc(Ctx->output_buffer, Ctx->buffer_len); - memcpy(&Ctx->output_buffer[old_buffer_len], buf, nbytes); - return 0; - } -#endif - - /* Ok, at this point we're not buffering. Go ahead and write. */ - #ifdef HAVE_OPENSSL if (Ctx->redirect_ssl) { client_write_ssl(buf, nbytes); diff --git a/citadel/user_ops.c b/citadel/user_ops.c index 9c0952cce..e9f5b6d11 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -728,9 +728,7 @@ void logout(void) purge_user(CCC->user.fullname); /* Free any output buffers */ - if (CCC->output_buffer != NULL) { - unbuffer_output(); - } + unbuffer_output(); } /* -- 2.30.2