Algorithm-ConsistentHash-Ketama

 view release on metacpan or  search on metacpan

xs/Ketama.xs  view on Meta::CPAN

                        found = 1;
                        j = ketama->numpoints;
                    }
                }
                if (! found) {
                    croak("SANITY CHECK FAILED: Should not get here");
                }
            }
        }
        newketama->numbuckets = ketama->numbuckets;
    }
    return newketama;
}

static int
PerlKetama_mg_dup(pTHX_ MAGIC* const mg, CLONE_PARAMS* const param){
    PERL_UNUSED_VAR(param);
#ifdef USE_ITHREADS /* single threaded perl has no "xxx_dup()" APIs */
    PerlKetama* const ketama = (PerlKetama*)mg->mg_ptr;
    mg->mg_ptr = (char *) PerlKetama_clone(ketama);
#else
    PERL_UNUSED_VAR(mg);
#endif
    return 0;
}

static MGVTBL PerlKetama_vtbl = { /* for identity */
    NULL, /* get */
    NULL, /* set */
    NULL, /* len */
    NULL, /* clear */
    PerlKetama_mg_free, /* free */
    NULL, /* copy */
    PerlKetama_mg_dup, /* dup */
    NULL,  /* local */
};

MODULE = Algorithm::ConsistentHash::Ketama   PACKAGE = Algorithm::ConsistentHash::Ketama  PREFIX=PerlKetama_

PROTOTYPES: DISABLE

PerlKetama *
PerlKetama_xs_create(class_sv, hashfunc)
        SV *class_sv;
        int hashfunc;

void
PerlKetama_add_bucket(ketama, label, weight)
        PerlKetama *ketama;
        char *label;
        int weight;

void
PerlKetama_remove_bucket(ketama, label)
        PerlKetama *ketama;
        char *label;

void
PerlKetama_buckets(ketama)
        PerlKetama *ketama;
    PPCODE:
        /* since PerlKetama_buckets may push an unknown number of items
           into the Perl stash, this is required */
        XSRETURN( PerlKetama_buckets(ketama) );

char *
PerlKetama_hash(ketama, thing)
        PerlKetama* ketama;
        SV *thing;

void
PerlKetama_hash_with_hashnum(ketama, thing)
        PerlKetama* ketama;
        SV *thing;
    PREINIT:
        unsigned int hash;
        char *ptr;
        STRLEN len;
        char *label;
    PPCODE:
        ptr = SvPV(thing, len);
        label = ketama->hashfunc(ketama, ptr, len, &hash);
        mXPUSHp(label, strlen(label));
        mXPUSHu(hash);
        XSRETURN(2);

void
PerlKetama_label_from_hashnum(ketama, thing)
        PerlKetama* ketama;
        unsigned int thing;
    PREINIT:
        char *label;
    PPCODE:
        label = ketama->hashfunc(ketama, NULL, 0, &thing);
        XPUSHs(sv_2mortal(newSVpv(label, strlen(label))));
        XSRETURN(1);

PerlKetama *
PerlKetama_clone(ketama)
        PerlKetama *ketama;
    PREINIT:
        SV *class_sv = ST(0);



( run in 1.567 second using v1.01-cache-2.11-cpan-71847e10f99 )