mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-08-19 12:06:36 +00:00
ported the new magic cache api to perl/psgi
This commit is contained in:
@@ -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},
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user