From dea7f0fbb8e6a15475fa3467f96f72d9d1ac6c52 Mon Sep 17 00:00:00 2001 From: Unbit Date: Fri, 8 Mar 2013 17:39:55 +0100 Subject: [PATCH] ported the new magic cache api to perl/psgi --- plugins/jvm/jvm_plugin.c | 31 +++++++-- plugins/psgi/uwsgi_plmodule.c | 119 +++++++++++++++++++++++++++------- 2 files changed, 121 insertions(+), 29 deletions(-) diff --git a/plugins/jvm/jvm_plugin.c b/plugins/jvm/jvm_plugin.c index c1afd1e8..dec73a85 100644 --- a/plugins/jvm/jvm_plugin.c +++ b/plugins/jvm/jvm_plugin.c @@ -78,21 +78,39 @@ JNIEXPORT jobject JNICALL uwsgi_jvm_api_cache_get(JNIEnv *env, jclass c, jstring size_t keylen = uwsgi_jvm_strlen(jkey); char *key = uwsgi_jvm_str2c(jkey); - uwsgi_rlock(uwsgi.caches->lock); uint64_t vallen = 0; - char *value = uwsgi_cache_get(key, keylen, &vallen); + char *value = uwsgi_cache_magic_get(key, keylen, &vallen, NULL); uwsgi_jvm_release_chars(jkey, key); - if (value) { - uwsgi_rwunlock(uwsgi.caches->lock); jobject o = uwsgi_jvm_bytearray(value, vallen); - uwsgi_rwunlock(uwsgi.caches->lock); + free(value); return o; } - uwsgi_rwunlock(uwsgi.caches->lock); return NULL; } +JNIEXPORT jobject JNICALL uwsgi_jvm_api_cache_get_name(JNIEnv *env, jclass c, jstring jkey, jstring jcache) { + if (!uwsgi.caches) { + uwsgi_jvm_throw("cache not available"); + return NULL; + } + + size_t keylen = uwsgi_jvm_strlen(jkey); + char *key = uwsgi_jvm_str2c(jkey); + char *cache = uwsgi_jvm_str2c(jcache); + uint64_t vallen = 0; + char *value = uwsgi_cache_magic_get(key, keylen, &vallen, cache); + uwsgi_jvm_release_chars(jkey, key); + uwsgi_jvm_release_chars(jcache, cache); + if (value) { + jobject o = uwsgi_jvm_bytearray(value, vallen); + free(value); + return o; + } + return NULL; +} + + JNIEXPORT void JNICALL uwsgi_jvm_api_alarm(JNIEnv *env, jclass c, jstring alarm, jstring msg) { char *c_alarm = uwsgi_jvm_str2c(alarm); @@ -113,6 +131,7 @@ static JNINativeMethod uwsgi_jvm_api_methods[] = { {"lock", "(I)V", (void *) &uwsgi_jvm_api_lock}, {"unlock", "(I)V", (void *) &uwsgi_jvm_api_unlock}, {"cache_get", "(Ljava/lang/String;)[B", (void *) &uwsgi_jvm_api_cache_get}, + {"cache_get", "(Ljava/lang/String;Ljava/lang/String;)[B", (void *) &uwsgi_jvm_api_cache_get_name}, {"alarm", "(Ljava/lang/String;Ljava/lang/String;)V", (void *) &uwsgi_jvm_api_alarm}, }; diff --git a/plugins/psgi/uwsgi_plmodule.c b/plugins/psgi/uwsgi_plmodule.c index fe8e4781..69d940dd 100644 --- a/plugins/psgi/uwsgi_plmodule.c +++ b/plugins/psgi/uwsgi_plmodule.c @@ -99,51 +99,119 @@ XS(XS_cache_set) { char *key, *val; STRLEN keylen; STRLEN vallen; + uint64_t expires = 0; + char *cache = NULL; - if (!uwsgi.caches) goto clear; - psgi_check_args(2); key = SvPV(ST(0), keylen); val = SvPV(ST(1), vallen); - uwsgi_wlock(uwsgi.caches->lock); - uwsgi_cache_set(key, (uint16_t) keylen, val, (uint64_t) vallen, 0, 0); - uwsgi_rwunlock(uwsgi.caches->lock); + if (items > 2) { + expires = SvIV(ST(2)); + if (items > 3) { + cache = SvPV_nolen(ST(1)); + } + } -clear: + if (!uwsgi_cache_magic_set(key, (uint16_t) keylen, val, (uint64_t) vallen, expires, 0, cache)) { + XSRETURN_YES; + } XSRETURN_UNDEF; } XS(XS_cache_get) { dXSARGS; - char *key, *val; + char *key; + char *cache = NULL; STRLEN keylen; - uint64_t vallen; + uint64_t vallen = 0; - if (!uwsgi.caches) goto clear; - psgi_check_args(1); key = SvPV(ST(0), keylen); - uwsgi_rlock(uwsgi.caches->lock); - val = uwsgi_cache_get(key, (uint16_t) keylen, &vallen); + if (items > 1) { + cache = SvPV_nolen(ST(1)); + } - if (!val) - uwsgi_rwunlock(uwsgi.caches->lock); -clear: - XSRETURN_UNDEF; + char *value = uwsgi_cache_magic_get(key, (uint16_t) keylen, &vallen, cache); + if (value) { + ST(0) = newSVpv(value, vallen); + free(value); + sv_2mortal(ST(0)); + XSRETURN(1); + } - ST(0) = newSVpv(val, vallen); - uwsgi_rwunlock(uwsgi.caches->lock); - sv_2mortal(ST(0)); - - XSRETURN(1); - + XSRETURN_UNDEF; } +XS(XS_cache_exists) { + dXSARGS; + + char *key; + char *cache = NULL; + STRLEN keylen; + + psgi_check_args(1); + + key = SvPV(ST(0), keylen); + + if (items > 1) { + cache = SvPV_nolen(ST(1)); + } + + if (uwsgi_cache_magic_exists(key, (uint16_t) keylen, cache)) { + XSRETURN_YES; + } + + XSRETURN_UNDEF; + +} + +XS(XS_cache_del) { + dXSARGS; + + char *key; + char *cache = NULL; + STRLEN keylen; + + psgi_check_args(1); + + key = SvPV(ST(0), keylen); + + if (items > 1) { + cache = SvPV_nolen(ST(1)); + } + + if (!uwsgi_cache_magic_del(key, (uint16_t) keylen, cache)) { + XSRETURN_YES; + } + + XSRETURN_UNDEF; + +} + +XS(XS_cache_clear) { + dXSARGS; + + char *cache = NULL; + psgi_check_args(1); + + cache = SvPV_nolen(ST(1)); + + if (!uwsgi_cache_magic_clear(cache)) { + XSRETURN_YES; + } + + XSRETURN_UNDEF; + +} + + + + XS(XS_register_signal) { dXSARGS; @@ -435,8 +503,13 @@ XS(XS_add_rb_timer) { void init_perl_embedded_module() { psgi_xs(reload); - psgi_xs(cache_set); + psgi_xs(cache_get); + psgi_xs(cache_exists); + psgi_xs(cache_set); + psgi_xs(cache_del); + psgi_xs(cache_clear); + psgi_xs(call); psgi_xs(wait_fd_read); psgi_xs(wait_fd_write);