aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-06-22 17:42:14 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-06-22 17:42:14 +0000
commitae5c80e1deeae11fa0f3478a6efa03e38971897f (patch)
treea3a0875ae4e73c9d9a1fc67f56ffa1ce73fe5457 /channels
parent8f813d432c685f0b0c25e98261379b083263cf32 (diff)
Merge major BSD mutex and symbol conflict patches (bug #1816) (link patch still pending)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3273 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rwxr-xr-xchannels/chan_agent.c18
-rwxr-xr-xchannels/chan_h323.c13
-rwxr-xr-xchannels/chan_iax.c9
-rwxr-xr-xchannels/chan_iax2.c8
-rwxr-xr-xchannels/chan_local.c7
-rwxr-xr-xchannels/chan_mgcp.c36
-rwxr-xr-xchannels/chan_sip.c6
-rwxr-xr-xchannels/chan_skinny.c6
-rwxr-xr-xchannels/chan_vpb.c17
-rwxr-xr-xchannels/chan_zap.c74
-rwxr-xr-xchannels/h323/INSTALL.openh32310
-rwxr-xr-xchannels/h323/Makefile27
12 files changed, 171 insertions, 60 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index f91c6324b..bdbefe232 100755
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -213,8 +213,8 @@ static struct agent_pvt *add_agent(char *agent, int pending)
if (p) {
memset(p, 0, sizeof(struct agent_pvt));
strncpy(p->agent, tmp, sizeof(p->agent) -1);
- ast_mutex_init( &p->lock );
- ast_mutex_init( &p->app_lock );
+ ast_mutex_init(&p->lock);
+ ast_mutex_init(&p->app_lock);
p->owning_app = (pthread_t) -1;
p->app_sleep_cond = 1;
p->group = group;
@@ -252,8 +252,11 @@ static int agent_cleanup(struct agent_pvt *p)
ast_mutex_unlock(&p->app_lock);
if (chan)
ast_channel_free(chan);
- if (p->dead)
+ if (p->dead) {
+ ast_mutex_destroy(&p->lock);
+ ast_mutex_destroy(&p->app_lock);
free(p);
+ }
return 0;
}
@@ -571,6 +574,8 @@ static int agent_hangup(struct ast_channel *ast)
kill it later */
p->abouttograb = 0;
} else if (p->dead) {
+ ast_mutex_destroy(&p->lock);
+ ast_mutex_destroy(&p->app_lock);
free(p);
} else {
if (p->chan) {
@@ -844,6 +849,8 @@ static int read_agent_config(void)
/* Destroy if appropriate */
if (!p->owner) {
if (!p->chan) {
+ ast_mutex_destroy(&p->lock);
+ ast_mutex_destroy(&p->app_lock);
free(p);
} else {
/* Cause them to hang up */
@@ -1425,8 +1432,11 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode)
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Agent '%s' logged out\n", p->agent);
/* If there is no owner, go ahead and kill it now */
- if (p->dead && !p->owner)
+ if (p->dead && !p->owner) {
+ ast_mutex_destroy(&p->lock);
+ ast_mutex_destroy(&p->app_lock);
free(p);
+ }
}
else {
ast_mutex_unlock(&p->lock);
diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index e016b4812..622b71f17 100755
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -55,7 +55,8 @@
#include <fcntl.h>
#include <netdb.h>
#include <sys/signal.h>
-#ifdef __OpenBSD__
+#include <sys/param.h>
+#if defined(BSD)
#include <netinet/in_systm.h>
#ifndef IPTOS_MINCOST
#define IPTOS_MINCOST 0x02
@@ -186,8 +187,10 @@ static void __oh323_destroy(struct oh323_pvt *p)
}
if (!cur) {
ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
- } else
+ } else {
+ ast_mutex_destroy(&p->lock);
free(p);
+ }
}
static void oh323_destroy(struct oh323_pvt *p)
@@ -1840,11 +1843,14 @@ static struct ast_rtp_protocol oh323_rtp = {
set_rtp_peer: oh323_set_rtp_peer,
};
-
int load_module()
{
int res;
+ ast_mutex_init(&userl.lock);
+ ast_mutex_init(&peerl.lock);
+ ast_mutex_init(&aliasl.lock);
+
res = reload_config();
if (res) {
@@ -1948,6 +1954,7 @@ int unload_module()
pl = p;
p = p->next;
/* free associated memory */
+ ast_mutex_destroy(&pl->lock);
free(pl);
}
iflist = NULL;
diff --git a/channels/chan_iax.c b/channels/chan_iax.c
index b8a48fed2..055f303ec 100755
--- a/channels/chan_iax.c
+++ b/channels/chan_iax.c
@@ -447,7 +447,7 @@ static struct iax_dpcache {
struct iax_dpcache *peer; /* For linking in peers */
} *dpcache;
-static ast_mutex_t dpcache_lock;
+AST_MUTEX_DEFINE_STATIC(dpcache_lock);
#ifdef DEBUG_SUPPORT
static void showframe(struct ast_iax_frame *f, struct ast_iax_full_hdr *fhi, int rx, struct sockaddr_in *sin)
@@ -5369,6 +5369,12 @@ static int __unload_module(void)
int unload_module()
{
+ int x;
+ for (x=0;x<AST_IAX_MAX_CALLS;x++)
+ ast_mutex_destroy(&iaxsl[x]);
+ ast_mutex_destroy(&iaxq.lock);
+ ast_mutex_destroy(&userl.lock);
+ ast_mutex_destroy(&peerl.lock);
return __unload_module();
}
@@ -5403,7 +5409,6 @@ int load_module(void)
ast_mutex_init(&iaxq.lock);
ast_mutex_init(&userl.lock);
ast_mutex_init(&peerl.lock);
- ast_mutex_init(&dpcache_lock);
ast_cli_register(&cli_show_users);
ast_cli_register(&cli_show_channels);
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index cd70a2fda..ba785ce48 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -507,7 +507,7 @@ static struct iax2_dpcache {
struct iax2_dpcache *peer; /* For linking in peers */
} *dpcache;
-static ast_mutex_t dpcache_lock;
+AST_MUTEX_DEFINE_STATIC(dpcache_lock);
static void iax_debug_output(const char *data)
{
@@ -4434,6 +4434,7 @@ static int timing_read(int *id, int fd, short events, void *cbdata)
ast_log(LOG_DEBUG, "Dropping unused iax2 trunk peer '%s:%d'\n", inet_ntoa(drop->addr.sin_addr), ntohs(drop->addr.sin_port));
free(drop->trunkdata);
ast_mutex_unlock(&drop->lock);
+ ast_mutex_destroy(&drop->lock);
free(drop);
}
@@ -6820,6 +6821,10 @@ static int __unload_module(void)
int unload_module()
{
+ ast_mutex_destroy(&iaxq.lock);
+ ast_mutex_destroy(&userl.lock);
+ ast_mutex_destroy(&peerl.lock);
+ ast_mutex_destroy(&waresl.lock);
return __unload_module();
}
@@ -6867,6 +6872,7 @@ int load_module(void)
ast_mutex_init(&iaxq.lock);
ast_mutex_init(&userl.lock);
ast_mutex_init(&peerl.lock);
+ ast_mutex_init(&waresl.lock);
ast_cli_register(&cli_show_users);
ast_cli_register(&cli_show_channels);
diff --git a/channels/chan_local.c b/channels/chan_local.c
index 6421243d9..b4426825b 100755
--- a/channels/chan_local.c
+++ b/channels/chan_local.c
@@ -87,6 +87,7 @@ retrylock:
/* We had a glare on the hangup. Forget all this business,
return and destroy p. */
ast_mutex_unlock(&p->lock);
+ ast_mutex_destroy(&p->lock);
free(p);
return -1;
}
@@ -271,6 +272,7 @@ static void local_destroy(struct local_pvt *p)
prev->next = cur->next;
else
locals = cur->next;
+ ast_mutex_destroy(cur);
free(cur);
break;
}
@@ -324,8 +326,10 @@ static int local_hangup(struct ast_channel *ast)
}
ast_mutex_unlock(&locallock);
/* And destroy */
- if (!glaredetect)
+ if (!glaredetect) {
+ ast_mutex_destroy(&p->lock);
free(p);
+ }
return 0;
}
if (p->chan && !p->launchedpbx)
@@ -366,6 +370,7 @@ static struct local_pvt *local_alloc(char *data, int format)
tmp->reqformat = format;
if (!ast_exists_extension(NULL, tmp->context, tmp->exten, 1, NULL)) {
ast_log(LOG_NOTICE, "No such extension/context %s@%s creating local channel\n", tmp->context, tmp->exten);
+ ast_mutex_destroy(&tmp->lock);
free(tmp);
tmp = NULL;
} else {
diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c
index 740731eab..b00168eeb 100755
--- a/channels/chan_mgcp.c
+++ b/channels/chan_mgcp.c
@@ -3423,15 +3423,19 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
gw->expire = -1;
gw->dynamic = 0;
if (ast_get_ip(&gw->addr, v->value)) {
- if (!gw_reload)
+ if (!gw_reload) {
+ ast_mutex_destroy(&gw->msgs_lock);
free(gw);
+ }
return NULL;
}
}
} else if (!strcasecmp(v->name, "defaultip")) {
if (ast_get_ip(&gw->defaddr, v->value)) {
- if (!gw_reload)
+ if (!gw_reload) {
+ ast_mutex_destroy(&gw->msgs_lock);
free(gw);
+ }
return NULL;
}
} else if (!strcasecmp(v->name, "permit") ||
@@ -3501,15 +3505,17 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
}
if (!e) {
+ /* Allocate wildcard endpoint */
e = malloc(sizeof(struct mgcp_endpoint));
ep_reload = 0;
}
- /* Allocate wildcard endpoint */
- e = malloc(sizeof(struct mgcp_endpoint));
if (e) {
if (!ep_reload) {
memset(e, 0, sizeof(struct mgcp_endpoint));
+ ast_mutex_init(&e->lock);
+ ast_mutex_init(&e->rqnt_queue_lock);
+ ast_mutex_init(&e->cmd_queue_lock);
strncpy(e->name, v->value, sizeof(e->name) - 1);
e->needaudit = 1;
}
@@ -3545,6 +3551,8 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
if (sub) {
ast_verbose(VERBOSE_PREFIX_3 "Allocating subchannel '%d' on %s@%s\n", i, e->name, gw->name);
memset(sub, 0, sizeof(struct mgcp_subchannel));
+ ast_mutex_init(&sub->lock);
+ ast_mutex_init(&sub->cx_queue_lock);
sub->parent = e;
sub->id = i;
snprintf(sub->txident, sizeof(sub->txident), "%08x", rand());
@@ -3594,6 +3602,9 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
if (e) {
if (!ep_reload) {
memset(e, 0, sizeof(struct mgcp_endpoint));
+ ast_mutex_init(&e->lock);
+ ast_mutex_init(&e->rqnt_queue_lock);
+ ast_mutex_init(&e->cmd_queue_lock);
strncpy(e->name, v->value, sizeof(e->name) - 1);
e->needaudit = 1;
}
@@ -3633,8 +3644,6 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
/* ASSUME we're onhook */
e->hookstate = MGCP_ONHOOK;
snprintf(e->rqnt_ident, sizeof(e->rqnt_ident), "%08x", rand());
- ast_mutex_init(&e->rqnt_queue_lock);
- ast_mutex_init(&e->cmd_queue_lock);
}
for (i = 0, sub = NULL; i < MAX_SUBS; i++) {
@@ -3652,13 +3661,14 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
if (!ep_reload) {
ast_verbose(VERBOSE_PREFIX_3 "Allocating subchannel '%d' on %s@%s\n", i, e->name, gw->name);
memset(sub, 0, sizeof(struct mgcp_subchannel));
+ ast_mutex_init(&sub->lock);
+ ast_mutex_init(&sub->cx_queue_lock);
strncpy(sub->magic, MGCP_SUBCHANNEL_MAGIC, sizeof(sub->magic) - 1);
sub->parent = e;
sub->id = i;
snprintf(sub->txident, sizeof(sub->txident), "%08x", rand());
sub->cxmode = MGCP_CX_INACTIVE;
sub->next = e->sub;
- ast_mutex_init(&sub->cx_queue_lock);
e->sub = sub;
}
sub->nat = nat;
@@ -3690,8 +3700,10 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
}
if (!ntohl(gw->addr.sin_addr.s_addr) && !gw->dynamic) {
ast_log(LOG_WARNING, "Gateway '%s' lacks IP address and isn't dynamic\n", gw->name);
- if (!gw_reload)
+ if (!gw_reload) {
+ ast_mutex_destroy(&gw->msgs_lock);
free(gw);
+ }
return NULL;
}
if (gw->defaddr.sin_addr.s_addr && !ntohs(gw->defaddr.sin_port))
@@ -3803,8 +3815,13 @@ static void destroy_endpoint(struct mgcp_endpoint *e)
for (i = 0; (i < MAX_SUBS) && sub; i++) {
s = sub;
sub = sub->next;
+ ast_mutex_destroy(&s->lock);
+ ast_mutex_destroy(&s->cx_queue_lock);
free(s);
}
+ ast_mutex_destroy(&e->lock);
+ ast_mutex_destroy(&e->rqnt_queue_lock);
+ ast_mutex_destroy(&e->cmd_queue_lock);
free(e);
}
@@ -4132,6 +4149,9 @@ int unload_module()
pl = p;
p = p->next;
/* Free associated memory */
+ ast_mutex_destroy(&pl->lock);
+ ast_mutex_destroy(&pl->rqnt_queue_lock);
+ ast_mutex_destroy(&pl->cmd_queue_lock);
free(pl);
}
iflist = NULL;
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index a789d8915..f7befec62 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2042,11 +2042,11 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useg
struct sip_pvt *p;
p = malloc(sizeof(struct sip_pvt));
- ast_mutex_init(&p->lock);
if (!p)
return NULL;
/* Keep track of stuff */
memset(p, 0, sizeof(struct sip_pvt));
+ ast_mutex_init(&p->lock);
p->initid = -1;
p->autokillid = -1;
p->stateid = -1;
@@ -8326,6 +8326,7 @@ int unload_module()
pl = p;
p = p->next;
/* Free associated memory */
+ ast_mutex_destroy(&pl->lock);
free(pl);
}
iflist = NULL;
@@ -8338,6 +8339,9 @@ int unload_module()
if (localaddr) {
ast_free_ha(localaddr);
}
+ ast_mutex_destroy(&userl.lock);
+ ast_mutex_destroy(&peerl.lock);
+ ast_mutex_destroy(&regl.lock);
return 0;
}
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index e5189634e..d73ce62b8 100755
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -1104,6 +1104,7 @@ static struct skinny_device *build_device(char *cat, struct ast_variable *v)
l = malloc(sizeof(struct skinny_line));;
if (l) {
memset(l, 0, sizeof(struct skinny_line));
+ ast_mutex_init(&l->lock);
strncpy(l->name, v->value, sizeof(l->name) - 1);
/* XXX Should we check for uniqueness?? XXX */
@@ -1145,6 +1146,7 @@ static struct skinny_device *build_device(char *cat, struct ast_variable *v)
if (sub) {
ast_verbose(VERBOSE_PREFIX_3 "Allocating Skinny subchannel '%d' on %s@%s\n", i, l->name, d->name);
memset(sub, 0, sizeof(struct skinny_subchannel));
+ ast_mutex_init(&sub->lock);
sub->parent = l;
/* Make a call*ID */
sub->callid = callnums;
@@ -2262,6 +2264,7 @@ static void destroy_session(struct skinnysession *s)
sessions = cur->next;
if (s->fd > -1)
close(s->fd);
+ ast_mutex_destroy(&s->lock);
free(s);
} else
ast_log(LOG_WARNING, "Trying to delete non-existant session %p?\n", s);
@@ -2662,10 +2665,12 @@ void delete_devices(void)
for (sub=l->sub;sub;) {
slast = sub;
sub = sub->next;
+ ast_mutex_destroy(&slast->lock);
free(slast);
}
llast = l;
l = l->next;
+ ast_mutex_destroy(&llast->lock);
free(llast);
}
dlast = d;
@@ -2758,6 +2763,7 @@ int unload_module()
pl = p;
p = p->next;
/* Free associated memory */
+ ast_mutex_destroy(&pl->lock);
free(pl);
}
iflist = NULL;
diff --git a/channels/chan_vpb.c b/channels/chan_vpb.c
index 7528a0f20..8344ccba3 100755
--- a/channels/chan_vpb.c
+++ b/channels/chan_vpb.c
@@ -279,8 +279,6 @@ static int vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags,
bridges[i].fo = fo;
bridges[i].c0 = c0;
bridges[i].c1 = c1;
- ast_mutex_init(&bridges[i].lock);
- pthread_cond_init(&bridges[i].cond, NULL);
}
} ast_mutex_unlock(&bridge_lock);
@@ -356,8 +354,6 @@ static int vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags,
ast_mutex_lock(&bridge_lock); {
bridges[i].inuse = 0;
- ast_mutex_destroy(&bridges[i].lock);
- pthread_cond_destroy(&bridges[i].cond);
} ast_mutex_unlock(&bridge_lock);
p0->bridge = NULL;
@@ -975,8 +971,13 @@ static void mkbrd(vpb_model_t model, int echo_cancel)
bridges = (vpb_bridge_t *)malloc(max_bridges * sizeof(vpb_bridge_t) );
if(!bridges)
ast_log(LOG_ERROR, "Failed to initialize bridges\n");
- else
+ else {
memset(bridges,0,max_bridges * sizeof(vpb_bridge_t));
+ for(int i = 0; i < max_bridges; i++ ) {
+ ast_mutex_init(&bridges[i].lock);
+ pthread_cond_init(&bridges[i].cond, NULL);
+ }
+ }
}
if(!echo_cancel) {
if (model==vpb_model_v4pci) {
@@ -1062,6 +1063,7 @@ struct vpb_pvt *mkif(int board, int channel, int mode, float txgain, float rxgai
tmp->vpb_model = vpb_model_v4pci;
}
+ ast_mutex_init(&tmp->owner_lock);
ast_mutex_init(&tmp->lock);
ast_mutex_init(&tmp->record_lock);
ast_mutex_init(&tmp->play_lock);
@@ -2080,6 +2082,7 @@ int unload_module()
p = iflist;
ast_mutex_destroy(&p->lock);
pthread_cancel(p->readthread);
+ ast_mutex_destroy(&p->owner_lock);
ast_mutex_destroy(&p->record_lock);
ast_mutex_destroy(&p->play_lock);
ast_mutex_destroy(&p->play_dtmf_lock);
@@ -2098,6 +2101,10 @@ int unload_module()
memset(bridges, 0, sizeof bridges);
} ast_mutex_unlock(&bridge_lock);
ast_mutex_destroy(&bridge_lock);
+ for(int i = 0; i < max_bridges; i++ ) {
+ ast_mutex_destroy(&bridges[i].lock);
+ pthread_cond_destroy(&bridges[i].cond, NULL);
+ }
free(bridges);
return 0;
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index d9f88c33a..77547cda1 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -1756,6 +1756,14 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
return 0;
}
+static void destroy_zt_pvt(struct zt_pvt **pvt)
+{
+ struct zt_pvt *p = *pvt;
+ ast_mutex_destroy(&p->lock);
+ free(p);
+ *pvt = NULL;
+}
+
static int destroy_channel(struct zt_pvt *prev, struct zt_pvt *cur, int now)
{
int owned = 0;
@@ -1788,7 +1796,7 @@ static int destroy_channel(struct zt_pvt *prev, struct zt_pvt *cur, int now)
if (cur->subs[SUB_REAL].zfd > -1) {
zt_close(cur->subs[SUB_REAL].zfd);
}
- free(cur);
+ destroy_zt_pvt(&cur);
}
} else {
if (prev) {
@@ -1807,7 +1815,7 @@ static int destroy_channel(struct zt_pvt *prev, struct zt_pvt *cur, int now)
if (cur->subs[SUB_REAL].zfd > -1) {
zt_close(cur->subs[SUB_REAL].zfd);
}
- free(cur);
+ destroy_zt_pvt(&cur);
}
return 0;
}
@@ -5751,10 +5759,11 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
tmp = (struct zt_pvt*)malloc(sizeof(struct zt_pvt));
if (!tmp) {
ast_log(LOG_ERROR, "MALLOC FAILED\n");
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
memset(tmp, 0, sizeof(struct zt_pvt));
+ ast_mutex_init(&tmp->lock);
ifcount++;
for (x=0;x<3;x++)
tmp->subs[x].zfd = -1;
@@ -5811,20 +5820,19 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
/* Allocate a zapata structure */
if (tmp->subs[SUB_REAL].zfd < 0) {
ast_log(LOG_ERROR, "Unable to open channel %d: %s\nhere = %d, tmp->channel = %d, channel = %d\n", channel, strerror(errno), here, tmp->channel, channel);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
memset(&p, 0, sizeof(p));
res = ioctl(tmp->subs[SUB_REAL].zfd, ZT_GET_PARAMS, &p);
if (res < 0) {
ast_log(LOG_ERROR, "Unable to get parameters\n");
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (p.sigtype != (signalling & 0x3ffff)) {
ast_log(LOG_ERROR, "Signalling requested is %s but line is in %s signalling\n", sig2str(signalling), sig2str(p.sigtype));
- free(tmp);
- tmp = NULL;
+ destroy_zt_pvt(&tmp);
return tmp;
}
if (here) {
@@ -5855,18 +5863,18 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
offset = 0;
if ((signalling == SIG_PRI) && ioctl(tmp->subs[SUB_REAL].zfd, ZT_AUDIOMODE, &offset)) {
ast_log(LOG_ERROR, "Unable to set clear mode on clear channel %d of span %d: %s\n", channel, p.spanno, strerror(errno));
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (span >= NUM_SPANS) {
ast_log(LOG_ERROR, "Channel %d does not lie on a span I know of (%d)\n", channel, span);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
} else {
si.spanno = 0;
if (ioctl(tmp->subs[SUB_REAL].zfd,ZT_SPANSTAT,&si) == -1) {
ast_log(LOG_ERROR, "Unable to get span status: %s\n", strerror(errno));
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
/* Store the logical span first based upon the real span */
@@ -5874,7 +5882,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
pri_resolve_span(&span, channel, (channel - p.chanpos), &si);
if (span < 0) {
ast_log(LOG_WARNING, "Channel %d: Unable to find locate channel/trunk group!\n", channel);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (signalling == SIG_PRI)
@@ -5895,43 +5903,43 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
if (!matchesdchan) {
if (pris[span].nodetype && (pris[span].nodetype != pritype)) {
ast_log(LOG_ERROR, "Span %d is already a %s node\n", span + 1, pri_node2str(pris[span].nodetype));
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (pris[span].switchtype && (pris[span].switchtype != myswitchtype)) {
ast_log(LOG_ERROR, "Span %d is already a %s switch\n", span + 1, pri_switch2str(pris[span].switchtype));
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if ((pris[span].dialplan) && (pris[span].dialplan != dialplan)) {
ast_log(LOG_ERROR, "Span %d is already a %s dialing plan\n", span + 1, pri_plan2str(pris[span].dialplan));
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (!ast_strlen_zero(pris[span].idledial) && strcmp(pris[span].idledial, idledial)) {
ast_log(LOG_ERROR, "Span %d already has idledial '%s'.\n", span + 1, idledial);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (!ast_strlen_zero(pris[span].idleext) && strcmp(pris[span].idleext, idleext)) {
ast_log(LOG_ERROR, "Span %d already has idleext '%s'.\n", span + 1, idleext);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (pris[span].minunused && (pris[span].minunused != minunused)) {
ast_log(LOG_ERROR, "Span %d already has minunused of %d.\n", span + 1, minunused);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (pris[span].minidle && (pris[span].minidle != minidle)) {
ast_log(LOG_ERROR, "Span %d already has minidle of %d.\n", span + 1, minidle);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (pris[span].numchans >= MAX_CHANNELS) {
ast_log(LOG_ERROR, "Unable to add channel %d: Too many channels in trunk group %d!\n", channel,
pris[span].trunkgroup);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
pris[span].nodetype = pritype;
@@ -5949,7 +5957,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
tmp->call = NULL;
} else {
ast_log(LOG_ERROR, "Channel %d is reserved for D-channel.\n", offset);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
}
@@ -5968,7 +5976,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
if (!tmp->r2) {
ast_log(LOG_WARNING, "Unable to create r2 call :(\n");
zt_close(tmp->subs[SUB_REAL].zfd);
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
} else {
@@ -6021,7 +6029,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
res = ioctl(tmp->subs[SUB_REAL].zfd, ZT_SET_PARAMS, &p);
if (res < 0) {
ast_log(LOG_ERROR, "Unable to set parameters\n");
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
}
@@ -6081,7 +6089,6 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
tmp->propconfno = -1;
}
tmp->transfer = transfer;
- ast_mutex_init(&tmp->lock);
strncpy(tmp->defcontext,context,sizeof(tmp->defcontext)-1);
strncpy(tmp->language, language, sizeof(tmp->language)-1);
strncpy(tmp->musicclass, musicclass, sizeof(tmp->musicclass)-1);
@@ -6117,7 +6124,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
memset(&si, 0, sizeof(si));
if (ioctl(tmp->subs[SUB_REAL].zfd,ZT_SPANSTAT,&si) == -1) {
ast_log(LOG_ERROR, "Unable to get span status: %s\n", strerror(errno));
- free(tmp);
+ destroy_zt_pvt(&tmp);
return NULL;
}
if (si.alarms) tmp->inalarm = 1;
@@ -6222,11 +6229,12 @@ static struct zt_pvt *chandup(struct zt_pvt *src)
p = malloc(sizeof(struct zt_pvt));
if (p) {
memcpy(p, src, sizeof(struct zt_pvt));
+ ast_mutex_init(&p->lock);
p->subs[SUB_REAL].zfd = zt_open("/dev/zap/pseudo");
/* Allocate a zapata structure */
if (p->subs[SUB_REAL].zfd < 0) {
ast_log(LOG_ERROR, "Unable to dup channel: %s\n", strerror(errno));
- free(p);
+ destroy_zt_pvt(&p);
return NULL;
}
res = ioctl(p->subs[SUB_REAL].zfd, ZT_GET_BUFINFO, &bi);
@@ -8280,8 +8288,8 @@ static int __unload_module(void)
p = p->next;
x++;
/* Free associated memory */
- if(p)
- free(pl);
+ if(pl)
+ destroy_zt_pvt(&pl);
ast_verbose(VERBOSE_PREFIX_3 "Unregistered channel %d\n", x);
}
iflist = NULL;
@@ -8302,6 +8310,11 @@ static int __unload_module(void)
int unload_module()
{
+#ifdef ZAPATA_PRI
+ int y;
+ for (y=0;y<NUM_SPANS;y++)
+ ast_mutex_destroy(&pris[y].lock);
+#endif
return __unload_module();
}
@@ -8922,6 +8935,7 @@ int load_module(void)
int y,i;
memset(pris, 0, sizeof(pris));
for (y=0;y<NUM_SPANS;y++) {
+ ast_mutex_init(&pris[y].lock);
pris[y].offset = -1;
pris[y].master = AST_PTHREADT_NULL;
for (i=0;i<NUM_DCHANS;i++)
@@ -9028,9 +9042,13 @@ static int reload_zt(void)
#if 0
#ifdef ZAPATA_PRI
- memset(pris, 0, sizeof(pris));
for (y=0;y<NUM_SPANS;y++)
+ ast_mutex_destroy(&pris[y]->lock);
+ memset(pris, 0, sizeof(pris));
+ for (y=0;y<NUM_SPANS;y++) {
+ ast_mutex_init(&pris[y]->lock);
pris[y].fd = -1;
+ }
#endif
#endif /* 0 */
diff --git a/channels/h323/INSTALL.openh323 b/channels/h323/INSTALL.openh323
index 426e76701..f46c37905 100755
--- a/channels/h323/INSTALL.openh323
+++ b/channels/h323/INSTALL.openh323
@@ -6,3 +6,13 @@ You only need to do 'make opt'. Anything else you will be simply waisting time a
Also, you will notice they never tell you to 'make install' so don't do it.
+On FreeBSD, the Makefiles are configured to
+locate the compiled openh323 port, if it has
+been built. Here is one way to build
+openh323 and ptlib on such that the Makefiles
+find it:
+ # cd /usr/ports/net/openh323
+ # make
+It is not necessary to install the port. The
+asterisk makefiles do not use any files
+installed by the port.
diff --git a/channels/h323/Makefile b/channels/h323/Makefile
index 56cd61974..fa9c8ea11 100755
--- a/channels/h323/Makefile
+++ b/channels/h323/Makefile
@@ -19,8 +19,15 @@ endif
#
# This needs to be updated to deal with more than just little endian machines
#
-CFLAGS += -march=$(shell uname -m) -DPBYTE_ORDER=PLITTLE_ENDIAN
+OSARCH=$(shell uname -s)
+ifneq (${OSARCH},FreeBSD)
+CFLAGS += -march=$(shell uname -m)
+endif
+CFLAGS += -DPBYTE_ORDER=PLITTLE_ENDIAN
+ifeq (${OSARCH},Linux)
+LDLIBS+=-ldl
+endif
#############################################
#
@@ -38,16 +45,22 @@ CFLAGS += -march=$(shell uname -m) -DPBYTE_ORDER=PLITTLE_ENDIAN
# Pre Janus release directives
CFLAGS += -DNDEBUG -DDO_CRASH -DDEBUG_THREADS
-CFLAGS += -pipe -Wall -fPIC -Wmissing-prototypes -Wmissing-declarations
+CFLAGS += -pipe -Wall -fPIC
ifeq (${OSARCH},Linux)
CFLAGS += -DP_LINUX
+LIBS+=-lpthread
+endif
+ifeq ($(findstring BSD,${OSARCH}),BSD)
+CFLAGS += -pthread
endif
CFLAGS += -D_REENTRANT -D_GNU_SOURCE
CFLAGS += -DP_HAS_SEMAPHORES -DP_SSL -DP_PTHREADS
CFLAGS += -DPHAS_TEMPLATES -DPTRACING -DP_USE_PRAGMA
CFLAGS += -I../../include
CFLAGS += -I$(PWLIBDIR)/include/ptlib/unix -I$(PWLIBDIR)/include
-CFLAGS += -I$(OPENH323DIR)/include -Wno-missing-prototypes -Wno-missing-declarations
+CFLAGS += -I$(OPENH323DIR)/include
+CFLAGS += -Wno-missing-prototypes -Wno-missing-declarations
+LIBS+= -lcrypto -lssl -lexpat
all: libchanh323.a
@@ -59,19 +72,19 @@ samples:
ast_h323.o: ast_h323.cpp
- g++ -g -c -fno-rtti -o $@ $(CFLAGS) $<
+ $(CXX) -g -c -fno-rtti -o $@ $(CFLAGS) $<
libchanh323.a: ast_h323.o
ar cr libchanh323.a ast_h323.o
chan_h323.so:
- g++ -g -shared -Xlinker -x -o chan_h323.so chan_h323.o ast_h323.o -L$(PWLIBDIR)/lib -lpt_linux_x86_r -L$(OPENH323DIR)/lib -lh323_linux_x86_r -L/usr/lib -lpthread -ldl -lcrypto -lssl -lexpat
+ $(CXX) -g -shared -Xlinker -x -o chan_h323.so chan_h323.o ast_h323.o -L$(PWLIBDIR)/lib -lpt_linux_x86_r -L$(OPENH323DIR)/lib -lh323_linux_x86_r -L/usr/lib $(CHANH323LIB)
chan_h323_d.so: chan_h323.o ast_h323.o
- g++ -shared -Xlinker -x -o chan_h323.so chan_h323.o ast_h323.o -L$(PWLIBDIR)/lib -lpt_linux_x86_d -L$(OPENH323DIR)/lib -lh323_linux_x86_d -L/usr/lib -lpthread -ldl -lcrypto -lssl -lexpat
+ $(CXX) -shared -Xlinker -x -o chan_h323.so chan_h323.o ast_h323.o -L$(PWLIBDIR)/lib -lpt_linux_x86_d -L$(OPENH323DIR)/lib -lh323_linux_x86_d -L/usr/lib $(CHANH323LIB)
chan_h323_s.so: chan_h323.o ast_h323.o
- g++ -shared -Xlinker -x -o chan_h323.so chan_h323.o ast_h323.o -L$(PWLIBDIR)/lib -lpt_linux_x86_r_s -L$(OPENH323DIR)/lib -lh323_linux_x86_r_s -L/usr/lib -lpthread -ldl -lcrypto -lssl -lexpat
+ $(CXX) -shared -Xlinker -x -o chan_h323.so chan_h323.o ast_h323.o -L$(PWLIBDIR)/lib -lpt_linux_x86_r_s -L$(OPENH323DIR)/lib -lh323_linux_x86_r_s -L/usr/lib $(CHANH323LIB)
clean:
rm -f *.o *.so core.* libchanh323.a