Annotation of embedaddon/lighttpd/src/mod_magnet_cache.c, revision 1.1.1.3

1.1.1.3 ! misho       1: #include "first.h"
        !             2: 
1.1       misho       3: #include "mod_magnet_cache.h"
                      4: #include "stat_cache.h"
                      5: 
                      6: #include <stdlib.h>
                      7: #include <time.h>
                      8: #include <assert.h>
                      9: 
                     10: #ifdef HAVE_LUA_H
                     11: #include <lualib.h>
                     12: #include <lauxlib.h>
                     13: 
                     14: static script *script_init() {
                     15:        script *sc;
                     16: 
                     17:        sc = calloc(1, sizeof(*sc));
                     18:        sc->name = buffer_init();
                     19:        sc->etag = buffer_init();
                     20: 
                     21:        return sc;
                     22: }
                     23: 
                     24: static void script_free(script *sc) {
                     25:        if (!sc) return;
                     26: 
                     27:        lua_pop(sc->L, 1); /* the function copy */
                     28: 
                     29:        buffer_free(sc->name);
                     30:        buffer_free(sc->etag);
                     31: 
                     32:        lua_close(sc->L);
                     33: 
                     34:        free(sc);
                     35: }
                     36: 
                     37: script_cache *script_cache_init() {
                     38:        script_cache *p;
                     39: 
                     40:        p = calloc(1, sizeof(*p));
                     41: 
                     42:        return p;
                     43: }
                     44: 
                     45: void script_cache_free(script_cache *p) {
                     46:        size_t i;
                     47: 
                     48:        if (!p) return;
                     49: 
                     50:        for (i = 0; i < p->used; i++) {
                     51:                script_free(p->ptr[i]);
                     52:        }
                     53: 
                     54:        free(p->ptr);
                     55: 
                     56:        free(p);
                     57: }
                     58: 
                     59: lua_State *script_cache_get_script(server *srv, connection *con, script_cache *cache, buffer *name) {
                     60:        size_t i;
                     61:        script *sc = NULL;
                     62:        stat_cache_entry *sce;
                     63: 
                     64:        for (i = 0; i < cache->used; i++) {
                     65:                sc = cache->ptr[i];
                     66: 
                     67:                if (buffer_is_equal(name, sc->name)) {
                     68:                        sc->last_used = time(NULL);
                     69: 
                     70:                        /* oops, the script failed last time */
                     71: 
                     72:                        if (lua_gettop(sc->L) == 0) break;
1.1.1.3 ! misho      73:                        force_assert(lua_gettop(sc->L) == 1);
1.1       misho      74: 
                     75:                        if (HANDLER_ERROR == stat_cache_get_entry(srv, con, sc->name, &sce)) {
                     76:                                lua_pop(sc->L, 1); /* pop the old function */
                     77:                                break;
                     78:                        }
                     79: 
                     80:                        if (!buffer_is_equal(sce->etag, sc->etag)) {
                     81:                                /* the etag is outdated, reload the function */
                     82:                                lua_pop(sc->L, 1);
                     83:                                break;
                     84:                        }
                     85: 
1.1.1.2   misho      86:                        force_assert(lua_isfunction(sc->L, -1));
1.1       misho      87: 
                     88:                        return sc->L;
                     89:                }
                     90: 
                     91:                sc = NULL;
                     92:        }
                     93: 
                     94:        /* if the script was script already loaded but either got changed or
                     95:         * failed to load last time */
                     96:        if (sc == NULL) {
                     97:                sc = script_init();
                     98: 
                     99:                if (cache->size == 0) {
                    100:                        cache->size = 16;
                    101:                        cache->ptr = malloc(cache->size * sizeof(*(cache->ptr)));
                    102:                } else if (cache->used == cache->size) {
                    103:                        cache->size += 16;
                    104:                        cache->ptr = realloc(cache->ptr, cache->size * sizeof(*(cache->ptr)));
                    105:                }
                    106: 
                    107:                cache->ptr[cache->used++] = sc;
                    108: 
1.1.1.3 ! misho     109:                buffer_copy_buffer(sc->name, name);
1.1       misho     110: 
                    111:                sc->L = luaL_newstate();
                    112:                luaL_openlibs(sc->L);
                    113:        }
                    114: 
                    115:        sc->last_used = time(NULL);
                    116: 
                    117:        if (0 != luaL_loadfile(sc->L, name->ptr)) {
                    118:                /* oops, an error, return it */
                    119:                return sc->L;
                    120:        }
                    121: 
                    122:        if (HANDLER_GO_ON == stat_cache_get_entry(srv, con, sc->name, &sce)) {
1.1.1.3 ! misho     123:                buffer_copy_buffer(sc->etag, sce->etag);
1.1       misho     124:        }
                    125: 
1.1.1.2   misho     126:        force_assert(lua_isfunction(sc->L, -1));
1.1       misho     127: 
                    128:        return sc->L;
                    129: }
                    130: 
                    131: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>