sem_t신호량으로 인해 두 개의 Doubango 응용 프로그램(idoubs)이 등록 메시지를 수신하는 것이 정상적이지 않습니다.

최근에sip와 관련된 몇 가지를 연구하고 있습니다. 한 개의 idoubs가 아이폰에서 정상적으로 작동할 수 있지만 두 개를 동시에 실행하면 서버에 등록되지 않은 하나가 있습니다. 가방을 잡는 것은 오랫동안 무슨 문제인지 몰랐습니다. 예를 들어 현재 두 개의 idoubs가 아이폰에 있습니다. 잠시 idoubs1과 idoubs2로 명명합시다.그것들 두 개는 각각 다른 서비스에 연결되어 있고, 수신하는 포트도 다르다.
만약 내가 먼저 idoubs1을 실행하고 정상적으로 연결한 후에 idoubs2를 열면 idoubs2는 서버에 연결되지 않습니다.실제로 idoubs2에서 서버에 등록 메시지를 보냈습니다.서버도idoubs2에 메시지를 반환했습니다.그러나sip층에서sip 메시지를 수신하는 함수
static int tsip_transport_layer_stream_cb(const tnet_transport_event_t*e)가 응답하지 않았습니다. 이어서 중단점을udp층의 recvfrom () 함수에 설정할 수 밖에 없습니다. 여러 번 디버깅을 했는데 recvfrom () 함수 앞에 설정된 중단점이 멈추지 않았습니다. 오랫동안 이유를 몰라서 recvfrom () 으로udp 메시지를 받지 않는 줄 알았지만 그럴 리가 없습니다.나중에 공사cleanup를 한 번 하자,recvfrom () 전의 단점이 마침내 멈추었고, 받은 소식을 인쇄해 보니, 프로그램이 메시지를 받은 것을 발견하였다.관건은 소식을 sip층에 전달할 때 문제가 생겼다는 것이다.
이어서 static int tsip_을 보냈습니다.transport_layer_stream_cb(const tnet_transport_event_t*e) 이 함수가 리셋된 곳에 매크로가 정의한 신호량이 있습니다. 이 매크로 정의는 좀 이상합니다.
#define TSK_RUNNABLE_RUN_BEGIN(self) \
	TSK_RUNNABLE(self)->running = tsk_true;	\
	for(;;) { \
		tsk_semaphore_decrement(TSK_RUNNABLE(self)->semaphore); \
		if(!TSK_RUNNABLE(self)->running &&  \
			(!TSK_RUNNABLE(self)->important || (TSK_RUNNABLE(self)->important && TSK_LIST_IS_EMPTY(TSK_RUNNABLE(self)->objects)))) \
			break;
		

#define TSK_RUNNABLE_RUN_END(self) \
	} \
	TSK_RUNNABLE(self)->running = tsk_false;
두 개의 매크로, 사실은 한 단락의 코드를 두 개의 매크로 정의에 분리한 다음에 리셋 함수는 두 개의 매크로 사이이다.
TSK_RUNNABLE_RUN_BEGIN(transport);
	
	if((curr = TSK_RUNNABLE_POP_FIRST_SAFE(TSK_RUNNABLE(transport)))){
		const tnet_transport_event_t *e = (const tnet_transport_event_t*)curr->data;
		
		if(transport->callback){
			transport->callback(e);
		}
		tsk_object_unref(curr);
	}
	
	TSK_RUNNABLE_RUN_END(transport);
첫 번째 매크로 안의
tsk_semaphore_decrement()
원래 Doubango 안에 udp층과sip층 사이는sem_t신호량으로 통신했습니다.신호량은 프로세스 간 통신을 실현할 수 있기 때문에 왜 idoubs2가sip메시지를 받지 못하는지 갑자기 알 수 있습니다. 만약 신호량의 표지부호가 같다면 idoubs2의 메시지는idoubs1에게 보낼 수 있습니다.
이어서 신호량의 초기화를 찾아볼게요.
이 함수를 찾았습니다.
tsk_semaphore_handle_t* tsk_semaphore_create_2(int initial_val)
tsk_semaphore_handle_t* tsk_semaphore_create_2(int initial_val)
{
	SEMAPHORE_T handle = tsk_null;
	
#if TSK_UNDER_WINDOWS
	handle = CreateSemaphore(NULL, initial_val, 0x7FFFFFFF, NULL);
#else
	handle = tsk_calloc(1, sizeof(SEMAPHORE_S));
	
#if TSK_USE_NAMED_SEM
	named_sem_t * nsem = (named_sem_t*)handle;
	tsk_sprintf(&(nsem->name), "/sem-%d", sem_count++);
	if((nsem->sem = sem_open(nsem->name, O_CREAT /*| O_EXCL*/, S_IRUSR | S_IWUSR, initial_val)) == SEM_FAILED)
	{
		TSK_FREE(nsem->name);
#else
	if(sem_init((SEMAPHORE_T)handle, 0, initial_val))
	{
#endif
		TSK_FREE(handle);
		TSK_DEBUG_ERROR("Failed to initialize the new semaphore (errno=%d).", errno);
	}
#endif
	
	if(!handle){
		TSK_DEBUG_ERROR("Failed to create new semaphore");
	}
	return handle;
}
자료를 찾아봤더니
tsk_sprintf(&(nsem->name), "/sem-%d", sem_count++);
"/sem-%d"만 다르게 바꾸면 되는데..."/1sem-%d"..
드디어 문제가 해결되었군..

좋은 웹페이지 즐겨찾기