int RTSP_ControlExit() { SetRTSPStreamingOFF(); if(DestroySem(hndlRTSP_Sem) != 0){ return -1; } hndlRTSP_Sem = NULL; return 0; }
/** * @brief Alarm server main loop * @param qid [I ] Message queue ID used to receive alarm message. * @param hAlarmSem [I ] Semaphore to control access to alarm server globals. * @return 0 on alarm server normal end. */ int alarm_main_loop(int qid, int audQid, SemHandl_t hAlarmSem) { ALARM_MSG_BUF msgbuf; int msg_size,ret = 0; AlarmParam_t* pEvironment; pthread_t thread; pAlarmSysInfo = GetSysInfo(); if((hGIOSem = MakeSem()) == NULL){ return -1; } while(1){ /* Get Message */ msg_size = msgrcv( qid, &msgbuf, sizeof(msgbuf) - sizeof(long), MSG_TYPE_MSG1, 0); if( msg_size < 0 ){ printf("Alarm Receive msg fail \n"); ret = -1; break; } else if(msgbuf.src == MSG_TYPE_MSG1 || msgbuf.src < 0){ printf("Got Error message\n"); ret = -1; break; } else if(msgbuf.event == ALARM_EVENT_QUIT){ printf("Recieved Quit event\n"); break; } else if(IsRestart()){ // If already restart flag is set then ignore the messages continue; } else { /* Process alarm event */ pEvironment = (AlarmParam_t*)malloc(sizeof(AlarmParam_t)); if(pEvironment == NULL){ printf("Error: More memory need for Alarm server\n"); break; } pEvironment -> msg_id = qid; pEvironment -> audMsg_id = audQid; pEvironment->hAlarmSem = hAlarmSem; memcpy(&pEvironment -> msg_buf, &msgbuf, sizeof(msgbuf)); if((ret = pthread_create(&thread, NULL, ProcAlarmThread, pEvironment)) != 0){ free(pEvironment); printf("Error: Alarm server creat thread fail\n"); break; } pthread_detach(thread); } } DestroySem(hGIOSem); return ret; }
/** * @brief Resource releasing of the message driver for Appro interface * * * * @return 0 is ok and -1 is error * * */ int ApproDrvExit() { fprintf(stderr, "%s: %d\n", __func__, gProcId); gProcId = MSG_TYPE_MSG1; DestroySem(hndlApproDrvSem); hndlApproDrvSem = NULL; #if ENABLE_CMEM if( Testflag != 0 ) { CMEM_exit(); } Testflag = 0;; return 0; #else return 0; #endif }
/** * @breif Schedule manager initial. * @param pSysInfo [I] Pointer to system info. * @return 0 on success */ int ScheduleMngInit(SysInfo *pSysInfo) { if (gSemSchedule == NULL) { gSemSchedule = MakeSem(); } if (gSemSchedule == NULL) { return - 1; } if (pthread_create(&gScheduleThread, NULL, scheduleThrFxn, pSysInfo)) { DestroySem(gSemSchedule); __E("scheduleThread create fail\n"); return - 1; } __D("scheduleThread created\n"); return 0; }
int main(void) { key_t key; /*信号量的键值*/ int semid; /*信号量的ID*/ char i; int value = 0; key = ftok("/ipc/sem",'a'); /*建立信号量的键值*/ semid = CreateSem(key,100); /*建立信号量*/ for (i = 0;i <= 3;i++){ /*对信号量进行3次增减操作*/ Sem_P(semid); /*增加信号量*/ Sem_V(semid); /*减小信号量*/ } value = GetvalueSem(semid); /*获得信号量的值*/ printf("信号量值为:%d\n",value); /*打印结果*/ DestroySem(semid); /*销毁信号量*/ return 0; }
/** * @brief Initiliztion of the message driver for Appro interface * * * @param proc_id message type id of the proceess, defined at ipnc_app/include/Stream_Msg_Def.h * * @return 0 is ok and -1 is error * * */ int ApproDrvInit(int proc_id) { if(proc_id < MSG_TYPE_MSG1 || proc_id > 20){ gProcId = MSG_TYPE_MSG1; return -1; } gProcId = proc_id; fprintf(stderr, "%s: %d\n", __func__, proc_id); #if ENABLE_CMEM /* CMEM only one init is allowed in each process */ if(Testflag==0) { if(CMEM_init() < 0){ gProcId = MSG_TYPE_MSG1; return -1; } } #endif Testflag = 1;; if(hndlApproDrvSem == NULL) hndlApproDrvSem = MakeSem(); if(hndlApproDrvSem == NULL){ #if ENABLE_CMEM CMEM_exit(); #endif gProcId = MSG_TYPE_MSG1; return -1; } printf("Msg_Init Begin\n"); if((qid=Msg_Init(MSG_KEY)) < 0){ DestroySem(hndlApproDrvSem); hndlApproDrvSem = NULL; #if ENABLE_CMEM CMEM_exit(); #endif gProcId = MSG_TYPE_MSG1; return -1; } printf("Msg_Init Done\n"); return 0; }
/** * @brief Main thread of alarm server. * @param arg [I ] Not used. * @return 0 on alarm server normal end. */ void *AlramThread(void *arg) { int qid; int audQid; SemHandl_t hAlarmSem; pthread_t thread; void *ret; qid = Msg_Init(ALARM_KEY); if(qid < 0) return PROC_FAIL; audQid = Msg_Init(AUD_MSG_KEY); if(audQid < 0) return PROC_FAIL; hAlarmSem = MakeSem(); if(hAlarmSem == NULL){ Msg_Kill(qid); return PROC_FAIL; } hAlarmStatusSem = MakeSem(); if(hAlarmStatusSem == NULL){ DestroySem(hAlarmSem); Msg_Kill(qid); return PROC_FAIL; } audioSem = MakeSem(); if(audioSem == NULL){ DestroySem(hAlarmStatusSem); DestroySem(hAlarmSem); Msg_Kill(qid); return PROC_FAIL; } if(pthread_create(&thread, NULL, AlramScheduler, NULL)){ DestroySem(hAlarmStatusSem); DestroySem(audioSem); DestroySem(hAlarmSem); Msg_Kill(qid); return PROC_FAIL; } if(AviMngInit()){ AlarmScheduleExit(); pthread_join(thread, &ret); DestroySem(hAlarmStatusSem); DestroySem(audioSem); DestroySem(hAlarmSem); Msg_Kill(qid); return PROC_FAIL; } if(JpgMngInit()){ AviMngExit(); AlarmScheduleExit(); pthread_join(thread, &ret); DestroySem(hAlarmStatusSem); DestroySem(audioSem); DestroySem(hAlarmSem); Msg_Kill(qid); return PROC_FAIL; } if(FileDispatcherInit()){ JpgMngExit(); AviMngExit(); AlarmScheduleExit(); pthread_join(thread, &ret); DestroySem(hAlarmStatusSem); DestroySem(audioSem); DestroySem(hAlarmSem); Msg_Kill(qid); return PROC_FAIL; } alarm_main_loop(qid, audQid, hAlarmSem); AviMngExit(); JpgMngExit(); FileDispatcherExit(); DestroySem(hAlarmStatusSem); DestroySem(audioSem); DestroySem(hAlarmSem); Msg_Kill(qid); Msg_Kill(audQid); return PROC_SUCESS; }