]> granicus.if.org Git - apache/commitdiff
On the 2.4.x branch:
authorStefan Eissing <icing@apache.org>
Sat, 25 Feb 2017 12:30:28 +0000 (12:30 +0000)
committerStefan Eissing <icing@apache.org>
Sat, 25 Feb 2017 12:30:28 +0000 (12:30 +0000)
Merged /httpd/httpd/trunk:r1784002,1784366,1784372

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1784374 13f79535-47bb-0310-9956-ffa450edef68

modules/http2/h2_bucket_beam.c
modules/http2/h2_bucket_beam.h
modules/http2/h2_mplx.c
modules/http2/h2_request.c
modules/http2/h2_session.c
modules/http2/h2_stream.c
modules/http2/h2_version.h

index f45fa470a47da80e70ca03b9676eea229696ce8c..3d644fd68e67cc78898821f9f6ba3dda9919ebc3 100644 (file)
@@ -230,15 +230,12 @@ static apr_off_t bucket_mem_used(apr_bucket *b)
 static int report_consumption(h2_bucket_beam *beam)
 {
     int rv = 0;
-    if (apr_atomic_read32(&beam->cons_ev_pending)) {
-        if (beam->cons_io_cb) { 
-            beam->cons_io_cb(beam->cons_ctx, beam, beam->received_bytes
-                             - beam->cons_bytes_reported);
-            rv = 1;
-        }
-        beam->cons_bytes_reported = beam->received_bytes;
-        apr_atomic_set32(&beam->cons_ev_pending, 0);
+    if (beam->cons_io_cb) { 
+        beam->cons_io_cb(beam->cons_ctx, beam, beam->received_bytes
+                         - beam->cons_bytes_reported);
+        rv = 1;
     }
+    beam->cons_bytes_reported = beam->received_bytes;
     return rv;
 }
 
@@ -1024,7 +1021,6 @@ transfer:
         }
 
         if (transferred_buckets > 0) {
-           apr_atomic_set32(&beam->cons_ev_pending, 1);
            if (beam->cons_ev_cb) { 
                beam->cons_ev_cb(beam->cons_ctx, beam);
             }
@@ -1199,15 +1195,13 @@ int h2_beam_no_files(void *ctx, h2_bucket_beam *beam, apr_file_t *file)
 
 int h2_beam_report_consumption(h2_bucket_beam *beam)
 {
-    if (apr_atomic_read32(&beam->cons_ev_pending)) {
-        h2_beam_lock bl;
-        if (enter_yellow(beam, &bl) == APR_SUCCESS) {
-            int rv = report_consumption(beam);
-            leave_yellow(beam, &bl);
-            return rv;
-        }
+    h2_beam_lock bl;
+    int rv = 0;
+    if (enter_yellow(beam, &bl) == APR_SUCCESS) {
+        rv = report_consumption(beam);
+        leave_yellow(beam, &bl);
     }
-    return 0;
+    return rv;
 }
 
 void h2_beam_log(h2_bucket_beam *beam, conn_rec *c, int level, const char *msg)
index f5fe7755a686f66bcf26bbc447b52b2960527cd7..2b54eee8b0e1c9acc16a6d3b069ec6c99d4a3180 100644 (file)
@@ -194,13 +194,11 @@ struct h2_bucket_beam {
     h2_beam_mutex_enter *m_enter;
     struct apr_thread_cond_t *m_cond;
     
-    apr_uint32_t cons_ev_pending;     /* != 0, consumer event pending */
     apr_off_t cons_bytes_reported;    /* amount of bytes reported as consumed */
     h2_beam_ev_callback *cons_ev_cb;
     h2_beam_io_callback *cons_io_cb;
     void *cons_ctx;
 
-    apr_uint32_t prod_ev_pending;     /* != 0, producer event pending */
     apr_off_t prod_bytes_reported;    /* amount of bytes reported as produced */
     h2_beam_io_callback *prod_io_cb;
     void *prod_ctx;
index bbf8d596af2bf0ede84dcb36a335d6c681af53aa..465eb9bb4f0db0400a82616677ce86eed1aacbe9 100644 (file)
@@ -123,7 +123,8 @@ static apr_status_t beam_enter(void *ctx, h2_beam_lock *pbl)
 static void stream_output_consumed(void *ctx, 
                                    h2_bucket_beam *beam, apr_off_t length)
 {
-    h2_task *task = ctx;
+    h2_stream *stream = ctx;
+    h2_task *task = stream->task;
     if (length > 0 && task && task->assigned) {
         h2_req_engine_out_consumed(task->assigned, task->c, length); 
     }
@@ -613,7 +614,7 @@ static apr_status_t out_open(h2_mplx *m, int stream_id, h2_bucket_beam *beam)
                       "h2_mplx(%s): out open", stream->task->id);
     }
     
-    h2_beam_on_consumed(stream->output, NULL, stream_output_consumed, stream->task);
+    h2_beam_on_consumed(stream->output, NULL, stream_output_consumed, stream);
     h2_beam_on_produced(stream->output, output_produced, m);
     beamed_count = h2_beam_get_files_beamed(stream->output);
     if (m->tx_handles_reserved >= beamed_count) {
index b6f13c4734c2007033be3ae12d4a5169614f7435..7faf39340c2c12cd14f7952240c9f63765767274 100644 (file)
@@ -170,7 +170,10 @@ apr_status_t h2_request_end_headers(h2_request *req, apr_pool_t *pool, int eos)
 
     s = apr_table_get(req->headers, "Content-Length");
     if (!s) {
-        /* no content-length given */
+        /* HTTP/2 does not need a Content-Length for framing, but our
+         * internal request processing is used to HTTP/1.1, so we
+         * need to either add a Content-Length or a Transfer-Encoding
+         * if any content can be expected. */
         if (!eos) {
             /* We have not seen a content-length and have no eos,
              * simulate a chunked encoding for our HTTP/1.1 infrastructure,
index d5ac7662ab94a0c9f4e2351613c06f4e79c2b189..99a9c094d74c12791fd326fd8bd380c72cb0c847 100644 (file)
@@ -27,6 +27,8 @@
 #include <http_log.h>
 #include <scoreboard.h>
 
+#include <mpm_common.h>
+
 #include "h2_private.h"
 #include "h2.h"
 #include "h2_bucket_eos.h"
@@ -711,16 +713,31 @@ static h2_session *h2_session_create_int(conn_rec *c,
 {
     nghttp2_session_callbacks *callbacks = NULL;
     nghttp2_option *options = NULL;
+    apr_allocator_t *allocator;
+    apr_thread_mutex_t *mutex;
     uint32_t n;
-
     apr_pool_t *pool = NULL;
-    apr_status_t status = apr_pool_create(&pool, c->pool);
     h2_session *session;
+    
+    apr_status_t status = apr_allocator_create(&allocator);
     if (status != APR_SUCCESS) {
         return NULL;
     }
+    apr_allocator_max_free_set(allocator, ap_max_mem_free);
+    apr_pool_create_ex(&pool, c->pool, NULL, allocator);
+    if (!pool) {
+        apr_allocator_destroy(allocator);
+        return NULL;
+    }
     apr_pool_tag(pool, "h2_session");
-
+    apr_allocator_owner_set(allocator, pool);
+    status = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool);
+    if (status != APR_SUCCESS) {
+        apr_pool_destroy(pool);
+        return NULL;
+    }
+    apr_allocator_mutex_set(allocator, mutex);
+    
     /* get h2_session a lifetime beyond its pool and everything
      * connected to it. */
     session = apr_pcalloc(pool, sizeof(h2_session));
index 0a893525eed7e8e4a6e18367bd3983b3ce5a5e76..c4b1227d6a3e1c04490f8b339abcbadf52e5a7aa 100644 (file)
@@ -361,7 +361,7 @@ apr_status_t h2_stream_send_frame(h2_stream *stream, int ftype, int flags)
                 /* start pushed stream */
                 ap_assert(stream->request == NULL);
                 ap_assert(stream->rtmp != NULL);
-                status = h2_request_end_headers(stream->rtmp, stream->pool, 0);
+                status = h2_request_end_headers(stream->rtmp, stream->pool, 1);
                 if (status != APR_SUCCESS) {
                     return status;
                 }
@@ -412,7 +412,7 @@ apr_status_t h2_stream_recv_frame(h2_stream *stream, int ftype, int flags)
                 /* request HEADER */
                 ap_assert(stream->request == NULL);
                 ap_assert(stream->rtmp != NULL);
-                status = h2_request_end_headers(stream->rtmp, stream->pool, 0);
+                status = h2_request_end_headers(stream->rtmp, stream->pool, eos);
                 if (status != APR_SUCCESS) {
                     return status;
                 }
index dee64a3085c35ebf21b7498d44c7439389094992..0d7508ba019eab7ca3f5e2cb1baf19fe3bb3d1f2 100644 (file)
@@ -26,7 +26,7 @@
  * @macro
  * Version number of the http2 module as c string
  */
-#define MOD_HTTP2_VERSION "1.9.1"
+#define MOD_HTTP2_VERSION "1.9.2"
 
 /**
  * @macro
@@ -34,7 +34,7 @@
  * release. This is a 24 bit number with 8 bits for major number, 8 bits
  * for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203.
  */
-#define MOD_HTTP2_VERSION_NUM 0x010901
+#define MOD_HTTP2_VERSION_NUM 0x010902
 
 
 #endif /* mod_h2_h2_version_h */