0
#define APR_WANT_BYTEFUNC
0
- #include <apr_strings.h>
0
#include "DispatcherBucket.h"
0
+using namespace Passenger;
0
static apr_status_t dispatcher_bucket_read(apr_bucket *b, const char **str, apr_size_t *len, apr_read_type_e block);
0
static void dispatcher_bucket_destroy(void *data);
0
+static apr_status_t dispatcher_bucket_pool_cleaner(void *d);
0
static const apr_bucket_type_t bucket_type_dispatcher = {
0
@@ -29,24 +28,6 @@ static const apr_bucket_type_t bucket_type_dispatcher = {
0
-debug(const char *format, ...) {
0
- int size = apr_vsnprintf(message, sizeof(message), format, ap);
0
- FILE *f = fopen("/dev/pts/2", "w");
0
- fwrite(message, 1, size, f);
0
class DispatcherBucket {
0
@@ -135,6 +116,7 @@ private:
0
apr_interval_time_t timeout;
0
@@ -155,12 +137,14 @@ public:
0
result = read_chunk_size(chunk_size, current_timeout);
0
if (result == APR_EOF || (result == APR_SUCCESS && chunk_size == 0)) {
0
+ P_DEBUG("DispatcherBucket " << this << ": EOF");
0
b = apr_bucket_immortal_make(b, "", 0);
0
*str = (const char *) b->data;
0
} else if (result != APR_SUCCESS) {
0
+ P_DEBUG("DispatcherBucket " << this << ": APR error " << result);
0
@@ -174,21 +158,24 @@ public:
0
APR_BUCKET_INSERT_AFTER(b, dup_bucket(b->list));
0
+ P_DEBUG("DispatcherBucket " << this << ": read (" << string(*str, *len) << ")");
0
} else if (result == APR_EOF) {
0
+ P_DEBUG("DispatcherBucket " << this << ": EOF");
0
b = apr_bucket_immortal_make(b, "", 0);
0
*str = (const char *) b->data;
0
+ P_DEBUG("DispatcherBucket " << this << ": APR error " << result);
0
-extern "C" apr_bucket *
0
-dispatcher_bucket_create(apr_pool_t *pool, int pipe, apr_interval_time_t timeout, apr_bucket_alloc_t *list) {
0
+dispatcher_bucket_create(apr_pool_t *pool, ApplicationPtr app, apr_interval_time_t timeout, apr_bucket_alloc_t *list) {
0
DispatcherBucket *data;
0
@@ -208,10 +195,14 @@ dispatcher_bucket_create(apr_pool_t *pool, int pipe, apr_interval_time_t timeout
0
+ data->pipe = app->getReader();
0
data->timeout = timeout;
0
+ apr_pool_cleanup_register(pool, data, dispatcher_bucket_pool_cleaner, apr_pool_cleanup_null);
0
+ P_DEBUG("DispatcherBucket " << data << " created.");
0
@@ -224,6 +215,16 @@ static void
0
dispatcher_bucket_destroy(void *d) {
0
DispatcherBucket *data = (DispatcherBucket *) d;
0
+ P_DEBUG("Closing file descriptor for DispatcherBucket " << d);
0
+ data->app = ApplicationPtr();
0
+ P_DEBUG("DispatcherBucket " << d << " destroyed.");
0
+dispatcher_bucket_pool_cleaner(void *d) {
0
+ dispatcher_bucket_destroy(d);
Comments
No one has commented yet.