summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraham.Dumpleton <devnull@localhost>2008-01-24 10:30:11 +0000
committerGraham.Dumpleton <devnull@localhost>2008-01-24 10:30:11 +0000
commitb60c1d5aee0b07927d5872fd23e535838822bfc6 (patch)
tree505f8f695256e2d978104c44e6f9f863c6e0158b
parent2fd2ed53a2a7feb1bfce90625a064b212d576eab (diff)
downloadmod_wsgi-b60c1d5aee0b07927d5872fd23e535838822bfc6.tar.gz
Backport from 2.0 speed optimisations to way WSGI environment sent over socket
to daemon process.
-rw-r--r--mod_wsgi.c82
1 files changed, 45 insertions, 37 deletions
diff --git a/mod_wsgi.c b/mod_wsgi.c
index ded3ff5..980ab0b 100644
--- a/mod_wsgi.c
+++ b/mod_wsgi.c
@@ -6327,36 +6327,44 @@ static apr_status_t wsgi_socket_send(int fd, const void *buf, size_t buf_size)
return APR_SUCCESS;
}
-static apr_status_t wsgi_send_string(int fd, const char *s)
+static apr_status_t wsgi_send_strings(apr_pool_t *p, int fd, const char **s)
{
apr_status_t rv;
- int l;
- l = strlen(s);
+ apr_size_t total = 0;
- if ((rv = wsgi_socket_send(fd, &l, sizeof(l))) != APR_SUCCESS)
- return rv;
+ apr_size_t n;
+ apr_size_t i;
+ apr_size_t l;
- return wsgi_socket_send(fd, s, l);
-}
+ char *buffer;
+ char *offset;
-static apr_status_t wsgi_send_strings(int fd, const char **s)
-{
- apr_status_t rv;
- int n;
- int i;
+ total += sizeof(n);
for (n = 0; s[n]; n++)
- continue;
+ total += (strlen(s[n]) + 1);
- if ((rv = wsgi_socket_send(fd, &n, sizeof(n))) != APR_SUCCESS)
- return rv;
+ buffer = apr_palloc(p, total + sizeof(total));
+ offset = buffer;
+
+ memcpy(offset, &total, sizeof(total));
+ offset += sizeof(total);
+
+ memcpy(offset, &n, sizeof(n));
+ offset += sizeof(n);
for (i = 0; i < n; i++) {
- if ((rv = wsgi_send_string(fd, s[i])) != APR_SUCCESS)
- return rv;
+ l = (strlen(s[i]) + 1);
+ memcpy(offset, s[i], l);
+ offset += l;
}
+ total += sizeof(total);
+
+ if ((rv = wsgi_socket_send(fd, buffer, total)) != APR_SUCCESS)
+ return rv;
+
return APR_SUCCESS;
}
@@ -6389,7 +6397,7 @@ static apr_status_t wsgi_send_request(request_rec *r,
vars[j] = NULL;
- rv = wsgi_send_strings(daemon->fd, (const char **)vars);
+ rv = wsgi_send_strings(r->pool, daemon->fd, (const char **)vars);
if (rv != APR_SUCCESS)
return rv;
@@ -6655,38 +6663,38 @@ static apr_status_t wsgi_socket_read(apr_socket_t *sock, void *vbuf,
return APR_SUCCESS;
}
-static apr_status_t wsgi_read_string(apr_socket_t *sock, char **s,
- apr_pool_t *p)
+static apr_status_t wsgi_read_strings(apr_socket_t *sock, char ***s,
+ apr_pool_t *p)
{
apr_status_t rv;
- int l;
- if ((rv = wsgi_socket_read(sock, &l, sizeof(l))) != APR_SUCCESS)
- return rv;
+ apr_size_t total;
- *s = apr_pcalloc(p, l+1);
+ apr_size_t n;
+ apr_size_t i;
+ apr_size_t l;
- if (!l)
- return APR_SUCCESS;
+ char *buffer;
+ char *offset;
- return wsgi_socket_read(sock, *s, l);
-}
+ if ((rv = wsgi_socket_read(sock, &total, sizeof(total))) != APR_SUCCESS)
+ return rv;
-static apr_status_t wsgi_read_strings(apr_socket_t *sock, char ***s,
- apr_pool_t *p)
-{
- apr_status_t rv;
- int n;
- int i;
+ buffer = apr_palloc(p, total);
+ offset = buffer;
- if ((rv = wsgi_socket_read(sock, &n, sizeof(n))) != APR_SUCCESS)
+ if ((rv = wsgi_socket_read(sock, buffer, total)) != APR_SUCCESS)
return rv;
+ memcpy(&n, offset, sizeof(n));
+ offset += sizeof(n);
+
*s = apr_pcalloc(p, (n+1)*sizeof(**s));
for (i = 0; i < n; i++) {
- if ((rv = wsgi_read_string(sock, &(*s)[i], p)) != APR_SUCCESS)
- return rv;
+ l = strlen(offset) + 1;
+ (*s)[i] = offset;
+ offset += l;
}
return APR_SUCCESS;