mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-14 08:31:02 +00:00
Patch for improving unload on zap (thanks James)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1846 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -6914,7 +6914,73 @@ static int action_zapdialoffhook(struct mansession *s, struct message *m)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_module()
|
static int zt_unload(void)
|
||||||
|
{
|
||||||
|
struct zt_pvt *p, *pl;
|
||||||
|
/* First, take us out of the channel loop */
|
||||||
|
ast_channel_unregister(type);
|
||||||
|
ast_channel_unregister(typecompat);
|
||||||
|
ast_cli_unregister(&cli_show_channels);
|
||||||
|
ast_cli_unregister(&cli_show_channel);
|
||||||
|
ast_cli_unregister(&cli_destroy_channel);
|
||||||
|
if (!ast_mutex_lock(&iflock)) {
|
||||||
|
/* Hangup all interfaces if they have an owner */
|
||||||
|
p = iflist;
|
||||||
|
while(p) {
|
||||||
|
if (p->owner)
|
||||||
|
ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD);
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
iflist = NULL;
|
||||||
|
ast_mutex_unlock(&iflock);
|
||||||
|
} else {
|
||||||
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!ast_mutex_lock(&monlock)) {
|
||||||
|
if (monitor_thread) {
|
||||||
|
pthread_cancel(monitor_thread);
|
||||||
|
pthread_kill(monitor_thread, SIGURG);
|
||||||
|
pthread_join(monitor_thread, NULL);
|
||||||
|
}
|
||||||
|
monitor_thread = -2;
|
||||||
|
ast_mutex_unlock(&monlock);
|
||||||
|
} else {
|
||||||
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ast_mutex_lock(&iflock)) {
|
||||||
|
/* Destroy all the interfaces and free their memory */
|
||||||
|
p = iflist;
|
||||||
|
while(p) {
|
||||||
|
/* Free any callerid */
|
||||||
|
if (p->cidspill)
|
||||||
|
free(p->cidspill);
|
||||||
|
/* Close the zapata thingy */
|
||||||
|
if (p->subs[SUB_REAL].zfd > -1)
|
||||||
|
zt_close(p->subs[SUB_REAL].zfd);
|
||||||
|
pl = p;
|
||||||
|
p = p->next;
|
||||||
|
/* Free associated memory */
|
||||||
|
free(pl);
|
||||||
|
}
|
||||||
|
iflist = NULL;
|
||||||
|
ast_mutex_unlock(&iflock);
|
||||||
|
} else {
|
||||||
|
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int unload_module()
|
||||||
|
{
|
||||||
|
return zt_unload();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int setup_zap(void)
|
||||||
{
|
{
|
||||||
struct ast_config *cfg;
|
struct ast_config *cfg;
|
||||||
struct ast_variable *v;
|
struct ast_variable *v;
|
||||||
@@ -6924,17 +6990,8 @@ int load_module()
|
|||||||
int start, finish,x;
|
int start, finish,x;
|
||||||
int y;
|
int y;
|
||||||
int cur_radio = 0;
|
int cur_radio = 0;
|
||||||
|
|
||||||
#ifdef ZAPATA_PRI
|
#ifdef ZAPATA_PRI
|
||||||
int offset;
|
int offset;
|
||||||
|
|
||||||
memset(pris, 0, sizeof(pris));
|
|
||||||
for (y=0;y<NUM_SPANS;y++) {
|
|
||||||
pris[y].offset = -1;
|
|
||||||
pris[y].fd = -1;
|
|
||||||
}
|
|
||||||
pri_set_error(zt_pri_error);
|
|
||||||
pri_set_message(zt_pri_message);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cfg = ast_load(config);
|
cfg = ast_load(config);
|
||||||
@@ -6959,7 +7016,7 @@ int load_module()
|
|||||||
ast_log(LOG_ERROR, "Signalling must be specified before any channels are.\n");
|
ast_log(LOG_ERROR, "Signalling must be specified before any channels are.\n");
|
||||||
ast_destroy(cfg);
|
ast_destroy(cfg);
|
||||||
ast_mutex_unlock(&iflock);
|
ast_mutex_unlock(&iflock);
|
||||||
unload_module();
|
zt_unload();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
c = v->value;
|
c = v->value;
|
||||||
@@ -6976,7 +7033,7 @@ int load_module()
|
|||||||
ast_log(LOG_ERROR, "Syntax error parsing '%s' at '%s'\n", v->value, chan);
|
ast_log(LOG_ERROR, "Syntax error parsing '%s' at '%s'\n", v->value, chan);
|
||||||
ast_destroy(cfg);
|
ast_destroy(cfg);
|
||||||
ast_mutex_unlock(&iflock);
|
ast_mutex_unlock(&iflock);
|
||||||
unload_module();
|
zt_unload();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (finish < start) {
|
if (finish < start) {
|
||||||
@@ -6994,7 +7051,7 @@ int load_module()
|
|||||||
ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value);
|
ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value);
|
||||||
ast_destroy(cfg);
|
ast_destroy(cfg);
|
||||||
ast_mutex_unlock(&iflock);
|
ast_mutex_unlock(&iflock);
|
||||||
unload_module();
|
zt_unload();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7236,7 +7293,7 @@ int load_module()
|
|||||||
ast_log(LOG_ERROR, "Unknown switchtype '%s'\n", v->value);
|
ast_log(LOG_ERROR, "Unknown switchtype '%s'\n", v->value);
|
||||||
ast_destroy(cfg);
|
ast_destroy(cfg);
|
||||||
ast_mutex_unlock(&iflock);
|
ast_mutex_unlock(&iflock);
|
||||||
unload_module();
|
zt_unload();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (!strcasecmp(v->name, "minunused")) {
|
} else if (!strcasecmp(v->name, "minunused")) {
|
||||||
@@ -7253,19 +7310,6 @@ int load_module()
|
|||||||
v = v->next;
|
v = v->next;
|
||||||
}
|
}
|
||||||
ast_mutex_unlock(&iflock);
|
ast_mutex_unlock(&iflock);
|
||||||
/* Make sure we can register our Zap channel type */
|
|
||||||
if (ast_channel_register(type, tdesc, AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, zt_request)) {
|
|
||||||
ast_log(LOG_ERROR, "Unable to register channel class %s\n", type);
|
|
||||||
ast_destroy(cfg);
|
|
||||||
unload_module();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (ast_channel_register(typecompat, tdesc, AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, zt_request)) {
|
|
||||||
ast_log(LOG_ERROR, "Unable to register channel class %s\n", typecompat);
|
|
||||||
ast_destroy(cfg);
|
|
||||||
unload_module();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ast_destroy(cfg);
|
ast_destroy(cfg);
|
||||||
#ifdef ZAPATA_PRI
|
#ifdef ZAPATA_PRI
|
||||||
for (x=0;x<NUM_SPANS;x++) {
|
for (x=0;x<NUM_SPANS;x++) {
|
||||||
@@ -7286,6 +7330,39 @@ int load_module()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
/* And start the monitor for the first time */
|
||||||
|
restart_monitor();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_module(void)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
#ifdef ZAPATA_PRI
|
||||||
|
int y;
|
||||||
|
memset(pris, 0, sizeof(pris));
|
||||||
|
for (y=0;y<NUM_SPANS;y++) {
|
||||||
|
pris[y].offset = -1;
|
||||||
|
pris[y].fd = -1;
|
||||||
|
}
|
||||||
|
pri_set_error(zt_pri_error);
|
||||||
|
pri_set_message(zt_pri_message);
|
||||||
|
#endif
|
||||||
|
res = setup_zap();
|
||||||
|
/* Make sure we can register our Zap channel type */
|
||||||
|
if (ast_channel_register(type, tdesc, AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, zt_request)) {
|
||||||
|
ast_log(LOG_ERROR, "Unable to register channel class %s\n", type);
|
||||||
|
zt_unload();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (ast_channel_register(typecompat, tdesc, AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, zt_request)) {
|
||||||
|
ast_log(LOG_ERROR, "Unable to register channel class %s\n", typecompat);
|
||||||
|
zt_unload();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#ifdef ZAPATA_PRI
|
||||||
ast_cli_register(&pri_debug);
|
ast_cli_register(&pri_debug);
|
||||||
ast_cli_register(&pri_no_debug);
|
ast_cli_register(&pri_no_debug);
|
||||||
ast_cli_register(&pri_really_debug);
|
ast_cli_register(&pri_really_debug);
|
||||||
@@ -7302,70 +7379,8 @@ int load_module()
|
|||||||
ast_manager_register( "ZapTransfer", 0, action_transfer, "Transfer Zap Channel" );
|
ast_manager_register( "ZapTransfer", 0, action_transfer, "Transfer Zap Channel" );
|
||||||
ast_manager_register( "ZapHangup", 0, action_transferhangup, "Hangup Zap Channel" );
|
ast_manager_register( "ZapHangup", 0, action_transferhangup, "Hangup Zap Channel" );
|
||||||
ast_manager_register( "ZapDialOffhook", 0, action_zapdialoffhook, "Dial over Zap channel while offhook" );
|
ast_manager_register( "ZapDialOffhook", 0, action_zapdialoffhook, "Dial over Zap channel while offhook" );
|
||||||
/* And start the monitor for the first time */
|
|
||||||
restart_monitor();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int unload_module()
|
return res;
|
||||||
{
|
|
||||||
struct zt_pvt *p, *pl;
|
|
||||||
/* First, take us out of the channel loop */
|
|
||||||
ast_channel_unregister(type);
|
|
||||||
ast_channel_unregister(typecompat);
|
|
||||||
ast_cli_unregister(&cli_show_channels);
|
|
||||||
ast_cli_unregister(&cli_show_channel);
|
|
||||||
ast_cli_unregister(&cli_destroy_channel);
|
|
||||||
if (!ast_mutex_lock(&iflock)) {
|
|
||||||
/* Hangup all interfaces if they have an owner */
|
|
||||||
p = iflist;
|
|
||||||
while(p) {
|
|
||||||
if (p->owner)
|
|
||||||
ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD);
|
|
||||||
p = p->next;
|
|
||||||
}
|
|
||||||
iflist = NULL;
|
|
||||||
ast_mutex_unlock(&iflock);
|
|
||||||
} else {
|
|
||||||
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (!ast_mutex_lock(&monlock)) {
|
|
||||||
if (monitor_thread) {
|
|
||||||
pthread_cancel(monitor_thread);
|
|
||||||
pthread_kill(monitor_thread, SIGURG);
|
|
||||||
pthread_join(monitor_thread, NULL);
|
|
||||||
}
|
|
||||||
monitor_thread = -2;
|
|
||||||
ast_mutex_unlock(&monlock);
|
|
||||||
} else {
|
|
||||||
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ast_mutex_lock(&iflock)) {
|
|
||||||
/* Destroy all the interfaces and free their memory */
|
|
||||||
p = iflist;
|
|
||||||
while(p) {
|
|
||||||
/* Free any callerid */
|
|
||||||
if (p->cidspill)
|
|
||||||
free(p->cidspill);
|
|
||||||
/* Close the zapata thingy */
|
|
||||||
if (p->subs[SUB_REAL].zfd > -1)
|
|
||||||
zt_close(p->subs[SUB_REAL].zfd);
|
|
||||||
pl = p;
|
|
||||||
p = p->next;
|
|
||||||
/* Free associated memory */
|
|
||||||
free(pl);
|
|
||||||
}
|
|
||||||
iflist = NULL;
|
|
||||||
ast_mutex_unlock(&iflock);
|
|
||||||
} else {
|
|
||||||
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
Reference in New Issue
Block a user