RBOOL stopAllModules ( ) { RBOOL isSuccess = TRUE; RU32 moduleIndex = 0; for( moduleIndex = 0; moduleIndex < RP_HCP_CONTEXT_MAX_MODULES; moduleIndex++ ) { rpal_debug_info( "stopping module at %d", moduleIndex ); if( 0 != g_hcpContext.modules[ moduleIndex ].hThread ) { if( rEvent_set( g_hcpContext.modules[ moduleIndex ].isTimeToStop ) && rpal_thread_wait( g_hcpContext.modules[ moduleIndex ].hThread, RP_HCP_CONTEXT_MODULE_TIMEOUT ) ) { _cleanupModuleEntry( &( g_hcpContext.modules[ moduleIndex ] ) ); rpal_debug_info( "finished stopping module." ); } else { isSuccess = FALSE; } } } rpal_debug_info( "finished stopping all modules" ); return isSuccess; }
RBOOL rpHostCommonPlatformLib_unload ( RU8 moduleId ) { RBOOL isSuccess = FALSE; RU32 moduleIndex = 0; for( moduleIndex = 0; moduleIndex < RP_HCP_CONTEXT_MAX_MODULES; moduleIndex++ ) { if( moduleId == g_hcpContext.modules[ moduleIndex ].id ) { if( rEvent_set( g_hcpContext.modules[ moduleIndex ].isTimeToStop ) && rpal_thread_wait( g_hcpContext.modules[ moduleIndex ].hThread, (30*1000) ) ) { isSuccess = TRUE; #ifdef RPAL_PLATFORM_WINDOWS FreeLibrary( (HMODULE)g_hcpContext.modules[ moduleIndex ].hModule ); #elif defined( RPAL_PLATFORM_LINUX ) || defined( RPAL_PLATFORM_MACOSX ) dlclose( g_hcpContext.modules[ moduleIndex ].hModule ); #endif rEvent_free( g_hcpContext.modules[ moduleIndex ].context.isTimeToStop ); rpal_thread_free( g_hcpContext.modules[ moduleIndex ].hThread ); } break; } } return isSuccess; }
RBOOL stopBeacons ( ) { RBOOL isSuccess = FALSE; if( NULL != g_hcpContext.isBeaconTimeToStop ) { rEvent_set( g_hcpContext.isBeaconTimeToStop ); if( 0 != g_hcpContext.hBeaconThread ) { rpal_thread_wait( g_hcpContext.hBeaconThread, MSEC_FROM_SEC( 40 ) ); rpal_thread_free( g_hcpContext.hBeaconThread ); isSuccess = TRUE; } rEvent_free( g_hcpContext.isBeaconTimeToStop ); g_hcpContext.isBeaconTimeToStop = NULL; } return isSuccess; }
RU32 RPAL_EXPORT RPAL_THREAD_FUNC rpHcpI_entry ( rpHCPModuleContext* moduleContext ) { RU32 ret = (RU32)(-1); rThread hMain = 0; if( NULL != moduleContext ) { g_Module_Context = moduleContext; if( rpal_initialize( moduleContext->rpalContext, g_current_Module_id ) ) { ret = (RU32)(-2); if( 0 != ( hMain = rpal_thread_new( RpHcpI_mainThread, g_Module_Context->isTimeToStop ) ) ) { rpal_debug_info( "main module worker started" ); ret = 0; while( TRUE ) { if( rpal_thread_wait( hMain, ( 1 * 1000 ) ) ) { break; } } rpal_debug_info( "main module worker finished" ); rpal_thread_free( hMain ); } else { rpal_debug_error( "failed spawning module main worker" ); } rpal_Context_cleanup(); rpal_Context_deinitialize(); } else { rpal_debug_error( "failed IFace init" ); } } return ret; }
RPRIVATE_TESTABLE RBOOL unloadModule ( rpHCPContext* hcpContext, rSequence seq ) { RBOOL isSuccess = FALSE; RpHcp_ModuleId moduleId = (RU8)(-1); RU32 moduleIndex = (RU32)(-1); if( NULL != seq && NULL != hcpContext ) { if( rSequence_getRU8( seq, RP_TAGS_HCP_MODULE_ID, &moduleId ) ) { for( moduleIndex = 0; moduleIndex < RP_HCP_CONTEXT_MAX_MODULES; moduleIndex++ ) { if( moduleId == hcpContext->modules[ moduleIndex ].id ) { break; } } } } if( (RU32)(-1) != moduleIndex && RP_HCP_CONTEXT_MAX_MODULES != moduleIndex ) { #ifdef RP_HCP_LOCAL_LOAD if( hcpContext->modules[ moduleIndex ].isOsLoaded ) { // We do not unload modules loaded by the OS in debug since // they are used to debug modules during development. return FALSE; } #endif if( rEvent_set( hcpContext->modules[ moduleIndex ].isTimeToStop ) && rpal_thread_wait( hcpContext->modules[ moduleIndex ].hThread, ( 30 * 1000 ) ) ) { isSuccess = TRUE; _cleanupModuleEntry( &( hcpContext->modules[ moduleIndex ] ) ); } } return isSuccess; }
static rList assembleRequest ( RPU8 optCrashCtx, RU32 optCrashCtxSize ) { rSequence req = NULL; RU32 moduleIndex = 0; rList msgList = NULL; rList modList = NULL; rSequence modEntry = NULL; if( NULL != ( req = rSequence_new() ) ) { // Add some basic info rSequence_addRU32( req, RP_TAGS_MEMORY_USAGE, rpal_memory_totalUsed() ); rSequence_addTIMESTAMP( req, RP_TAGS_TIMESTAMP, rpal_time_getGlobal() ); // If we have a crash context to report if( NULL != optCrashCtx ) { if( !rSequence_addBUFFER( req, RP_TAGS_HCP_CRASH_CONTEXT, optCrashCtx, optCrashCtxSize ) ) { rpal_debug_error( "error adding crash context of size %d to hcp beacon", optCrashCtxSize ); } else { rpal_debug_info( "crash context is being bundled in hcp beacon" ); } } // List of loaded modules if( NULL != ( modList = rList_new( RP_TAGS_HCP_MODULE, RPCM_SEQUENCE ) ) ) { for( moduleIndex = 0; moduleIndex < RP_HCP_CONTEXT_MAX_MODULES; moduleIndex++ ) { if( NULL != g_hcpContext.modules[ moduleIndex ].hModule ) { if( NULL != ( modEntry = rSequence_new() ) ) { if( !rSequence_addBUFFER( modEntry, RP_TAGS_HASH, g_hcpContext.modules[ moduleIndex ].hash, sizeof( g_hcpContext.modules[ moduleIndex ].hash ) ) || !rSequence_addRU8( modEntry, RP_TAGS_HCP_MODULE_ID, g_hcpContext.modules[ moduleIndex ].id ) || !rList_addSEQUENCE( modList, modEntry ) ) { break; } // We take the opportunity to cleanup the list of modules... if( rpal_thread_wait( g_hcpContext.modules[ moduleIndex ].hThread, 0 ) ) { // This thread has exited, which is our signal that the module // has stopped executing... rEvent_free( g_hcpContext.modules[ moduleIndex ].isTimeToStop ); rpal_thread_free( g_hcpContext.modules[ moduleIndex ].hThread ); rpal_memory_zero( &(g_hcpContext.modules[ moduleIndex ]), sizeof( g_hcpContext.modules[ moduleIndex ] ) ); if( !rSequence_addRU8( modEntry, RP_TAGS_HCP_MODULE_TERMINATED, 1 ) ) { break; } } } } } if( !rSequence_addLIST( req, RP_TAGS_HCP_MODULES, modList ) ) { rList_free( modList ); } } if( NULL != ( msgList = rList_new( RP_TAGS_MESSAGE, RPCM_SEQUENCE ) ) ) { if( !rList_addSEQUENCE( msgList, req ) ) { rList_free( msgList ); rSequence_free( req ); msgList = NULL; } } else { rSequence_free( req ); } } return msgList; }