|
|
@ -28,6 +28,7 @@
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
#include <linux/if_packet.h>
|
|
|
|
#include <linux/if_packet.h>
|
|
|
|
#include <linux/if_ether.h>
|
|
|
|
#include <linux/if_ether.h>
|
|
|
|
|
|
|
|
#include <sys/signal.h>
|
|
|
|
#include "adtranvofr.h"
|
|
|
|
#include "adtranvofr.h"
|
|
|
|
|
|
|
|
|
|
|
|
#define G723_MAX_BUF 2048
|
|
|
|
#define G723_MAX_BUF 2048
|
|
|
@ -53,7 +54,7 @@ static pthread_mutex_t monlock = PTHREAD_MUTEX_INITIALIZER;
|
|
|
|
|
|
|
|
|
|
|
|
/* This is the thread for the monitor which checks for input on the channels
|
|
|
|
/* This is the thread for the monitor which checks for input on the channels
|
|
|
|
which are not currently in use. */
|
|
|
|
which are not currently in use. */
|
|
|
|
static pthread_t monitor_thread = -1;
|
|
|
|
static pthread_t monitor_thread = 0;
|
|
|
|
|
|
|
|
|
|
|
|
static int restart_monitor(void);
|
|
|
|
static int restart_monitor(void);
|
|
|
|
|
|
|
|
|
|
|
@ -769,6 +770,7 @@ static struct ast_channel *vofr_new(struct vofr_pvt *i, int state)
|
|
|
|
if (ast_pbx_start(tmp)) {
|
|
|
|
if (ast_pbx_start(tmp)) {
|
|
|
|
ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
|
|
|
|
ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
|
|
|
|
ast_hangup(tmp);
|
|
|
|
ast_hangup(tmp);
|
|
|
|
|
|
|
|
tmp = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
} else
|
|
|
@ -839,10 +841,12 @@ static void *do_monitor(void *data)
|
|
|
|
/* This thread monitors all the frame relay interfaces which are not yet in use
|
|
|
|
/* This thread monitors all the frame relay interfaces which are not yet in use
|
|
|
|
(and thus do not have a separate thread) indefinitely */
|
|
|
|
(and thus do not have a separate thread) indefinitely */
|
|
|
|
/* From here on out, we die whenever asked */
|
|
|
|
/* From here on out, we die whenever asked */
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL)) {
|
|
|
|
if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL)) {
|
|
|
|
ast_log(LOG_WARNING, "Unable to set cancel type to asynchronous\n");
|
|
|
|
ast_log(LOG_WARNING, "Unable to set cancel type to asynchronous\n");
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
for(;;) {
|
|
|
|
for(;;) {
|
|
|
|
/* Don't let anybody kill us right away. Nobody should lock the interface list
|
|
|
|
/* Don't let anybody kill us right away. Nobody should lock the interface list
|
|
|
|
and wait for the monitor list, but the other way around is okay. */
|
|
|
|
and wait for the monitor list, but the other way around is okay. */
|
|
|
@ -877,11 +881,14 @@ static void *do_monitor(void *data)
|
|
|
|
|
|
|
|
|
|
|
|
/* And from now on, we're okay to be killed, so release the monitor lock as well */
|
|
|
|
/* And from now on, we're okay to be killed, so release the monitor lock as well */
|
|
|
|
pthread_mutex_unlock(&monlock);
|
|
|
|
pthread_mutex_unlock(&monlock);
|
|
|
|
|
|
|
|
pthread_testcancel();
|
|
|
|
/* Wait indefinitely for something to happen */
|
|
|
|
/* Wait indefinitely for something to happen */
|
|
|
|
res = select(n + 1, &rfds, NULL, NULL, NULL);
|
|
|
|
res = select(n + 1, &rfds, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
pthread_testcancel();
|
|
|
|
/* Okay, select has finished. Let's see what happened. */
|
|
|
|
/* Okay, select has finished. Let's see what happened. */
|
|
|
|
if (res < 0) {
|
|
|
|
if (res < 0) {
|
|
|
|
ast_log(LOG_WARNING, "select return %d: %s\n", res, strerror(errno));
|
|
|
|
if ((errno != EAGAIN) && (errno != EINTR))
|
|
|
|
|
|
|
|
ast_log(LOG_WARNING, "select return %d: %s\n", res, strerror(errno));
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* Alright, lock the interface list again, and let's look and see what has
|
|
|
|
/* Alright, lock the interface list again, and let's look and see what has
|
|
|
@ -927,12 +934,16 @@ static int restart_monitor(void)
|
|
|
|
ast_log(LOG_WARNING, "Cannot kill myself\n");
|
|
|
|
ast_log(LOG_WARNING, "Cannot kill myself\n");
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (monitor_thread != -1) {
|
|
|
|
if (monitor_thread) {
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
pthread_cancel(monitor_thread);
|
|
|
|
pthread_cancel(monitor_thread);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pthread_kill(monitor_thread, SIGURG);
|
|
|
|
#if 0
|
|
|
|
#if 0
|
|
|
|
pthread_join(monitor_thread, NULL);
|
|
|
|
pthread_join(monitor_thread, NULL);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!monitor_thread)
|
|
|
|
/* Start a new monitor */
|
|
|
|
/* Start a new monitor */
|
|
|
|
if (pthread_create(&monitor_thread, NULL, do_monitor, NULL) < 0) {
|
|
|
|
if (pthread_create(&monitor_thread, NULL, do_monitor, NULL) < 0) {
|
|
|
|
pthread_mutex_unlock(&monlock);
|
|
|
|
pthread_mutex_unlock(&monlock);
|
|
|
@ -1084,8 +1095,6 @@ int load_module()
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int unload_module()
|
|
|
|
int unload_module()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct vofr_pvt *p, *pl;
|
|
|
|
struct vofr_pvt *p, *pl;
|
|
|
@ -1106,8 +1115,9 @@ int unload_module()
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!pthread_mutex_lock(&monlock)) {
|
|
|
|
if (!pthread_mutex_lock(&monlock)) {
|
|
|
|
if (monitor_thread > -1) {
|
|
|
|
if (monitor_thread) {
|
|
|
|
pthread_cancel(monitor_thread);
|
|
|
|
pthread_cancel(monitor_thread);
|
|
|
|
|
|
|
|
pthread_kill(monitor_thread, SIGURG);
|
|
|
|
pthread_join(monitor_thread, NULL);
|
|
|
|
pthread_join(monitor_thread, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
monitor_thread = -2;
|
|
|
|
monitor_thread = -2;
|
|
|
|