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 */
  
  
  

Reply via email to