ported the new magic cache api to perl/psgi

This commit is contained in:
Unbit
2013-03-08 17:39:55 +01:00
parent a684bc6124
commit dea7f0fbb8
2 changed files with 121 additions and 29 deletions
+25 -6
View File
@@ -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},
};
+96 -23
View File
@@ -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);