]> granicus.if.org Git - apache/commitdiff
Get perchild serving pages again. This doesn't work completely, namely it
authorRyan Bloom <rbb@apache.org>
Mon, 11 Dec 2000 23:42:01 +0000 (23:42 +0000)
committerRyan Bloom <rbb@apache.org>
Mon, 11 Dec 2000 23:42:01 +0000 (23:42 +0000)
can't really pass the data correctly yet, but at least it serves pages
correctly when the correct child accepts the page.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87290 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/experimental/perchild/perchild.c
server/mpm/perchild/perchild.c

index 6dc86fc1693513ce13e3f76f1b7a4a2a06dd7733..72ea97fe576f33494b84cf710aba48c52cc343c7 100644 (file)
@@ -1346,6 +1346,7 @@ static int pass_request(request_rec *r)
     struct cmsghdr *cmsg;
     int sfd;
     struct iovec iov;
+    ap_bucket_brigade *bb = ap_brigade_create(r->pool);
     perchild_server_conf *sconf = (perchild_server_conf *)
                             ap_get_module_config(r->server->module_config, 
                                                  &mpm_perchild_module);
@@ -1383,6 +1384,16 @@ static int pass_request(request_rec *r)
 
     write(sconf->sd2, foo, len);
    
+    while (ap_get_brigade(r->input_filters, bb, AP_MODE_NONBLOCKING) != APR_SUCCESS) {
+        ap_bucket *e;
+        AP_BRIGADE_FOREACH(e, bb) {
+            const char *str;
+
+            ap_bucket_read(e, &str, &len, AP_NONBLOCK_READ);
+            write(sconf->sd2, str, len);
+        }
+    }
+
     apr_destroy_pool(r->pool);
     return 1;
 }
@@ -1430,11 +1441,20 @@ static void perchild_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *pt
 
 static int perchild_post_read(request_rec *r)
 {
+    ap_filter_t *f = r->connection->input_filters;
     int thread_num = r->connection->id % HARD_THREAD_LIMIT;
     perchild_server_conf *sconf = (perchild_server_conf *)
                             ap_get_module_config(r->server->module_config, 
                                                  &mpm_perchild_module);
 
+    while (f) {
+        if (!strcmp("PERCHILD_BUFFER", f->frec->name)) {
+            ap_remove_output_filter(f);
+            break;
+        }
+        f = f->next;
+    }
+
     if (thread_socket_table[thread_num] != -1) {
         apr_socket_t *csd = NULL;
 
@@ -1462,24 +1482,29 @@ static apr_status_t perchild_buffer(ap_filter_t *f, ap_bucket_brigade *b, ap_inp
 {
     ap_bucket *e;
     apr_status_t rv;
+    char *buffer = NULL;
+    const char *str;
+    apr_size_t len;
 
     if ((rv = ap_get_brigade(f->next, b, mode)) != APR_SUCCESS) {
         return rv;
     }
 
+    apr_get_userdata((void **)&buffer, "PERCHILD_BUFFER", f->c->pool);
 
     AP_BRIGADE_FOREACH(e, b) {
-        char *buffer = NULL;
-       const char *str;
-        apr_size_t len;
-
-        apr_get_userdata((void **)&buffer, "PERCHILD_BUFFER", f->c->pool);
-
-        ap_bucket_read(e, &str, &len, AP_NONBLOCK_READ);
-        apr_pstrcat(f->c->pool, buffer, str);
-
-        apr_set_userdata(&buffer, "PERCHILD_BUFFER", apr_null_cleanup, f->c->pool);
+        if (e->length != 0) {
+            ap_bucket_read(e, &str, &len, AP_NONBLOCK_READ);
+       
+            if (buffer == NULL) {
+                buffer = apr_pstrdup(f->c->pool, str);
+            }
+            else {
+               buffer = apr_pstrcat(f->c->pool, buffer, str, NULL);
+            } 
+        }
     }
+    apr_set_userdata(buffer, "PERCHILD_BUFFER", apr_null_cleanup, f->c->pool);
     
     return APR_SUCCESS;
 }
index 6dc86fc1693513ce13e3f76f1b7a4a2a06dd7733..72ea97fe576f33494b84cf710aba48c52cc343c7 100644 (file)
@@ -1346,6 +1346,7 @@ static int pass_request(request_rec *r)
     struct cmsghdr *cmsg;
     int sfd;
     struct iovec iov;
+    ap_bucket_brigade *bb = ap_brigade_create(r->pool);
     perchild_server_conf *sconf = (perchild_server_conf *)
                             ap_get_module_config(r->server->module_config, 
                                                  &mpm_perchild_module);
@@ -1383,6 +1384,16 @@ static int pass_request(request_rec *r)
 
     write(sconf->sd2, foo, len);
    
+    while (ap_get_brigade(r->input_filters, bb, AP_MODE_NONBLOCKING) != APR_SUCCESS) {
+        ap_bucket *e;
+        AP_BRIGADE_FOREACH(e, bb) {
+            const char *str;
+
+            ap_bucket_read(e, &str, &len, AP_NONBLOCK_READ);
+            write(sconf->sd2, str, len);
+        }
+    }
+
     apr_destroy_pool(r->pool);
     return 1;
 }
@@ -1430,11 +1441,20 @@ static void perchild_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *pt
 
 static int perchild_post_read(request_rec *r)
 {
+    ap_filter_t *f = r->connection->input_filters;
     int thread_num = r->connection->id % HARD_THREAD_LIMIT;
     perchild_server_conf *sconf = (perchild_server_conf *)
                             ap_get_module_config(r->server->module_config, 
                                                  &mpm_perchild_module);
 
+    while (f) {
+        if (!strcmp("PERCHILD_BUFFER", f->frec->name)) {
+            ap_remove_output_filter(f);
+            break;
+        }
+        f = f->next;
+    }
+
     if (thread_socket_table[thread_num] != -1) {
         apr_socket_t *csd = NULL;
 
@@ -1462,24 +1482,29 @@ static apr_status_t perchild_buffer(ap_filter_t *f, ap_bucket_brigade *b, ap_inp
 {
     ap_bucket *e;
     apr_status_t rv;
+    char *buffer = NULL;
+    const char *str;
+    apr_size_t len;
 
     if ((rv = ap_get_brigade(f->next, b, mode)) != APR_SUCCESS) {
         return rv;
     }
 
+    apr_get_userdata((void **)&buffer, "PERCHILD_BUFFER", f->c->pool);
 
     AP_BRIGADE_FOREACH(e, b) {
-        char *buffer = NULL;
-       const char *str;
-        apr_size_t len;
-
-        apr_get_userdata((void **)&buffer, "PERCHILD_BUFFER", f->c->pool);
-
-        ap_bucket_read(e, &str, &len, AP_NONBLOCK_READ);
-        apr_pstrcat(f->c->pool, buffer, str);
-
-        apr_set_userdata(&buffer, "PERCHILD_BUFFER", apr_null_cleanup, f->c->pool);
+        if (e->length != 0) {
+            ap_bucket_read(e, &str, &len, AP_NONBLOCK_READ);
+       
+            if (buffer == NULL) {
+                buffer = apr_pstrdup(f->c->pool, str);
+            }
+            else {
+               buffer = apr_pstrcat(f->c->pool, buffer, str, NULL);
+            } 
+        }
     }
+    apr_set_userdata(buffer, "PERCHILD_BUFFER", apr_null_cleanup, f->c->pool);
     
     return APR_SUCCESS;
 }