aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2012-02-16 17:13:09 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2012-02-16 17:13:09 +0400
commit632e9a8987961769fe478b0f60251f4fda5ca732 (patch)
tree514a3aed6f40252169ffa4557066091b4105aa3b /src
parentbf2371d272bac279db965abeca2c5979155d8cc3 (diff)
downloadrspamd-632e9a8987961769fe478b0f60251f4fda5ca732.tar.gz
rspamd-632e9a8987961769fe478b0f60251f4fda5ca732.zip
Add support of buffered IO reset to support persistent connections.
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c28
-rw-r--r--src/buffer.h6
-rw-r--r--src/fstring.c15
-rw-r--r--src/fstring.h5
4 files changed, 46 insertions, 8 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 2413fbbeb..764f82e39 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -353,12 +353,12 @@ read_buffers (gint fd, rspamd_io_dispatcher_t * d, gboolean skip_read)
}
if (d->in_buf == NULL) {
- d->in_buf = memory_pool_alloc (d->pool, sizeof (rspamd_buffer_t));
+ d->in_buf = memory_pool_alloc_tmp (d->pool, sizeof (rspamd_buffer_t));
if (d->policy == BUFFER_LINE || d->policy == BUFFER_ANY) {
- d->in_buf->data = fstralloc (d->pool, BUFSIZ);
+ d->in_buf->data = fstralloc_tmp (d->pool, BUFSIZ);
}
else {
- d->in_buf->data = fstralloc (d->pool, d->nchars + 1);
+ d->in_buf->data = fstralloc_tmp (d->pool, d->nchars + 1);
}
d->in_buf->pos = d->in_buf->data->begin;
}
@@ -634,7 +634,7 @@ rspamd_set_dispatcher_policy (rspamd_io_dispatcher_t * d, enum io_policy policy,
/* Resize input buffer if needed */
if (policy == BUFFER_CHARACTER && nchars != 0) {
if (d->in_buf && d->in_buf->data->size < nchars) {
- tmp = fstralloc (d->pool, d->nchars + 1);
+ tmp = fstralloc_tmp (d->pool, d->nchars + 1);
memcpy (tmp->begin, d->in_buf->data->begin, d->in_buf->data->len);
t = d->in_buf->pos - d->in_buf->data->begin;
tmp->len = d->in_buf->data->len;
@@ -644,7 +644,7 @@ rspamd_set_dispatcher_policy (rspamd_io_dispatcher_t * d, enum io_policy policy,
}
else if (policy == BUFFER_LINE || policy == BUFFER_ANY) {
if (d->in_buf && d->nchars < BUFSIZ) {
- tmp = fstralloc (d->pool, BUFSIZ);
+ tmp = fstralloc_tmp (d->pool, BUFSIZ);
memcpy (tmp->begin, d->in_buf->data->begin, d->in_buf->data->len);
t = d->in_buf->pos - d->in_buf->data->begin;
tmp->len = d->in_buf->data->len;
@@ -663,20 +663,23 @@ rspamd_dispatcher_write (rspamd_io_dispatcher_t * d, void *data, size_t len, gbo
{
rspamd_buffer_t *newbuf;
- newbuf = memory_pool_alloc (d->pool, sizeof (rspamd_buffer_t));
+ newbuf = memory_pool_alloc_tmp (d->pool, sizeof (rspamd_buffer_t));
if (len == 0) {
/* Assume NULL terminated */
len = strlen ((gchar *)data);
}
if (!allocated) {
- newbuf->data = fstralloc (d->pool, len);
+ newbuf->data = memory_pool_alloc_tmp (d->pool, sizeof (f_str_t));
+ newbuf->data->begin = memory_pool_alloc_tmp (d->pool, len);
+ newbuf->data->size = len;
+ newbuf->data->len = len;
/* We need to copy data to temporary internal buffer to avoid using of stack variables */
memcpy (newbuf->data->begin, data, len);
}
else {
- newbuf->data = memory_pool_alloc (d->pool, sizeof (f_str_t));
+ newbuf->data = memory_pool_alloc_tmp (d->pool, sizeof (f_str_t));
newbuf->data->begin = data;
newbuf->data->size = len;
}
@@ -742,6 +745,15 @@ rspamd_dispatcher_restore (rspamd_io_dispatcher_t * d)
}
}
+void
+rspamd_dispacther_cleanup (rspamd_io_dispatcher_t *d)
+{
+ g_queue_clear (d->out_buffers);
+ /* Cleanup temporary data */
+ memory_pool_cleanup_tmp (d->pool);
+ d->in_buf = NULL;
+}
+
#undef debug_ip
/*
diff --git a/src/buffer.h b/src/buffer.h
index 96e38d471..ce2cf3d2e 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -123,4 +123,10 @@ void rspamd_dispatcher_restore (rspamd_io_dispatcher_t *d);
*/
void rspamd_remove_dispatcher (rspamd_io_dispatcher_t *dispatcher);
+/**
+ * Cleanup dispatcher freeing all temporary data
+ * @param dispatcher pointer to dispatcher's object
+ */
+void rspamd_dispacther_cleanup (rspamd_io_dispatcher_t *dispatcher);
+
#endif
diff --git a/src/fstring.c b/src/fstring.c
index c2d48603b..b3050d8c2 100644
--- a/src/fstring.c
+++ b/src/fstring.c
@@ -273,6 +273,21 @@ fstralloc (memory_pool_t * pool, size_t len)
}
/*
+ * Allocate memory for f_str_t from temporary pool
+ */
+f_str_t *
+fstralloc_tmp (memory_pool_t * pool, size_t len)
+{
+ f_str_t *res = memory_pool_alloc_tmp (pool, sizeof (f_str_t));
+
+ res->begin = memory_pool_alloc_tmp (pool, len);
+
+ res->size = len;
+ res->len = 0;
+ return res;
+}
+
+/*
* Truncate string to its len
*/
f_str_t *
diff --git a/src/fstring.h b/src/fstring.h
index 566cbdc32..c55c3627a 100644
--- a/src/fstring.h
+++ b/src/fstring.h
@@ -79,6 +79,11 @@ gint fstrpush_unichar (f_str_t *dest, gunichar c);
f_str_t* fstralloc (memory_pool_t *pool, size_t len);
/*
+ * Allocate memory for f_str_t from temporary pool
+ */
+f_str_t* fstralloc_tmp (memory_pool_t *pool, size_t len);
+
+/*
* Truncate string to its len
*/
f_str_t* fstrtruncate (memory_pool_t *pool, f_str_t *orig);