summaryrefslogtreecommitdiff
path: root/addons/ooh323c/src/context.c
diff options
context:
space:
mode:
authorAlexandr Anikin <may@telecom-service.ru>2009-11-04 22:10:44 +0000
committerAlexandr Anikin <may@telecom-service.ru>2009-11-04 22:10:44 +0000
commit953031095415efa4558ca7eff29d7c85ff8efe89 (patch)
treec8a21eb3b2896c7f5b558913cb7ea914b40a06ce /addons/ooh323c/src/context.c
parent317435a93200520218c4e9f4bbb8c0258f363876 (diff)
Reworked chan_ooh323 channel module.
Many architectural and functional changes. Main changes are threading model chanes (many thread in ooh323 stack instead of one), modifications and improvements in signalling part, additional codecs support (726, speex), t38 mode support. This module tested and used in production environment. (closes issue #15285) Reported by: may213 Tested by: sles, c0w, OrNix Review: https://reviewboard.asterisk.org/r/324/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@227898 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'addons/ooh323c/src/context.c')
-rw-r--r--addons/ooh323c/src/context.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/addons/ooh323c/src/context.c b/addons/ooh323c/src/context.c
index d243f88a0..f2dc1119b 100644
--- a/addons/ooh323c/src/context.c
+++ b/addons/ooh323c/src/context.c
@@ -13,9 +13,12 @@
* maintain this copyright notice.
*
*****************************************************************************/
+#include <asterisk.h>
+#include <asterisk/lock.h>
#include "ooasn1.h"
#include <stdlib.h>
+#include <pthread.h>
int initContext (OOCTXT* pctxt)
{
@@ -25,6 +28,9 @@ int initContext (OOCTXT* pctxt)
pctxt->pMsgMemHeap = pctxt->pTypeMemHeap;
memHeapAddRef (&pctxt->pMsgMemHeap);
+
+ ast_mutex_init(&pctxt->pLock);
+
return ASN_OK;
}
@@ -55,7 +61,9 @@ int initContextBuffer
int initSubContext (OOCTXT* pctxt, OOCTXT* psrc)
{
+ /* ast_mutex_lock(&pctxt->pLock); */
int stat = ASN_OK;
+ ast_mutex_lock(&psrc->pLock);
memset (pctxt, 0, sizeof(OOCTXT));
pctxt->pTypeMemHeap = psrc->pTypeMemHeap;
memHeapAddRef (&pctxt->pTypeMemHeap);
@@ -65,12 +73,17 @@ int initSubContext (OOCTXT* pctxt, OOCTXT* psrc)
pctxt->buffer.dynamic = TRUE;
pctxt->buffer.byteIndex = 0;
pctxt->buffer.bitOffset = 8;
+
+ ast_mutex_unlock(&psrc->pLock);
+ /* ast_mutex_unlock(&pctxt->pLock); */
return stat;
}
void freeContext (OOCTXT* pctxt)
{
- ASN1BOOL saveBuf = (pctxt->flags & ASN1SAVEBUF) != 0;
+ ASN1BOOL saveBuf;
+ ast_mutex_lock(&pctxt->pLock);
+ saveBuf = (pctxt->flags & ASN1SAVEBUF) != 0;
if (pctxt->buffer.dynamic && pctxt->buffer.data) {
if (saveBuf) {
@@ -85,27 +98,38 @@ void freeContext (OOCTXT* pctxt)
memHeapRelease (&pctxt->pTypeMemHeap);
memHeapRelease (&pctxt->pMsgMemHeap);
+
+ ast_mutex_unlock(&pctxt->pLock);
+ ast_mutex_destroy(&pctxt->pLock);
}
void copyContext (OOCTXT* pdest, OOCTXT* psrc)
{
+ /* ast_mutex_lock(&pdest->pLock); ast_mutex_lock(&psrc->pLock); */
memcpy (&pdest->buffer, &psrc->buffer, sizeof(ASN1BUFFER));
pdest->flags = psrc->flags;
+ /* ast_mutex_unlock(&psrc->pLock); ast_mutex_unlock(&pdest->pLock); */
}
void setCtxtFlag (OOCTXT* pctxt, ASN1USINT mask)
{
+ ast_mutex_lock(&pctxt->pLock);
pctxt->flags |= mask;
+ ast_mutex_unlock(&pctxt->pLock);
}
void clearCtxtFlag (OOCTXT* pctxt, ASN1USINT mask)
{
+ ast_mutex_lock(&pctxt->pLock);
pctxt->flags &= ~mask;
+ ast_mutex_unlock(&pctxt->pLock);
}
int setPERBufferUsingCtxt (OOCTXT* pTarget, OOCTXT* pSource)
{
- int stat = initContextBuffer
+ int stat;
+ ast_mutex_lock(&pTarget->pLock); ast_mutex_lock(&pSource->pLock);
+ stat = initContextBuffer
(pTarget, pSource->buffer.data, pSource->buffer.size);
if (ASN_OK == stat) {
@@ -113,13 +137,17 @@ int setPERBufferUsingCtxt (OOCTXT* pTarget, OOCTXT* pSource)
pTarget->buffer.bitOffset = pSource->buffer.bitOffset;
}
+ ast_mutex_unlock(&pSource->pLock); ast_mutex_unlock(&pTarget->pLock);
return stat;
}
int setPERBuffer (OOCTXT* pctxt,
ASN1OCTET* bufaddr, ASN1UINT bufsiz, ASN1BOOL aligned)
{
- int stat = initContextBuffer (pctxt, bufaddr, bufsiz);
+ int stat;
+ ast_mutex_lock(&pctxt->pLock);
+ stat = initContextBuffer (pctxt, bufaddr, bufsiz);
+ ast_mutex_unlock(&pctxt->pLock);
if(stat != ASN_OK) return stat;
@@ -128,10 +156,12 @@ int setPERBuffer (OOCTXT* pctxt,
OOCTXT* newContext ()
{
- OOCTXT* pctxt = (OOCTXT*) ASN1CRTMALLOC0 (sizeof(OOCTXT));
+ /* OOCTXT* pctxt = (OOCTXT*) ASN1CRTMALLOC0 (sizeof(OOCTXT)); */
+ OOCTXT* pctxt = (OOCTXT*) malloc (sizeof(OOCTXT));
if (pctxt) {
if (initContext(pctxt) != ASN_OK) {
- ASN1CRTFREE0 (pctxt);
+ /* ASN1CRTFREE0 (pctxt); */
+ free(pctxt);
pctxt = 0;
}
pctxt->flags |= ASN1DYNCTXT;