diff -r 4417619a9bbd -r 450d2d5f4735 src/server/daemon/config.c --- a/src/server/daemon/config.c Sat Aug 18 11:39:34 2012 +0200 +++ b/src/server/daemon/config.c Sat Oct 06 13:00:07 2012 +0200 @@ -38,6 +38,7 @@ #include #include "../ucx/string.h" +#include "../ucx/atomic.h" #include "httplistener.h" #include "config.h" @@ -111,6 +112,7 @@ fprintf(stderr, "Cannot load server.conf\n"); } ServerConfiguration *serverconfig = malloc(sizeof(ServerConfiguration)); + serverconfig->ref = 1; serverconfig->pool = pool_create(); serverconfig->listeners = NULL; serverconfig->host_vs = ucx_map_new(16); @@ -184,29 +186,30 @@ cfg_handle_vs(serverconfig, scfgobj); } - /* check event handler config */ + // check event handler config if(check_event_handler_cfg() != 0) { /* critical error */ return NULL; } - /* check thread pool config */ + // check thread pool config if(check_thread_pool_cfg() != 0) { /* critical error */ return NULL; } - /* set VirtualServer for all listeners */ + // set VirtualServer for all listeners UcxList *ls = serverconfig->listeners; while(ls) { HttpListener *listener = ls->data; sstr_t vsname = sstr(listener->default_vs.vs_name); - /* search for VirtualServer */ - int b = 0; + // search for VirtualServer + //int b = 0; UcxMapIterator iter = ucx_map_iterator(serverconfig->host_vs); - UCX_MAP_FOREACH(VirtualServer*, vs, serverconfig->host_vs, iter) { + VirtualServer *vs; + UCX_MAP_FOREACH(vs, iter) { if(!sstrcmp(vsname, vs->name)) { listener->default_vs.vs = vs; break; @@ -219,16 +222,27 @@ return serverconfig; } +void cfg_ref(ServerConfiguration *cfg) { + ucx_atomic_inc_32(&cfg->ref); +} + +void cfg_unref(ServerConfiguration *cfg) { + uint32_t ref = ucx_atomic_dec_32_nv(&cfg->ref); + if(ref == 0) { + // TODO: free configuration + } +} + void init_server_config_parser() { } int cfg_handle_runtime(ServerConfiguration *cfg, ServerConfigObject *obj) { - cfg->user = sstrdub(cfg_directivelist_get_str( + cfg->user = sstrdup(cfg_directivelist_get_str( obj->directives, sstr("User"))); - cfg->tmp = sstrdub(cfg_directivelist_get_str( + cfg->tmp = sstrdup(cfg_directivelist_get_str( obj->directives, sstr("Temp"))); @@ -246,7 +260,7 @@ LogConfig logcfg; logcfg.file = sstrdup(file).ptr; - logcfg.level = sstrdub(lvl).ptr; + logcfg.level = sstrdup(lvl).ptr; /* TODO: stdout, stderr config */ int ret = init_log_file(&logcfg); @@ -289,21 +303,23 @@ int cfg_handle_listener(ServerConfiguration *cfg, ServerConfigObject *obj) { ListenerConfig lc; + lc.cfg = cfg; lc.port = 8080; lc.nacceptors = 1; - - lc.name = sstrdub(cfg_directivelist_get_str( + + // TODO: use sstrdup_pool? + lc.name = sstrdup(cfg_directivelist_get_str( obj->directives, sstr("Name"))); lc.port = atoi(cfg_directivelist_get_str( obj->directives, sstr("Port")).ptr); - lc.vs = sstrdub(cfg_directivelist_get_str( + lc.vs = sstrdup(cfg_directivelist_get_str( obj->directives, sstr("DefaultVS"))); - HttpListener *listener = http_listener_new(&lc); + HttpListener *listener = http_listener_create(&lc); listener->default_vs.vs_name = lc.vs.ptr; cfg->listeners = ucx_list_append(cfg->listeners, listener); @@ -313,13 +329,13 @@ int cfg_handle_vs(ServerConfiguration *cfg, ServerConfigObject *obj) { VirtualServer *vs = vs_new(); - vs->name = sstrdub(cfg_directivelist_get_str( + vs->name = sstrdup(cfg_directivelist_get_str( obj->directives, sstr("Name"))); - vs->host = sstrdub(cfg_directivelist_get_str( + vs->host = sstrdup(cfg_directivelist_get_str( obj->directives, sstr("Host"))); - vs->document_root = sstrdub(cfg_directivelist_get_str( + vs->document_root = sstrdup(cfg_directivelist_get_str( obj->directives, sstr("DocRoot"))); sstr_t objfile = cfg_directivelist_get_str( @@ -335,12 +351,13 @@ ConfigFile *f = cfgmgr_get_file(file); if(f == NULL) { f = malloc(sizeof(ConfigFile)); - f->file = sstrdub(file); + f->file = sstrdup(file); f->reload = object_conf_reload; f->reload(f, cfg); cfgmgr_attach_file(f); } - vs->objects = (HTTPObjectConfig*)f->data; + vs->objectfile = sstrdup(file); // TODO: pool + vs->objects = (HTTPObjectConfig*)f->data; // TODO: ref ucx_map_sstr_put(cfg->host_vs, vs->host, vs); @@ -387,10 +404,10 @@ char *name = NULL; char *ppath = NULL; if(cob->name.length > 0) { - name = sstrdub(cob->name).ptr; + name = sstrdup(cob->name).ptr; } if(cob->ppath.length > 0) { - ppath = sstrdub(cob->ppath).ptr; + ppath = sstrdup(cob->ppath).ptr; } /* create and add object */