X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Fconf-section.c;h=f25657d287c7448f1d5744f269c22fd27e0d9f55;hb=0db6e10eac28f38bfc3b325b13ad95107c58ce1e;hp=d006643b1e360789c570907ea2760abcb6cdf305;hpb=0ca8c151f5afe1680e98f3bfbe9d5c752d8a2924;p=libucw.git diff --git a/ucw/conf-section.c b/ucw/conf-section.c index d006643b..f25657d2 100644 --- a/ucw/conf-section.c +++ b/ucw/conf-section.c @@ -18,44 +18,32 @@ /* Dirty sections */ -// FIXME!!! - -struct dirty_section { - struct cf_section *sec; - void *ptr; -}; -#define GBUF_TYPE struct dirty_section -#define GBUF_PREFIX(x) dirtsec_##x -#include -static dirtsec_t dirty; -static uns dirties; - void cf_add_dirty(struct cf_section *sec, void *ptr) { - dirtsec_grow(&dirty, dirties+1); - struct dirty_section *dest = dirty.ptr + dirties; - if (dirties && dest[-1].sec == sec && dest[-1].ptr == ptr) + struct cf_context *cc = cf_get_context(); + dirtsec_grow(&cc->dirty, cc->dirties+1); + struct dirty_section *dest = cc->dirty.ptr + cc->dirties; + if (cc->dirties && dest[-1].sec == sec && dest[-1].ptr == ptr) return; dest->sec = sec; dest->ptr = ptr; - dirties++; + cc->dirties++; } #define ASORT_PREFIX(x) dirtsec_##x #define ASORT_KEY_TYPE struct dirty_section -#define ASORT_ELT(i) dirty.ptr[i] #define ASORT_LT(x,y) x.sec < y.sec || x.sec == y.sec && x.ptr < y.ptr #include static void -sort_dirty(void) +sort_dirty(struct cf_context *cc) { - if (dirties <= 1) + if (cc->dirties <= 1) return; - dirtsec_sort(dirties); + dirtsec_sort(cc->dirty.ptr, cc->dirties); // and compress the list - struct dirty_section *read = dirty.ptr + 1, *write = dirty.ptr + 1, *limit = dirty.ptr + dirties; + struct dirty_section *read = cc->dirty.ptr + 1, *write = cc->dirty.ptr + 1, *limit = cc->dirty.ptr + cc->dirties; while (read < limit) { if (read->sec != read[-1].sec || read->ptr != read[-1].ptr) { if (read != write) @@ -64,7 +52,7 @@ sort_dirty(void) } read++; } - dirties = write - dirty.ptr; + cc->dirties = write - cc->dirty.ptr; } /* Initialization */ @@ -104,9 +92,9 @@ inspect_section(struct cf_section *sec) } void -cf_declare_section(const char *name, struct cf_section *sec, uns allow_unknown) +cf_declare_rel_section(const char *name, struct cf_section *sec, void *ptr, uns allow_unknown) { - struct cf_context *cc = cf_get_context(); + struct cf_context *cc = cf_obtain_context(); if (!cc->sections.cfg) { cc->sections.size = 50; @@ -118,7 +106,7 @@ cf_declare_section(const char *name, struct cf_section *sec, uns allow_unknown) ci->cls = CC_SECTION; ci->name = name; ci->number = 1; - ci->ptr = NULL; + ci->ptr = ptr; ci->u.sec = sec; inspect_section(sec); if (allow_unknown) @@ -132,6 +120,12 @@ cf_declare_section(const char *name, struct cf_section *sec, uns allow_unknown) } } +void +cf_declare_section(const char *name, struct cf_section *sec, uns allow_unknown) +{ + cf_declare_rel_section(name, sec, NULL, allow_unknown); +} + void cf_init_section(const char *name, struct cf_section *sec, void *ptr, uns do_bzero) { @@ -161,7 +155,9 @@ cf_init_section(const char *name, struct cf_section *sec, void *ptr, uns do_bzer static char * commit_section(struct cf_section *sec, void *ptr, uns commit_all) { + struct cf_context *cc = cf_get_context(); char *err; + for (struct cf_item *ci=sec->cfg; ci->cls; ci++) if (ci->cls == CC_SECTION) { if ((err = commit_section(ci->u.sec, ptr + (uintptr_t) ci->ptr, commit_all))) { @@ -182,10 +178,10 @@ commit_section(struct cf_section *sec, void *ptr, uns commit_all) * hence we need to call them in a fixed order. */ #define ARY_LT_X(ary,i,x) ary[i].sec < x.sec || ary[i].sec == x.sec && ary[i].ptr < x.ptr struct dirty_section comp = { sec, ptr }; - uns pos = BIN_SEARCH_FIRST_GE_CMP(dirty.ptr, dirties, comp, ARY_LT_X); + uns pos = BIN_SEARCH_FIRST_GE_CMP(cc->dirty.ptr, cc->dirties, comp, ARY_LT_X); if (commit_all - || (pos < dirties && dirty.ptr[pos].sec == sec && dirty.ptr[pos].ptr == ptr)) + || (pos < cc->dirties && cc->dirty.ptr[pos].sec == sec && cc->dirty.ptr[pos].ptr == ptr)) return sec->commit(ptr); } return 0; @@ -195,11 +191,11 @@ int cf_commit_all(enum cf_commit_mode cm) { struct cf_context *cc = cf_get_context(); - sort_dirty(); + sort_dirty(cc); if (cm == CF_NO_COMMIT) return 0; if (commit_section(&cc->sections, NULL, cm == CF_COMMIT_ALL)) return 1; - dirties = 0; + cc->dirties = 0; return 0; }