EMBX_ERROR EMBX_RemoveProcessor(EMBX_TRANSPORT htp, EMBX_UINT cpuID) { EMBX_ERROR res = EMBX_INVALID_TRANSPORT; EMBX_Info(EMBX_INFO_TRANSPORT, (">>>>EMBX_RemoveProcessor(htp=0x%08lx,cpu=%d)\n",(unsigned long)htp, cpuID)); EMBX_DebugOn(EMBX_INFO_TRANSPORT); if(!_embx_dvr_ctx.isLockInitialized) { EMBX_DebugMessage((_driver_uninit_error)); goto exit; } if(!EMBX_HANDLE_ISTYPEOF(htp, EMBX_HANDLE_TYPE_TRANSPORT)) { res = EMBX_INVALID_TRANSPORT; goto exit; } EMBX_OS_MUTEX_TAKE(&_embx_dvr_ctx.lock); if(_embx_dvr_ctx.state != EMBX_DVR_INITIALIZED && _embx_dvr_ctx.state != EMBX_DVR_IN_SHUTDOWN ) { EMBX_DebugMessage((_driver_uninit_error)); res = EMBX_INVALID_TRANSPORT; } else { EMBX_TransportHandle_t *tph; tph = (EMBX_TransportHandle_t *)EMBX_HANDLE_GETOBJ(&_embx_handle_manager, htp); if( (tph == 0) || (tph->state != EMBX_HANDLE_VALID) ) { EMBX_DebugMessage(("Failed 'transport handle is not valid'\n")); res = EMBX_INVALID_TRANSPORT; } else { EMBX_Transport_t *tp = tph->transport; EMBX_Assert(tp); EMBX_Assert(tp->methods->remove_processor); /* Call the transport specific removal function */ res = tp->methods->remove_processor(tp, cpuID); } } EMBX_OS_MUTEX_RELEASE(&_embx_dvr_ctx.lock); exit: EMBX_DebugOff(EMBX_INFO_TRANSPORT); EMBX_Info(EMBX_INFO_TRANSPORT, ("<<<<EMBX_RemoveProcessor(htp=0x%08lx,cpu=%d) = %d\n", (unsigned long)htp, cpuID, res)); return res; }
EMBX_ERROR EMBX_GetTransportInfo(EMBX_TRANSPORT htp, EMBX_TPINFO *tpinfo) { EMBX_ERROR res = EMBX_INVALID_TRANSPORT; EMBX_Info(EMBX_INFO_TRANSPORT, (">>>>EMBX_GetTransportInfo(htp=0x%08lx)\n",(unsigned long)htp)); EMBX_DebugOn(EMBX_INFO_TRANSPORT); if(!_embx_dvr_ctx.isLockInitialized) { EMBX_DebugMessage((_driver_uninit_error)); goto exit; } if(tpinfo == 0) { res = EMBX_INVALID_ARGUMENT; goto exit; } if(!EMBX_HANDLE_ISTYPEOF(htp, EMBX_HANDLE_TYPE_TRANSPORT)) { goto exit; } EMBX_OS_MUTEX_TAKE(&_embx_dvr_ctx.lock); if(_embx_dvr_ctx.state != EMBX_DVR_INITIALIZED) { EMBX_DebugMessage((_driver_uninit_error)); } else { EMBX_TransportHandle_t *tph; tph = (EMBX_TransportHandle_t *)EMBX_HANDLE_GETOBJ(&_embx_handle_manager, htp); if( (tph != 0) && (tph->state == EMBX_HANDLE_VALID) ) { *tpinfo = tph->transport->transportInfo; EMBX_Info(EMBX_INFO_TRANSPORT, ("Returning transport '%s'\n",tpinfo->name)); res = EMBX_SUCCESS; } } EMBX_OS_MUTEX_RELEASE(&_embx_dvr_ctx.lock); exit: EMBX_DebugOff(EMBX_INFO_TRANSPORT); EMBX_Info(EMBX_INFO_TRANSPORT, ("<<<<EMBX_GetTransportInfo(htp=0x%08lx) = %d\n",(unsigned long)htp, res)); return res; }
static EMBX_ERROR update_object(EMBX_RemotePortHandle_t *ph, EMBX_HANDLE handle, EMBX_UINT offset, EMBX_UINT size) { EMBXLB_Transport_t *tplb; EMBXLB_Object_t *obj; /* As this is a purely shared memory transport the only thing to * do is validate that the given object handle is actually a valid * object and the offset/size were within the object. */ tplb = (EMBXLB_Transport_t *)ph->transportHandle->transport; obj = (EMBXLB_Object_t *)EMBX_HANDLE_GETOBJ(&tplb->objectHandleManager, handle); if( (obj != 0) && ((offset+size) <= obj->size) ) return EMBX_SUCCESS; else return EMBX_INVALID_ARGUMENT; }
static EMBX_ERROR send_object(EMBX_RemotePortHandle_t *ph, EMBX_HANDLE handle, EMBX_UINT offset, EMBX_UINT size) { EMBXLB_Transport_t *tplb; EMBXLB_Object_t *obj; tplb = (EMBXLB_Transport_t *)ph->transportHandle->transport; obj = (EMBXLB_Object_t *)EMBX_HANDLE_GETOBJ(&tplb->objectHandleManager, handle); if( (obj != 0) && ((offset+size) <= obj->size) ) { EMBXLB_RemotePortHandle_t *phlb = (EMBXLB_RemotePortHandle_t *)ph; return do_send(phlb, EMBX_REC_OBJECT, handle, obj->data, offset, size); } else { return EMBX_INVALID_ARGUMENT; } }
EMBX_ERROR EMBX_Address(EMBX_TRANSPORT htp, EMBX_INT offset, EMBX_VOID **address) { EMBX_ERROR res = EMBX_INVALID_TRANSPORT; EMBX_Info(EMBX_INFO_TRANSPORT, (">>>>EMBX_Address(offset=0x%08x)\n", offset)); EMBX_DebugOn(EMBX_INFO_TRANSPORT); #if !defined(EMBX_LEAN_AND_MEAN) if(!_embx_dvr_ctx.isLockInitialized) { EMBX_DebugMessage((_driver_uninit_error)); goto exit; } if(!EMBX_HANDLE_ISTYPEOF(htp, EMBX_HANDLE_TYPE_TRANSPORT)) { goto exit; } #endif /* EMBX_LEAN_AND_MEAN */ EMBX_OS_MUTEX_TAKE(&_embx_dvr_ctx.lock); if(_embx_dvr_ctx.state != EMBX_DVR_INITIALIZED) { EMBX_DebugMessage((_driver_uninit_error)); } else { EMBX_TransportHandle_t *tph; tph = (EMBX_TransportHandle_t *)EMBX_HANDLE_GETOBJ(&_embx_handle_manager, htp); if( (tph != 0) && (tph->state == EMBX_HANDLE_VALID) ) { EMBX_Transport_t *tp = tph->transport; if( tp->state == EMBX_TP_INITIALIZED) { if (tp->transportInfo.usesZeroCopy) { /* MULTICOM_32BIT_SUPPORT: The Warp range is now a physical address range */ #ifdef __TDT__ /* stm24 prob */ res = tp->methods->phys_to_virt_alt(tp, offset, address); #else res = tp->methods->phys_to_virt(tp, offset, address); #endif } else if (tp->transportInfo.allowsPointerTranslation) { EMBX_VOID *addr = (EMBX_VOID *)((unsigned long)(tp->transportInfo.memStart)+offset); if(tp->transportInfo.memStart <= addr && tp->transportInfo.memEnd >= addr) { *address = addr; res = (0 == tp->methods->test_state ? EMBX_SUCCESS : tp->methods->test_state(tp, addr)); } else { res = EMBX_INVALID_ARGUMENT; } } } } } EMBX_OS_MUTEX_RELEASE(&_embx_dvr_ctx.lock); exit: EMBX_DebugOff(EMBX_INFO_TRANSPORT); EMBX_Info(EMBX_INFO_TRANSPORT, ("<<<<EMBX_Address(offset=0x%08x) = %d\n", offset, res)); return res; }
static EMBX_ERROR do_close_transport(EMBX_TRANSPORT htp) { EMBX_ERROR res = EMBX_INVALID_TRANSPORT; EMBX_TransportHandle_t *tph; tph = (EMBX_TransportHandle_t *)EMBX_HANDLE_GETOBJ(&_embx_handle_manager, htp); if(tph != 0) { EMBX_Transport_t *tp; EMBX_TransportHandleList_t *handleList; if( (tph->state != EMBX_HANDLE_VALID) && (tph->state != EMBX_HANDLE_INVALID) ) { EMBX_DebugMessage(("Failed 'transport handle state is corrupted'\n")); return EMBX_INVALID_TRANSPORT; } if( (tph->localPorts != 0) || (tph->remotePorts != 0) ) { EMBX_DebugMessage(("Failed 'transport still has open ports'\n")); return EMBX_PORTS_STILL_OPEN; } tp = tph->transport; handleList = tp->transportHandles; while(handleList) { if(handleList->transportHandle == tph) break; handleList = handleList->next; } #if defined(EMBX_VERBOSE) if(handleList == 0) { EMBX_DebugMessage(("Unable to find transport handle (0x%08lx) on transport (0x%08lx) handle list!\n",(unsigned long)tph,(unsigned long)tp)); } #endif /* EMBX_VERBOSE */ res = tp->methods->close_handle(tp, tph); if(res == EMBX_SUCCESS) { /* At this point tph has been freed by the transport * so we must not use it again. */ EMBX_HANDLE_FREE(&_embx_handle_manager, htp); tp->transportInfo.nrOpenHandles--; /* Unhook the transport handle list entry */ if(handleList != 0) { if(handleList->prev != 0) handleList->prev->next = handleList->next; else tp->transportHandles = handleList->next; if(handleList->next != 0) handleList->next->prev = handleList->prev; EMBX_OS_MemFree(handleList); } if(tp->closeEvent != 0 && tp->transportHandles == 0) { /* Another thread is waiting for the last handle to * close on this transport. Signal it now this has * happened. */ EMBX_OS_EVENT_POST(&tp->closeEvent->event); } } } return res; }