diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-06-22 17:42:14 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-06-22 17:42:14 +0000 |
commit | ae5c80e1deeae11fa0f3478a6efa03e38971897f (patch) | |
tree | a3a0875ae4e73c9d9a1fc67f56ffa1ce73fe5457 /channels | |
parent | 8f813d432c685f0b0c25e98261379b083263cf32 (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-x | channels/chan_agent.c | 18 | ||||
-rwxr-xr-x | channels/chan_h323.c | 13 | ||||
-rwxr-xr-x | channels/chan_iax.c | 9 | ||||
-rwxr-xr-x | channels/chan_iax2.c | 8 | ||||
-rwxr-xr-x | channels/chan_local.c | 7 | ||||
-rwxr-xr-x | channels/chan_mgcp.c | 36 | ||||
-rwxr-xr-x | channels/chan_sip.c | 6 | ||||
-rwxr-xr-x | channels/chan_skinny.c | 6 | ||||
-rwxr-xr-x | channels/chan_vpb.c | 17 | ||||
-rwxr-xr-x | channels/chan_zap.c | 74 | ||||
-rwxr-xr-x | channels/h323/INSTALL.openh323 | 10 | ||||
-rwxr-xr-x | channels/h323/Makefile | 27 |
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(®l.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 |