[asterisk-commits] twilson: branch twilson/config_work r361903 - in /team/twilson/config_work: a...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Apr 10 18:16:18 CDT 2012


Author: twilson
Date: Tue Apr 10 18:16:14 2012
New Revision: 361903

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=361903
Log:
A little cleanup

Modified:
    team/twilson/config_work/apps/app_skel.c
    team/twilson/config_work/include/asterisk/astobj2.h
    team/twilson/config_work/include/asterisk/config_options.h
    team/twilson/config_work/main/astobj2.c
    team/twilson/config_work/main/config_options.c

Modified: team/twilson/config_work/apps/app_skel.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/apps/app_skel.c?view=diff&rev=361903&r1=361902&r2=361903
==============================================================================
--- team/twilson/config_work/apps/app_skel.c (original)
+++ team/twilson/config_work/apps/app_skel.c Tue Apr 10 18:16:14 2012
@@ -189,13 +189,6 @@
 	return strcasecmp(one->name, match) ? 0 : (CMP_MATCH | CMP_STOP);
 }
 
-static void ao2_cleanup(void *obj)
-{
-	if (obj) {
-		ao2_ref(obj, -1);
-	}
-}
-
 static void apply_config(struct skel_global_config *new_global, struct ao2_container *new_pvt_container, struct ao2_container *new_cfg_container)
 {
 	void *old;

Modified: team/twilson/config_work/include/asterisk/astobj2.h
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/include/asterisk/astobj2.h?view=diff&rev=361903&r1=361902&r2=361903
==============================================================================
--- team/twilson/config_work/include/asterisk/astobj2.h (original)
+++ team/twilson/config_work/include/asterisk/astobj2.h Tue Apr 10 18:16:14 2012
@@ -1458,4 +1458,10 @@
 /* extra functions */
 void ao2_bt(void);	/* backtrace */
 
+/*! gcc __attribute__(cleanup()) functions
+ * \note they must be able to handle NULL parameters because most of the
+ * allocation/find functions can fail and we don't want to try to tear
+ * down a NULL */
+void ao2_cleanup(void *obj);
+void ao2_iterator_cleanup(struct ao2_iterator *iter);
 #endif /* _ASTERISK_ASTOBJ2_H */

Modified: team/twilson/config_work/include/asterisk/config_options.h
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/include/asterisk/config_options.h?view=diff&rev=361903&r1=361902&r2=361903
==============================================================================
--- team/twilson/config_work/include/asterisk/config_options.h (original)
+++ team/twilson/config_work/include/asterisk/config_options.h Tue Apr 10 18:16:14 2012
@@ -1,5 +1,32 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2012, Digium, Inc.
+ *
+ * Mark Spencer <markster at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ * \brief Configuration Option-handling
+ * \author Terry Wilson <twilson at digium.com>
+ */
+
 #ifndef _ASTERISK_CONFIG_OPTIONS_H
 #define _ASTERISK_CONFIG_OPTIONS_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
 
 #include "asterisk/config.h"
 #include "asterisk/astobj2.h"
@@ -40,6 +67,25 @@
 int ast_config_parse_category_options(struct ao2_container *container, struct ast_config *cfg, const char *cat, void *obj);
 int ast_config_option_set_defaults(struct ao2_container *container, const char *context, void *obj);
 
+#define ast_config_option_register(container, name, op, context, default_val, opt_type, struct_type, flags, ...) {\
+	struct ast_config_option *__opt; \
+	__opt = opt_type == OPT_STRINGFIELD_T ? \
+		__ast_config_option_build(name, op, context, default_val, opt_type, NULL, flags, ARGMAP(offsetof, struct_type, __VA_ARGS__, __field_mgr_pool, __field_mgr)) : \
+		__ast_config_option_build(name, op, context, default_val, opt_type, NULL, flags, ARGMAP(offsetof, struct_type, __VA_ARGS__)); \
+	if (__opt) { \
+		ao2_link(container, __opt); \
+		ao2_ref(__opt, -1); \
+	} \
+}
+
+#define ast_config_option_register_custom(container, name, op, context, default_val, opt_type, handler, flags) { \
+	struct ast_config_option *__opt = ast_config_option_build(name, op, context, default_val, opt_type, handler, flags); \
+	if (__opt) { \
+		ao2_link(container, __opt); \
+		ao2_ref(__opt, -1); \
+	} \
+}
+
 #define PASTE(arg1, arg2)  PASTE1(arg1, arg2)
 #define PASTE1(arg1, arg2) arg1##arg2
 
