#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <string.h>#include <sys/time.h>#include <signal.h>#include <errno.h>#include <unistd.h>#include <math.h>#include <asterisk/pbx.h>#include <asterisk/frame.h>#include <asterisk/sched.h>#include <asterisk/options.h>#include <asterisk/channel.h>#include <asterisk/channel_pvt.h>#include <asterisk/logger.h>#include <asterisk/file.h>#include <asterisk/translate.h>#include <asterisk/manager.h>#include <asterisk/chanvars.h>#include <asterisk/linkedlists.h>#include <asterisk/indications.h>Go to the source code of this file.
Data Structures | |
| struct | asent |
Defines | |
| #define | MAX_AUTOMONS 256 |
Functions | |
| int | ast_autoservice_start (struct ast_channel *chan) |
| int | ast_autoservice_stop (struct ast_channel *chan) |
|
|
Definition at line 37 of file autoservice.c. |
|
|
Automatically service a channel for us... Definition at line 87 of file autoservice.c. References ast_log(), ast_mutex_lock, ast_mutex_unlock, free, LOG_WARNING, malloc, asent::next, and ast_channel::next. Referenced by ast_get_enum(), ast_get_srv(), and ast_rtp_bridge().
00088 {
00089 int res = -1;
00090 struct asent *as;
00091 int needstart;
00092 ast_mutex_lock(&autolock);
00093 needstart = (asthread == (pthread_t) -1) ? 1 : 0 /* aslist ? 0 : 1 */;
00094 as = aslist;
00095 while(as) {
00096 if (as->chan == chan)
00097 break;
00098 as = as->next;
00099 }
00100 if (!as) {
00101 as = malloc(sizeof(struct asent));
00102 if (as) {
00103 memset(as, 0, sizeof(struct asent));
00104 as->chan = chan;
00105 as->next = aslist;
00106 aslist = as;
00107 res = 0;
00108 if (needstart) {
00109 if (pthread_create(&asthread, NULL, autoservice_run, NULL)) {
00110 ast_log(LOG_WARNING, "Unable to create autoservice thread :(\n");
00111 free(aslist);
00112 aslist = NULL;
00113 res = -1;
00114 } else
00115 pthread_kill(asthread, SIGURG);
00116 }
00117 }
00118 }
00119 ast_mutex_unlock(&autolock);
00120 return res;
00121 }
|
|
|
Stop servicing a channel for us... Returns -1 on error or if channel has been hungup Definition at line 123 of file autoservice.c. References ast_channel::_softhangup, ast_mutex_lock, ast_mutex_unlock, ast_channel::blocking, free, and asent::next. Referenced by ast_get_enum(), ast_get_srv(), and ast_rtp_bridge().
00124 {
00125 int res = -1;
00126 struct asent *as, *prev;
00127 ast_mutex_lock(&autolock);
00128 as = aslist;
00129 prev = NULL;
00130 while(as) {
00131 if (as->chan == chan)
00132 break;
00133 prev = as;
00134 as = as->next;
00135 }
00136 if (as) {
00137 if (prev)
00138 prev->next = as->next;
00139 else
00140 aslist = as->next;
00141 free(as);
00142 if (!chan->_softhangup)
00143 res = 0;
00144 }
00145 if (asthread != (pthread_t) -1)
00146 pthread_kill(asthread, SIGURG);
00147 ast_mutex_unlock(&autolock);
00148 /* Wait for it to un-block */
00149 while(chan->blocking)
00150 usleep(1000);
00151 return res;
00152 }
|
1.3.4