diff options
author | Graham.Dumpleton <devnull@localhost> | 2008-01-24 10:30:11 +0000 |
---|---|---|
committer | Graham.Dumpleton <devnull@localhost> | 2008-01-24 10:30:11 +0000 |
commit | b60c1d5aee0b07927d5872fd23e535838822bfc6 (patch) | |
tree | 505f8f695256e2d978104c44e6f9f863c6e0158b | |
parent | 2fd2ed53a2a7feb1bfce90625a064b212d576eab (diff) | |
download | mod_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.c | 82 |
1 files changed, 45 insertions, 37 deletions
@@ -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; |