@@ -70,23 +116,8 @@
 #define ARGMAP_(N, func, type, x, ...) PASTE(ARGMAP_, N)(func, type, N, x, __VA_ARGS__)
 #define ARGMAP(func, type, x, ...) ARGMAP_(VA_NARGS(x, ##__VA_ARGS__), func, type, x, __VA_ARGS__)
 
-#define ast_config_option_register(container, name, op, context, default_val, opt_type, struct_type, flags, ...) {\
-	struct ast_config_option *__opt; \
-	__opt = opt_type == OPT_STRINGFIELD_T ? \
-		__ast_config_option_build(name, op, context, default_val, opt_type, NULL, flags, ARGMAP(offsetof, struct_type, __VA_ARGS__, __field_mgr_pool, __field_mgr)) : \
-		__ast_config_option_build(name, op, context, default_val, opt_type, NULL, flags, ARGMAP(offsetof, struct_type, __VA_ARGS__)); \
-	if (__opt) { \
-		ao2_link(container, __opt); \
-		ao2_ref(__opt, -1); \
-	} \
+#if defined(__cplusplus) || defined(c_plusplus)
 }
-
-#define ast_config_option_register_custom(container, name, op, context, default_val, opt_type, handler, flags) { \
-	struct ast_config_option *__opt = ast_config_option_build(name, op, context, default_val, opt_type, handler, flags); \
-	if (__opt) { \
-		ao2_link(container, __opt); \
-		ao2_ref(__opt, -1); \
-	} \
-}
+#endif
 
 #endif /* _ASTERISK_CONFIG_OPTIONS_H */

Modified: team/twilson/config_work/main/astobj2.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/main/astobj2.c?view=diff&rev=361903&r1=361902&r2=361903
==============================================================================
--- team/twilson/config_work/main/astobj2.c (original)
+++ team/twilson/config_work/main/astobj2.c Tue Apr 10 18:16:14 2012
@@ -1517,6 +1517,20 @@
 	return clone;
 }
 
+void ao2_cleanup(void *obj)
+{
+	if (obj) {
+		ao2_ref(obj, -1);
+	}
+}
+
+void ao2_iterator_cleanup(struct ao2_iterator *iter)
+{
+	if (iter) {
+		ao2_iterator_destroy(iter);
+	}
+}
+
 #ifdef AO2_DEBUG
 static int print_cb(void *obj, void *arg, int flag)
 {

Modified: team/twilson/config_work/main/config_options.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/main/config_options.c?view=diff&rev=361903&r1=361902&r2=361903
==============================================================================
--- team/twilson/config_work/main/config_options.c (original)
+++ team/twilson/config_work/main/config_options.c Tue Apr 10 18:16:14 2012
@@ -1,3 +1,26 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2012, Digium, Inc.
+ *
+ * Mark Spencer <markster at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ * \brief Configuration Option-handling
+ * \author Terry Wilson <twilson at digium.com>
+ */
+
 #include "asterisk.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
@@ -9,6 +32,12 @@
 #include "asterisk/stringfields.h"
 #include "asterisk/acl.h"
 #include "asterisk/frame.h"
+
+#ifdef LOW_MEMORY
+#define CONFIG_OPT_BUCKETS 5
+#else
+#define CONFIG_OPT_BUCKETS 53
+#endif /* LOW_MEMORY */
 
 struct ast_config_option {
 	const char *name;
@@ -32,22 +61,25 @@
 	}
 }
 
