dougm 01/04/17 21:39:34 Added: src/modules/perl modperl_bucket.c modperl_bucket.h Log: module to create SV buckets Revision Changes Path 1.1 modperl-2.0/src/modules/perl/modperl_bucket.c Index: modperl_bucket.c =================================================================== #include "mod_perl.h" #include "modperl_bucket.h" /* * modperl_bucket_sv code derived from mod_snake's ModSnakePyBucket * by Jon Travis */ typedef struct { apr_bucket_refcount refcount; SV *sv; PerlInterpreter *perl; } modperl_bucket_sv_t; static apr_status_t modperl_bucket_sv_read(apr_bucket *bucket, const char **str, apr_size_t *len, apr_read_type_e block) { modperl_bucket_sv_t *svbucket = (modperl_bucket_sv_t *)bucket->data; dTHXa(svbucket->perl); STRLEN n_a; char *pv = SvPV(svbucket->sv, n_a); *str = pv + bucket->start; *len = bucket->length; return APR_SUCCESS; } static void modperl_bucket_sv_destroy(void *data) { modperl_bucket_sv_t *svbucket = (modperl_bucket_sv_t *)data; dTHXa(svbucket->perl); if (!apr_bucket_shared_destroy(svbucket)) { MP_TRACE_f(MP_FUNC, "bucket refcnt=%d\n", ((apr_bucket_refcount *)svbucket)->refcount); return; } MP_TRACE_f(MP_FUNC, "sv=0x%lx, refcnt=%d\n", (unsigned long)svbucket->sv, SvREFCNT(svbucket->sv)); SvREFCNT_dec(svbucket->sv); safefree(svbucket); } static const apr_bucket_type_t modperl_bucket_sv_type = { "mod_perl SV bucket", 4, modperl_bucket_sv_destroy, modperl_bucket_sv_read, apr_bucket_setaside_notimpl, apr_bucket_shared_split, apr_bucket_shared_copy, }; static apr_bucket *modperl_bucket_sv_make(pTHX_ apr_bucket *bucket, SV *sv, int offset, int len) { modperl_bucket_sv_t *svbucket = (modperl_bucket_sv_t *)safemalloc(sizeof(*svbucket)); bucket = apr_bucket_shared_make(bucket, svbucket, offset, offset+len); /* XXX: need to deal with PerlInterpScope */ #ifdef USE_ITHREADS svbucket->perl = aTHX; #endif svbucket->sv = sv; if (!bucket) { safefree(svbucket); return NULL; } (void)SvREFCNT_inc(svbucket->sv); MP_TRACE_f(MP_FUNC, "sv=0x%lx, refcnt=%d\n", (unsigned long)sv, SvREFCNT(sv)); bucket->type = &modperl_bucket_sv_type; return bucket; } apr_bucket *modperl_bucket_sv_create(pTHX_ SV *sv, int offset, int len) { apr_bucket *bucket = (apr_bucket *)calloc(1, sizeof(*bucket)); APR_BUCKET_INIT(bucket); return modperl_bucket_sv_make(aTHX_ bucket, sv, offset, len); } 1.1 modperl-2.0/src/modules/perl/modperl_bucket.h Index: modperl_bucket.h =================================================================== #ifndef MODPERL_BUCKET_H #define MODPERL_BUCKET_H apr_bucket *modperl_bucket_sv_create(pTHX_ SV *sv, int offset, int len); #endif /* MODPERL_BUCKET_H */