--- addons/ooh323c/src/ooh323.c 2009-07-31 18:01:29.000000000 +0400 +++ /usr/src/asterisk-1.6/trunk/trunk/addons/ooh323c/src/ooh323.c 2009-08-07 03:15:04.000000000 +0400 @@ -1349,15 +1349,15 @@ if(gH323ep.gkClient->state == GkClientRegistered) { call->callState = OO_CALL_WAITING_ADMISSION; - // ast_mutex_lock(&call->Lock); + ast_mutex_lock(&call->Lock); ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 24; - sem_timedwait(&call->gkWait, &ts); + ast_cond_timedwait(&call->gkWait, &call->Lock, &ts); if (call->callState == OO_CALL_WAITING_ADMISSION) call->callState = OO_CALL_CLEAR; - // ast_mutex_unlock(&call->Lock); + ast_mutex_unlock(&call->Lock); } else { --- addons/ooh323c/src/oochannels.c 2009-07-31 00:42:19.000000000 +0400 +++ /usr/src/asterisk-1.6/trunk/trunk/addons/ooh323c/src/oochannels.c 2009-08-07 03:12:32.000000000 +0400 @@ -959,7 +959,7 @@ ast_mutex_lock(&call->Lock); ast_mutex_unlock(&call->Lock); ast_mutex_destroy(&call->Lock); - sem_destroy(&call->gkWait); + ast_cond_destroy(&call->gkWait); pctxt = call->pctxt; freeContext(pctxt); free(pctxt); --- addons/ooh323c/src/ooCalls.c 2009-07-31 18:01:29.000000000 +0400 +++ /usr/src/asterisk-1.6/trunk/trunk/addons/ooh323c/src/ooCalls.c 2009-08-07 03:13:14.000000000 +0400 @@ -62,7 +62,7 @@ return NULL; } memset(call, 0, sizeof(OOH323CallData)); - sem_init(&call->gkWait, 0, 0); + ast_cond_init(&call->gkWait, NULL); ast_mutex_init(&call->Lock); call->pctxt = pctxt; call->msgctxt = msgctxt; --- addons/ooh323c/src/ooCalls.h 2009-07-31 18:01:29.000000000 +0400 +++ /usr/src/asterisk-1.6/trunk/trunk/addons/ooh323c/src/ooCalls.h 2009-08-07 03:17:54.000000000 +0400 @@ -143,7 +143,7 @@ OOCTXT *pctxt; OOCTXT *msgctxt; pthread_t callThread; - sem_t gkWait; + ast_cond_t gkWait; ast_mutex_t Lock; OOBOOL Monitor; OOBOOL fsSent; --- addons/ooh323c/src/ooq931.c 2009-08-06 01:51:57.000000000 +0400 +++ /usr/src/asterisk-1.6/trunk/trunk/addons/ooh323c/src/ooq931.c 2009-08-07 03:20:18.000000000 +0400 @@ -2009,7 +2009,7 @@ ast_mutex_lock(&fwdedCall->Lock); clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 24; - sem_timedwait(&fwdedCall->gkWait, &ts); + ast_cond_timedwait(&fwdedCall->gkWait, &fwdedCall->Lock, &ts); if (fwdedCall->callState == OO_CALL_WAITING_ADMISSION) /* GK is not responding */ fwdedCall->callState = OO_CALL_CLEAR; ast_mutex_unlock(&fwdedCall->Lock); @@ -2128,14 +2128,14 @@ MakeCall command */ call->callState = OO_CALL_WAITING_ADMISSION; - // ast_mutex_lock(&call->Lock); + ast_mutex_lock(&call->Lock); ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 24; - sem_timedwait(&call->gkWait, &ts); + ast_cond_timedwait(&call->gkWait, &call->Lock, &ts); if (call->callState == OO_CALL_WAITING_ADMISSION) call->callState = OO_CALL_CLEAR; - // ast_mutex_unlock(&call->Lock); + ast_mutex_unlock(&call->Lock); } --- addons/ooh323c/src/ooGkClient.c 2009-07-31 00:42:19.000000000 +0400 +++ /usr/src/asterisk-1.6/trunk/trunk/addons/ooh323c/src/ooGkClient.c 2009-08-07 03:51:56.000000000 +0400 @@ -1950,7 +1950,7 @@ pCallAdmInfo->call->callToken); pCallAdmInfo->call->callState = OO_CALL_CONNECTING; - sem_post(&pCallAdmInfo->call->gkWait); + ast_cond_signal(&pCallAdmInfo->call->gkWait); /* ooH323CallAdmitted( pCallAdmInfo->call); */ dListRemove(&pGkClient->callsPendingList, pNode); @@ -1975,9 +1975,10 @@ (ooGkClient *pGkClient, H225AdmissionReject *pAdmissionReject) { RasCallAdmissionInfo* pCallAdmInfo=NULL; - unsigned int x; - DListNode *pNode=NULL; + unsigned int x, y; + DListNode *pNode=NULL, *pNode1=NULL; OOH323CallData *call=NULL; + OOTimer *pTimer = NULL; /* Search call in pending calls list */ for(x=0 ; xcallsPendingList.count; x++) @@ -2004,6 +2005,24 @@ memFreePtr(&pGkClient->ctxt, pNode); } + /* Delete ARQ timer */ + for(y=0; ytimerList.count; y++) + { + pNode1 = dListFindByIndex(&pGkClient->timerList, y); + pTimer = (OOTimer*)pNode1->data; + if(((ooGkClientTimerCb*)pTimer->cbData)->timerType & OO_ARQ_TIMER) + { + if(((ooGkClientTimerCb*)pTimer->cbData)->pAdmInfo == + pCallAdmInfo) + { + memFreePtr(&pGkClient->ctxt, pTimer->cbData); + ooTimerDelete(&pGkClient->ctxt, &pGkClient->timerList, + pTimer); + OOTRACEDBGA1("Deleted ARQ Timer.\n"); + break; + } + } + } OOTRACEINFO4("Admission Reject message received with reason code %d for " "(%s, %s)\n", pAdmissionReject->rejectReason.t, call->callType, call->callToken); @@ -2049,7 +2068,7 @@ break; } - sem_post(&pCallAdmInfo->call->gkWait); + ast_cond_signal(&pCallAdmInfo->call->gkWait); return OO_OK; } @@ -2564,6 +2583,9 @@ OOTRACEDBGA1("Gatekeeper client ARQ timer expired.\n"); memFreePtr(&pGkClient->ctxt, cbData); + if(!pAdmInfo) + return OO_OK; + if(pAdmInfo->retries < OO_MAX_ARQ_RETRIES) { ret = ooGkClientSendAdmissionRequest(pGkClient, pAdmInfo->call, TRUE);