diff options
author | stbuehler <stbuehler@152afb58-edef-0310-8abb-c4023f1b3aa9> | 2015-09-18 15:15:18 +0000 |
---|---|---|
committer | stbuehler <stbuehler@152afb58-edef-0310-8abb-c4023f1b3aa9> | 2015-09-18 15:15:18 +0000 |
commit | 8b2630a82fbecfd57fa38aebb397a755936690e5 (patch) | |
tree | a9cfcd7bb5bea87d63fc8ef81c8456a130a249bc /src/mod_magnet_cache.c | |
parent | e57c8295ebe92b58ca3e68fa8ea8f70d4b0b4cee (diff) | |
download | lighttpd-8b2630a82fbecfd57fa38aebb397a755936690e5.tar.gz |
git-svn-id: svn://svn.lighttpd.net/lighttpd/trunk@3041 152afb58-edef-0310-8abb-c4023f1b3aa9
Diffstat (limited to 'src/mod_magnet_cache.c')
-rw-r--r-- | src/mod_magnet_cache.c | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/src/mod_magnet_cache.c b/src/mod_magnet_cache.c deleted file mode 100644 index 0cd1bcc3..00000000 --- a/src/mod_magnet_cache.c +++ /dev/null @@ -1,137 +0,0 @@ -#include <stdlib.h> -#include <time.h> -#include <assert.h> - -#include "stat_cache.h" -#include "mod_magnet_cache.h" - -#ifdef HAVE_LUA_H -#include <lualib.h> -#include <lauxlib.h> - -static script *script_init() { - script *sc; - - sc = calloc(1, sizeof(*sc)); - sc->name = buffer_init(); - sc->etag = buffer_init(); - - return sc; -} - -static void script_free(script *sc) { - if (!sc) return; - - lua_pop(sc->L, 1); /* the function copy */ - - buffer_free(sc->name); - buffer_free(sc->etag); - - lua_close(sc->L); - - free(sc); -} - -script_cache *script_cache_init() { - script_cache *p; - - p = calloc(1, sizeof(*p)); - - return p; -} - -void script_cache_free(script_cache *p) { - size_t i; - - if (!p) return; - - for (i = 0; i < p->used; i++) { - script_free(p->ptr[i]); - } - - free(p->ptr); - - free(p); -} - -lua_State *script_cache_get_script(server *srv, connection *con, script_cache *cache, buffer *name) { - size_t i; - script *sc = NULL; - stat_cache_entry *sce; - - for (i = 0; i < cache->used; i++) { - sc = cache->ptr[i]; - - if (buffer_is_equal(name, sc->name)) { - sc->last_used = time(NULL); - - /* oops, the script failed last time */ - - if (lua_gettop(sc->L) == 0) break; - - if (HANDLER_ERROR == stat_cache_get_entry(srv, con, sc->name, &sce)) { - lua_pop(sc->L, 1); /* pop the old function */ - break; - } - - if (!buffer_is_equal(sce->etag, sc->etag)) { - /* the etag is outdated, reload the function */ - lua_pop(sc->L, 1); - break; - } - - assert(lua_isfunction(sc->L, -1)); - lua_pushvalue(sc->L, -1); /* copy the function-reference */ - - return sc->L; - } - - sc = NULL; - } - - /* if the script was script already loaded but either got changed or - * failed to load last time */ - if (sc == NULL) { - sc = script_init(); - - if (cache->size == 0) { - cache->size = 16; - cache->ptr = malloc(cache->size * sizeof(*(cache->ptr))); - } else if (cache->used == cache->size) { - cache->size += 16; - cache->ptr = realloc(cache->ptr, cache->size * sizeof(*(cache->ptr))); - } - - cache->ptr[cache->used++] = sc; - - buffer_copy_string_buffer(sc->name, name); - - sc->L = luaL_newstate(); - luaL_openlibs(sc->L); - } - - sc->last_used = time(NULL); - - if (0 != luaL_loadfile(sc->L, name->ptr)) { - /* oops, an error, return it */ - - return sc->L; - } - - if (HANDLER_GO_ON == stat_cache_get_entry(srv, con, sc->name, &sce)) { - buffer_copy_string_buffer(sc->etag, sce->etag); - } - - /** - * pcall() needs the function on the stack - * - * as pcall() will pop the script from the stack when done, we have to - * duplicate it here - */ - assert(lua_isfunction(sc->L, -1)); - lua_pushvalue(sc->L, -1); /* copy the function-reference */ - - return sc->L; -} - -#endif |