VOS_UINT32 VOS_SmDelete( VOS_SEM Sm_ID ) { SEM_CONTROL_BLOCK *temp_Ptr; temp_Ptr = (SEM_CONTROL_BLOCK *)Sm_ID; if( temp_Ptr == temp_Ptr->SemId ) { if(temp_Ptr->Flag == VOS_SEM_CTRL_BLK_IDLE) { VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OBJTFULL); return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID); } if ( NU_SUCCESS == NU_Delete_Semaphore(&(temp_Ptr->NuSem)) ) { return VOS_SemCtrlBlkFree(temp_Ptr); } else { VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_OSALCREATEERR); return(VOS_ERRNO_SEMA4_CCREATE_OSALCREATEERR); } } else { VOS_SetErrorNo(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID); return(VOS_ERRNO_SEMA4_CCREATE_INVALID_SMID); } }
void *BridgeMessageSend(void *func_ptr, int type, void *packed_args) { ThreadInfo *i = (ThreadInfo*) malloc(sizeof(ThreadInfo)); i->sync = (type == NU_SYNCHRONIZED_PROC); i->loked = 1; i->ret = 0; if(i->sync && NU_Create_Semaphore(&i->loker, "mopi", 0, NU_PRIORITY) != NU_SUCCESS) { ShowMSG(1, (int)"ProcB: Semaphore init failed"); free(i); return 0; } GBS_SendMessage(BridgeMOPI_ID, MOPI_THREAD_PROC, func_ptr, i, packed_args); switch(type) { case NU_SYNCHRONIZED_PROC: NU_Obtain_Semaphore(&i->loker, NU_SUSPEND); break; case NU_ASYNC_PROC: /* in async mode return not support */ return 0; } if(i->sync) NU_Delete_Semaphore(&i->loker); /* возвращаемое значение */ void *ret = i->ret; /* больше не нужно оно */ free(i); /* чистим стек аргументов */ free(packed_args); /* возвращаем результат выполнения */ return ret; }
/** Nucleus - Delete the given Lock Object. \par Implementation - delete the semaphore object (see "NU_Delete_Semaphore"). - if the OS call was successfull the memory object will be freed \param lockId Provides the pointer to the Lock Object. \param lockId Provides the pointer to the Lock Object. \return IFX_SUCCESS if delete was successful, else IFX_ERROR if something was wrong */ IFX_int32_t IFXOS_LockDelete( IFXOS_lock_t *lockId) { if(lockId) { if (IFXOS_LOCK_INIT_VALID(lockId) == IFX_TRUE) { if (NU_Delete_Semaphore(&lockId->object) != NU_SUCCESS) { lockId->bValid = IFX_FALSE; return IFX_ERROR; } lockId->bValid = IFX_FALSE; IFXOS_SYS_OBJECT_RELEASE(lockId->pSysObject); } } return IFX_SUCCESS; }