[asterisk-commits] dhubbard: branch group/taskprocessors r111951 - in /team/group/taskprocessors...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sat Mar 29 13:10:24 CDT 2008
Author: dhubbard
Date: Sat Mar 29 13:10:23 2008
New Revision: 111951
URL: http://svn.digium.com/view/asterisk?view=rev&rev=111951
Log:
fail to reference an existing taskprocessor if the requested processing function does not match the existing taskprocessor's _poll_function
Modified:
team/group/taskprocessors/include/asterisk/taskprocessor.h
team/group/taskprocessors/main/taskprocessor.c
Modified: team/group/taskprocessors/include/asterisk/taskprocessor.h
URL: http://svn.digium.com/view/asterisk/team/group/taskprocessors/include/asterisk/taskprocessor.h?view=diff&rev=111951&r1=111950&r2=111951
==============================================================================
--- team/group/taskprocessors/include/asterisk/taskprocessor.h (original)
+++ team/group/taskprocessors/include/asterisk/taskprocessor.h Sat Mar 29 13:10:23 2008
@@ -89,6 +89,8 @@
ast_mutex_t _taskprocessor_lock;
/*! \brief Taskprocesor thread run flag */
unsigned char _poll_thread_run;
+ /*! \brief Hold a pointer to the taskprocessing function */
+ void *(*_poll_function)(void*);
/*! \brief Taskprocessor statistics */
struct taskprocessor_singleton_stats *_stats;
/*! \brief private data for a taskprocessor */
Modified: team/group/taskprocessors/main/taskprocessor.c
URL: http://svn.digium.com/view/asterisk/team/group/taskprocessors/main/taskprocessor.c?view=diff&rev=111951&r1=111950&r2=111951
==============================================================================
--- team/group/taskprocessors/main/taskprocessor.c (original)
+++ team/group/taskprocessors/main/taskprocessor.c Sat Mar 29 13:10:23 2008
@@ -346,17 +346,12 @@
AST_LIST_TRAVERSE(&_taskprocessor_singletons, p, list) {
if (!strcasecmp(p->_name, name)) {
AST_LIST_UNLOCK(&_taskprocessor_singletons);
+ ast_debug(5, "taskprocessor_singleton \'%s\' already exists!.\n", p->_name);
+ if (p->_poll_function != ((custom_func)?custom_func:tps_default_processor_function)) {
+ ast_log(LOG_ERROR, "A taskprocessor \'%s\' already exists with a differing task processing function.\n", name);
+ return NULL;
+ }
ao2_ref(p, 1);
- ast_debug(5, "taskprocessor_singleton \'%s\' already exists!.\n", p->_name);
- /* a scenario here slightly worries me. If a module calls ast_taskprocessor_reference(blah, 0) and then
- * another module calls ast_taskprocessor_reference(blah, custom_func) then the custom_func is not going
- * to be assigned to the taskprocessor because that name already exists with a different processing
- * function. We might want to check for that and return a NULL if someone requests a taskprocessor that
- * already exists, but the processing function doesn't match. In any case, this stuff is not happening
- * dynamically and one would think that this scenario would be caught before a commit was made, but I'm
- * pretty sure that stranger things have happened.
- *
- * In the meantime, if the processor thread already exists, return it without comparing processing functions. */
return p;
}
}
@@ -386,10 +381,13 @@
/* wake it up */
pthread_kill(p->_poll_thread, SIGURG);
} else {
- /* create the thread. This may seem silly, but it results in nicer 'core show threads' output */
+ /* The logic for creating the processor thread in the block below may seem silly,
+ * but doing it this way results in more useful 'core show threads' output */
if (custom_func) {
+ p->_poll_function = custom_func;
rc = ast_pthread_create(&p->_poll_thread, NULL, custom_func, p);
} else {
+ p->_poll_function = tps_default_processor_function;
rc = ast_pthread_create(&p->_poll_thread, NULL, tps_default_processor_function, p);
}
if (rc < 0) {
More information about the asterisk-commits
mailing list