diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2008-08-21 17:58:30 +0400 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2008-08-21 17:58:30 +0400 |
commit | f3b6712e04fd993caccaa18e425639d85d81b1eb (patch) | |
tree | aaa504a733d1c442692a8e25ad5680657de71942 /perl | |
parent | e90352d20a0d5f615c906b7719f95599cb2aaeac (diff) | |
download | rspamd-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.xs | 48 |
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, ¶m); + memc_get (ctx, ¶m); 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, ¶m, expire); + memc_set (ctx, ¶m, 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, ¶m); + memc_delete (ctx, ¶m); XSRETURN_EMPTY; |