Changeset 485

Show
Ignore:
Timestamp:
04/05/07 02:17:22 (2 years ago)
Author:
hachi
Message:

These changes make it quite a bit faster, but require some changes in the calling code. Not safe to use quite yet.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/client-xs-20070328/Cache-Memcached-GetParserXS/GetParserXS.xs

    r481 r485  
    1515#define FLAGS    6 
    1616#define KEY      7  /* current key we're parsing (without the namespace prefix) */ 
     17#define FINISHED 8  /* hashref of keys and flags to be finalized at any time */ 
    1718 
    1819#define DEBUG    0 
     
    4344} 
    4445 
     46inline SV *get_offset_sv (AV* self) { 
     47  SV** svp = av_fetch(self, OFFSET, 0); 
     48  if (svp) 
     49    return (SV*) *svp; 
     50 
     51  *svp = newSViv(0); 
     52  av_store(self, OFFSET, *svp); 
     53  return (SV*) *svp; 
     54} 
     55 
     56inline void clear_on_item (AV* self) { 
     57  SV** svp = av_store(self, ON_ITEM, newSV(0) ); 
     58} 
     59 
    4560inline void set_flags (AV* self, int flags) { 
    4661  av_store(self, FLAGS, newSViv(flags)); 
     
    5772inline HV* get_dest (AV* self) { 
    5873  SV** svp = av_fetch(self, DEST, 0); 
     74  if (svp) 
     75    return (HV*) SvRV(*svp); 
     76  return 0; 
     77} 
     78 
     79inline HV* get_finished (AV* self) { 
     80  SV** svp = av_fetch(self, FINISHED, 0); 
    5981  if (svp) 
    6082    return (HV*) SvRV(*svp); 
     
    100122  char *barekey; 
    101123 
     124  HV* finished = get_finished(self); 
     125 
    102126  if (DEBUG) 
    103127    printf("get_buffer (nslen = %d)...\n", nslen); 
     
    190214 
    191215      if (copy == state) { 
    192         dSP ; 
    193  
    194          /* have it all? */ 
    195         ENTER ; 
    196         SAVETMPS ; 
    197         PUSHMARK(SP) ; 
    198         XPUSHs(sv_2mortal(newSVpv(barekey, barelen))); 
    199         XPUSHs(sv_2mortal(newSViv(flags))); 
    200         PUTBACK ; 
    201         call_sv(on_item, G_VOID | G_DISCARD); 
    202         FREETMPS ; 
    203         LEAVE ; 
     216        hv_store(finished, barekey, barelen, newSViv(flags), 0); 
    204217 
    205218        set_offset(self, 0); 
     
    208221      } else { 
    209222        /* don't have it all... but buffer is now empty */ 
     223        hv_store(finished, barekey, barelen, newSViv(flags), 0); 
    210224        set_offset(self, copy); 
    211225        set_flags(self, flags);