--- embedaddon/lighttpd/src/stat_cache.c 2013/10/14 10:32:48 1.1.1.1 +++ embedaddon/lighttpd/src/stat_cache.c 2014/06/15 20:20:06 1.1.1.2 @@ -69,7 +69,6 @@ #ifdef HAVE_FAM_H typedef struct { FAMRequest *req; - FAMConnection *fc; buffer *name; @@ -102,21 +101,22 @@ static fake_keys ctrl; #endif stat_cache *stat_cache_init(void) { - stat_cache *fc = NULL; + stat_cache *sc = NULL; - fc = calloc(1, sizeof(*fc)); + sc = calloc(1, sizeof(*sc)); - fc->dir_name = buffer_init(); - fc->hash_key = buffer_init(); + sc->dir_name = buffer_init(); + sc->hash_key = buffer_init(); + #ifdef HAVE_FAM_H - fc->fam = calloc(1, sizeof(*fc->fam)); + sc->fam_fcce_ndx = -1; #endif #ifdef DEBUG_STAT_CACHE ctrl.size = 0; #endif - return fc; + return sc; } static stat_cache_entry * stat_cache_entry_init(void) { @@ -153,12 +153,12 @@ static fam_dir_entry * fam_dir_entry_init(void) { return fam_dir; } -static void fam_dir_entry_free(void *data) { +static void fam_dir_entry_free(FAMConnection *fc, void *data) { fam_dir_entry *fam_dir = data; if (!fam_dir) return; - FAMCancelMonitor(fam_dir->fc, fam_dir->req); + FAMCancelMonitor(fc, fam_dir->req); buffer_free(fam_dir->name); free(fam_dir->req); @@ -177,7 +177,7 @@ void stat_cache_free(stat_cache *sc) { stat_cache_entry_free(node->data); sc->files = splaytree_delete(sc->files, node->key); - assert(osize - 1 == splaytree_size(sc->files)); + force_assert(osize - 1 == splaytree_size(sc->files)); } buffer_free(sc->dir_name); @@ -190,19 +190,21 @@ void stat_cache_free(stat_cache *sc) { osize = sc->dirs->size; - fam_dir_entry_free(node->data); + fam_dir_entry_free(&sc->fam, node->data); sc->dirs = splaytree_delete(sc->dirs, node->key); if (osize == 1) { - assert(NULL == sc->dirs); + force_assert(NULL == sc->dirs); } else { - assert(osize == (sc->dirs->size + 1)); + force_assert(osize == (sc->dirs->size + 1)); } } - if (sc->fam) { - FAMClose(sc->fam); - free(sc->fam); + if (-1 != sc->fam_fcce_ndx) { + /* fd events already gone */ + sc->fam_fcce_ndx = -1; + + FAMClose(&sc->fam); } #endif free(sc); @@ -246,18 +248,16 @@ handler_t stat_cache_handle_fdevent(server *srv, void UNUSED(_fce); /* */ - if ((revent & FDEVENT_IN) && - sc->fam) { + if (revent & FDEVENT_IN) { + events = FAMPending(&sc->fam); - events = FAMPending(sc->fam); - for (i = 0; i < events; i++) { FAMEvent fe; fam_dir_entry *fam_dir; splay_tree *node; int ndx, j; - FAMNextEvent(sc->fam, &fe); + FAMNextEvent(&sc->fam, &fe); /* handle event */ @@ -287,10 +287,10 @@ handler_t stat_cache_handle_fdevent(server *srv, void if (node && (node->key == ndx)) { int osize = splaytree_size(sc->dirs); - fam_dir_entry_free(node->data); + fam_dir_entry_free(&sc->fam, node->data); sc->dirs = splaytree_delete(sc->dirs, ndx); - assert(osize - 1 == splaytree_size(sc->dirs)); + force_assert(osize - 1 == splaytree_size(sc->dirs)); } } break; @@ -302,15 +302,10 @@ handler_t stat_cache_handle_fdevent(server *srv, void if (revent & FDEVENT_HUP) { /* fam closed the connection */ - srv->stat_cache->fam_fcce_ndx = -1; + fdevent_event_del(srv->ev, &(sc->fam_fcce_ndx), FAMCONNECTION_GETFD(&sc->fam)); + fdevent_unregister(srv->ev, FAMCONNECTION_GETFD(&sc->fam)); - fdevent_event_del(srv->ev, &(sc->fam_fcce_ndx), FAMCONNECTION_GETFD(sc->fam)); - fdevent_unregister(srv->ev, FAMCONNECTION_GETFD(sc->fam)); - - FAMClose(sc->fam); - free(sc->fam); - - sc->fam = NULL; + FAMClose(&sc->fam); } return HANDLER_GO_ON; @@ -397,7 +392,7 @@ handler_t stat_cache_get_entry(server *srv, connection if (sc->files && (sc->files->key == file_ndx)) { #ifdef DEBUG_STAT_CACHE /* it was in the cache */ - assert(i < ctrl.used); + force_assert(i < ctrl.used); #endif /* we have seen this file already and @@ -435,7 +430,7 @@ handler_t stat_cache_get_entry(server *srv, connection log_error_write(srv, __FILE__, __LINE__, "xSB", file_ndx, "was already inserted but not found in cache, ", name); } - assert(i == ctrl.used); + force_assert(i == ctrl.used); #endif } @@ -521,9 +516,9 @@ handler_t stat_cache_get_entry(server *srv, connection ctrl.ptr[ctrl.used++] = file_ndx; - assert(sc->files); - assert(sc->files->data == sce); - assert(osize + 1 == splaytree_size(sc->files)); + force_assert(sc->files); + force_assert(sc->files->data == sce); + force_assert(osize + 1 == splaytree_size(sc->files)); #endif } @@ -625,12 +620,10 @@ handler_t stat_cache_get_entry(server *srv, connection } #ifdef HAVE_FAM_H - if (sc->fam && - (srv->srvconf.stat_cache_engine == STAT_CACHE_ENGINE_FAM)) { + if (srv->srvconf.stat_cache_engine == STAT_CACHE_ENGINE_FAM) { /* is this directory already registered ? */ if (!dir_node) { fam_dir = fam_dir_entry_init(); - fam_dir->fc = sc->fam; buffer_copy_string_buffer(fam_dir->name, sc->dir_name); @@ -638,7 +631,7 @@ handler_t stat_cache_get_entry(server *srv, connection fam_dir->req = calloc(1, sizeof(FAMRequest)); - if (0 != FAMMonitorDirectory(sc->fam, fam_dir->name->ptr, + if (0 != FAMMonitorDirectory(&sc->fam, fam_dir->name->ptr, fam_dir->req, fam_dir)) { log_error_write(srv, __FILE__, __LINE__, "sbsbs", @@ -647,18 +640,19 @@ handler_t stat_cache_get_entry(server *srv, connection "file:", name, FamErrlist[FAMErrno]); - fam_dir_entry_free(fam_dir); + fam_dir_entry_free(&sc->fam, fam_dir); + fam_dir = NULL; } else { int osize = 0; - if (sc->dirs) { + if (sc->dirs) { osize = sc->dirs->size; } sc->dirs = splaytree_insert(sc->dirs, dir_ndx, fam_dir); - assert(sc->dirs); - assert(sc->dirs->data == fam_dir); - assert(osize == (sc->dirs->size - 1)); + force_assert(sc->dirs); + force_assert(sc->dirs->data == fam_dir); + force_assert(osize == (sc->dirs->size - 1)); } } else { fam_dir = dir_node->data; @@ -668,7 +662,6 @@ handler_t stat_cache_get_entry(server *srv, connection if (fam_dir) { sce->dir_version = fam_dir->version; - sce->dir_ndx = dir_ndx; } } #endif @@ -713,7 +706,7 @@ int stat_cache_trigger_cleanup(server *srv) { if (!sc->files) return 0; - keys = calloc(1, sizeof(size_t) * sc->files->size); + keys = calloc(1, sizeof(int) * sc->files->size); stat_cache_tag_old_entries(srv, sc->files, keys, &max_ndx); @@ -742,7 +735,7 @@ int stat_cache_trigger_cleanup(server *srv) { } } - assert(osize - 1 == splaytree_size(sc->files)); + force_assert(osize - 1 == splaytree_size(sc->files)); #endif } }