summaryrefslogtreecommitdiffstats
path: root/perl
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2008-08-21 17:58:30 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2008-08-21 17:58:30 +0400
commitf3b6712e04fd993caccaa18e425639d85d81b1eb (patch)
treeaaa504a733d1c442692a8e25ad5680657de71942 /perl
parente90352d20a0d5f615c906b7719f95599cb2aaeac (diff)
downloadrspamd-f3b6712e04fd993caccaa18e425639d85d81b1eb.tar.gz
rspamd-f3b6712e04fd993caccaa18e425639d85d81b1eb.zip
* Add filters logic
* Perl should use separate memcached context for its operations (just do memcpy with the same socket) TODO: add block mechanics here to avoid memcached connection closing before perl operation is finished * Change logic of perl chain filter
Diffstat (limited to 'perl')
-rw-r--r--perl/rspamd.xs48
1 files changed, 33 insertions, 15 deletions
diff --git a/perl/rspamd.xs b/perl/rspamd.xs
index 681e40308..4ec40f0fb 100644
--- a/perl/rspamd.xs
+++ b/perl/rspamd.xs
@@ -111,6 +111,7 @@ read_memcached_key (r, key, datalen, callback)
SV *callback;
struct worker_task *task;
} *callback_data;
+ memcached_ctx_t *ctx;
memcached_param_t param;
perl_set_session (r);
@@ -118,16 +119,21 @@ read_memcached_key (r, key, datalen, callback)
datalen = (unsigned int) SvIV (ST(2));
callback = SvRV(ST(3));
- r->memc_ctx->callback = perl_call_memcached_callback;
+ /* Copy old ctx to new one */
+ ctx = malloc (sizeof (memcached_ctx_t));
+ if (ctx == NULL) {
+ XSRETURN_UNDEF;
+ }
+ memcpy (ctx, r->memc_ctx, sizeof (memcached_ctx_t));
+ /* Set perl callback */
+ ctx->callback = perl_call_memcached_callback;
callback_data = malloc (sizeof (struct _param));
if (callback_data == NULL) {
XSRETURN_UNDEF;
}
callback_data->callback = callback;
callback_data->task = r;
- r->memc_ctx->callback_data = (void *)callback_data;
-
- r->memc_busy = 1;
+ ctx->callback_data = (void *)callback_data;
strlcpy (param.key, key, sizeof (param.key));
param.buf = malloc (datalen);
@@ -137,7 +143,7 @@ read_memcached_key (r, key, datalen, callback)
param.bufpos = 0;
param.expire = 0;
- memc_get (r->memc_ctx, &param);
+ memc_get (ctx, &param);
XSRETURN_EMPTY;
void
@@ -152,6 +158,7 @@ write_memcached_key (r, key, data, expire, callback)
SV *callback;
struct worker_task *task;
} *callback_data;
+ memcached_ctx_t *ctx;
memcached_param_t param;
perl_set_session (r);
@@ -160,16 +167,21 @@ write_memcached_key (r, key, data, expire, callback)
expire = (int) SvIV (ST(3));
callback = SvRV(ST(4));
- r->memc_ctx->callback = perl_call_memcached_callback;
+ /* Copy old ctx to new one */
+ ctx = malloc (sizeof (memcached_ctx_t));
+ if (ctx == NULL) {
+ XSRETURN_UNDEF;
+ }
+ memcpy (ctx, r->memc_ctx, sizeof (memcached_ctx_t));
+ /* Set perl callback */
+ ctx->callback = perl_call_memcached_callback;
callback_data = malloc (sizeof (struct _param));
if (callback_data == NULL) {
XSRETURN_UNDEF;
}
callback_data->callback = callback;
callback_data->task = r;
- r->memc_ctx->callback_data = (void *)callback_data;
-
- r->memc_busy = 1;
+ ctx->callback_data = (void *)callback_data;
strlcpy (param.key, key, sizeof (param.key));
param.buf = data;
@@ -177,7 +189,7 @@ write_memcached_key (r, key, data, expire, callback)
param.bufpos = 0;
param.expire = expire;
- memc_set (r->memc_ctx, &param, expire);
+ memc_set (ctx, &param, expire);
XSRETURN_EMPTY;
void
@@ -191,22 +203,28 @@ delete_memcached_key (r, key, callback)
SV *callback;
struct worker_task *task;
} *callback_data;
+ memcached_ctx_t *ctx;
memcached_param_t param;
perl_set_session (r);
key = (char *) SvPV (ST(1), keylen);
callback = SvRV(ST(2));
- r->memc_ctx->callback = perl_call_memcached_callback;
+ /* Copy old ctx to new one */
+ ctx = malloc (sizeof (memcached_ctx_t));
+ if (ctx == NULL) {
+ XSRETURN_UNDEF;
+ }
+ memcpy (ctx, r->memc_ctx, sizeof (memcached_ctx_t));
+ /* Set perl callback */
+ ctx->callback = perl_call_memcached_callback;
callback_data = malloc (sizeof (struct _param));
if (callback_data == NULL) {
XSRETURN_UNDEF;
}
callback_data->callback = callback;
callback_data->task = r;
- r->memc_ctx->callback_data = (void *)callback_data;
-
- r->memc_busy = 1;
+ ctx->callback_data = (void *)callback_data;
strlcpy (param.key, key, sizeof (param.key));
param.buf = NULL;
@@ -214,6 +232,6 @@ delete_memcached_key (r, key, callback)
param.bufpos = 0;
param.expire = 0;
- memc_delete (r->memc_ctx, &param);
+ memc_delete (ctx, &param);
XSRETURN_EMPTY;