-static int (*ast_config_option_default_handlers[])(const struct ast_config_option *opt, struct ast_variable *var, void *obj) = {
-	ast_config_option_int_fn,         /* OPT_INT_T */
-	ast_config_option_uint_fn,        /* OPT_UINT_T */
-	ast_config_option_double_fn,      /* OPT_DOUBLE_T */
-	ast_config_option_sockaddr_fn,    /* OPT_SOCKADDR_T */
-	ast_config_option_stringfield_fn, /* OPT_STRINGFIELD_T */
-	ast_config_option_bool_fn,        /* OPT_BOOL_T */
-	ast_config_option_acl_fn,         /* OPT_ACL_T */
-	ast_config_option_codec_fn,       /* OPT_CODEC_T */
-};
-
-/*
-struct ast_config_option *__ast_config_option_build(const char *name, enum ast_config_option_context_op context_allow,
-	const char *context, const char *default_val, enum ast_config_option_type type, size_t field_offset,
-	ast_config_option_handler handler, unsigned int flags, size_t field_mgr_ofst, size_t field_mgr_pool_ofst)
-*/
+static ast_config_option_handler ast_config_option_default_handler(enum ast_config_option_type type)
+{
+	switch(type) {
+	case OPT_ACL_T: return ast_config_option_acl_fn;
+	case OPT_BOOL_T: return ast_config_option_bool_fn;
+	case OPT_CODEC_T: return ast_config_option_codec_fn;
+	case OPT_DOUBLE_T: return ast_config_option_double_fn;
+	case OPT_INT_T: return ast_config_option_int_fn;
+	case OPT_SOCKADDR_T: return ast_config_option_sockaddr_fn;
+	case OPT_STRINGFIELD_T: return ast_config_option_stringfield_fn;
+	case OPT_UINT_T: return ast_config_option_uint_fn;
+	}
+
+	return NULL;
+}
+
+/*! \brief build a config option
+ * \note this should probably only be called by one of the ast_config_option_register* macros
+ */
 struct ast_config_option *__ast_config_option_build(const char *name, enum ast_config_option_context_op context_allow,
 	const char *context, const char *default_val, enum ast_config_option_type type, ast_config_option_handler handler, unsigned int flags, size_t argc, ...)
 {
@@ -86,7 +118,7 @@
 	opt->flags = flags;
 	opt->argc = argc;
 
-	if (!opt->handler && !(opt->handler = ast_config_option_default_handlers[opt->type])) {
+	if (!opt->handler && !(opt->handler = ast_config_option_default_handler(opt->type))) {
 		ao2_ref(opt, -1);
 		return NULL;
 	};
@@ -94,6 +126,12 @@
 	return opt;
 }
 
+/*! \brief Test if the recorded context of each option matches the generated regex of the other
+ * \param opt1 the first option
+ * \param opt2 the second option
+ * \retval 0 both options have regexes that match each other's recorded context setting
+ * \retval -1 the options have regexes that don't match each other's recorded context setting
+ */
 static int test_opt_contexts(struct ast_config_option *opt1, struct ast_config_option *opt2)
 {
 	return regexec(opt1->context_regex, opt2->context, 0, NULL, 0) ||
@@ -117,7 +155,7 @@
 {
 	const char *name = arg, *context = data;
 	struct ast_config_option *match = obj;
-	/* Continue if we don't match on name, or if NOT regex_matches XOR regex_should_match */
+	/* Continue if we don't match on name, or if NOT (regex_matches XOR regex_should_match) */
 	return strcasecmp(name, match->name) || !regexec(match->context_regex, context, 0, NULL, 0) == !match->context_allow ? 0 : CMP_MATCH | CMP_STOP; 
 }
 
@@ -126,7 +164,6 @@
 	return ao2_callback_data(container, OBJ_KEY, find_option_cb, (void *) name, (void *) cat);
 }
 
-#define CONFIG_OPT_BUCKETS 53
 struct ao2_container *ast_config_option_container_new(void)
 {
 	return ao2_container_alloc(CONFIG_OPT_BUCKETS, config_opt_hash, config_opt_cmp);
@@ -158,6 +195,9 @@
 	return 0;
 }
 
+
+/*! \brief match for anything where the context passes (or fails if !context_allow) the context regex
+ */
 static int match_option_by_context(void *obj, void *arg, int flags)
 {
 	struct ast_config_option *match = obj;
@@ -168,34 +208,34 @@
 
 int ast_config_option_set_defaults(struct ao2_container *container, const char *context, void *obj)
 {
-	struct ao2_iterator *iter;
+	RAII_VAR(struct ao2_iterator *, iter, NULL, ao2_iterator_cleanup);
 	struct ast_config_option *opt;
 
-	iter = ao2_callback(container, OBJ_MULTIPLE, match_option_by_context, (void *) context);
+	if (!(iter = ao2_callback(container, OBJ_MULTIPLE, match_option_by_context, (void *) context))) {
+		return -1;
+	}
+
 	while ((opt = ao2_iterator_next(iter))) {
-		struct ast_variable *var;
+		RAII_VAR(struct ast_variable *, var, NULL, ast_variables_destroy);
+
 		if (ast_strlen_zero(opt->default_val)) {
 			continue;
 		}
 		if (!(var = ast_variable_new(opt->name, opt->default_val, ""))) {
 			ao2_ref(opt, -1);
-			ao2_iterator_destroy(iter);
 			return -1;
 		}
 		if (opt->handler(opt, var, obj)) {
 			ao2_ref(opt, -1);
-			ao2_iterator_destroy(iter);
-			ast_variables_destroy(var);
-			return -1;
-		}
-		ast_variables_destroy(var);
-	}
-	ao2_iterator_destroy(iter);
-
-	return 0;
-}
-
-/* default option handlers */
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+/* default config option handlers */
+
 int ast_config_option_int_fn(const struct ast_config_option *opt, struct ast_variable *var, void *obj) {
 	int *field = (int *)(obj + opt->args[0]);
 	return ast_parse_arg(var->value, PARSE_INT32 | opt->flags, field);
@@ -205,10 +245,12 @@
 	unsigned int *field = (unsigned int *)(obj + opt->args[0]);
 	return ast_parse_arg(var->value, PARSE_UINT32 | opt->flags, field);
 }
+
 int ast_config_option_double_fn(const struct ast_config_option *opt, struct ast_variable *var, void *obj) {
 	double *field = (double *)(obj + opt->args[0]);
 	return ast_parse_arg(var->value, PARSE_DOUBLE | opt->flags, field);
 }
+
 int ast_config_option_acl_fn(const struct ast_config_option *opt, struct ast_variable *var, void *obj) {
 	struct ast_ha **ha = (struct ast_ha **)(obj + opt->args[0]);
 	int error = 0;
@@ -226,7 +268,7 @@
 /* opt->args[0] = ast_string_field,  opt->args[1] = field_mgr_pool, opt->args[2] = field_mgri */
 int ast_config_option_stringfield_fn(const struct ast_config_option *opt, struct ast_variable *var, void *obj)
 {
-	const char **field = (const char **)(obj + opt->args[0]);
+	ast_string_field *field = (const char **)(obj + opt->args[0]);
 	struct ast_string_field_pool **pool = (struct ast_string_field_pool **)(obj + opt->args[1]);
 	struct ast_string_field_mgr *mgr = (struct ast_string_field_mgr *)(obj + opt->args[2]);
 	ast_string_field_ptr_set_by_fields(*pool, *mgr, field, var->value);




More information about the asterisk-commits mailing list