#include <ucw/threads.h>
+/* Item stack used by conf-intr.c */
+
#define MAX_STACK_SIZE 16
struct item_stack { // used by conf-intr.c
struct cf_item *item; // cf_item of the list
};
+/* List of dirty sections used by conf-section.c */
+
+struct dirty_section {
+ struct cf_section *sec;
+ void *ptr;
+};
+
+#define GBUF_TYPE struct dirty_section
+#define GBUF_PREFIX(x) dirtsec_##x
+#include <ucw/gbuf.h>
+
+/* Configuration context */
+
struct cf_context {
struct mempool *pool;
int is_active;
- int need_journal;
- char *def_file;
- char *env_file;
- int def_loaded;
+ int config_loaded; // at least one config file was loaded
struct cf_parser_state *parser;
- uns everything_committed; // after the 1st load, this flag is set on
- uns postpone_commit; // used internally by cf_getopt()
- uns other_options;
- clist conf_entries;
+ uns everything_committed; // did we already commit each section?
+ uns postpone_commit; // counter of calls to cf_open_group()
+ uns other_options; // used internally by cf_getopt()
+ clist conf_entries; // files/strings to reload
+ struct cf_journal_item *journal; // journalling
+ int enable_journal;
struct old_pools *pools;
- struct cf_journal_item *journal;
- struct item_stack stack[MAX_STACK_SIZE];
+ struct item_stack stack[MAX_STACK_SIZE]; // interpreter stack
uns stack_level;
- uns initialized;
struct cf_section sections; // root section
+ uns sections_initialized;
+ dirtsec_t dirty; // dirty sections
+ uns dirties;
};
/* conf-ctxt.c */
static inline struct cf_context *
cf_get_context(void)
{
- return ucwlib_thread_context()->cf_context;
+ struct cf_context *cc = ucwlib_thread_context()->cf_context;
+ ASSERT(cc->is_active);
+ return cc;
}
+// In fact, this is equivalent to cf_get_context(), but it is not inlined,
+// because we want to force the linker to include conf-context.c, which contains
+// a constructor of the whole context mechanism.
+struct cf_context *cf_obtain_context(void);
+
/* conf-intr.c */
#define OP_MASK 0xff // only get the operation
#define OP_OPEN 0x100 // here we only get an opening brace instead of parameters
uns cf_type_size(enum cf_type type, struct cf_user_type *utype);
char *cf_interpret_line(struct cf_context *cc, char *name, enum cf_operation op, int number, char **pars);
void cf_init_stack(struct cf_context *cc);
-int cf_check_stack(struct cf_context *cc);
+int cf_done_stack(struct cf_context *cc);
/* conf-journal.c */
void cf_journal_swap(void);