RBOOL rpHostCommonPlatformLib_stop ( ) { if( 0 == rInterlocked_decrement32( &g_hcpContext.isRunning ) ) { stopBeacons(); stopAllModules(); rpal_memory_free( g_hcpContext.primaryUrl ); rpal_memory_free( g_hcpContext.secondaryUrl ); if( NULL != g_hcpContext.enrollmentToken && 0 != g_hcpContext.enrollmentTokenSize ) { rpal_memory_free( g_hcpContext.enrollmentToken ); } freeKeys(); #ifdef RPAL_PLATFORM_WINDOWS SetConsoleCtrlHandler( (PHANDLER_ROUTINE)ctrlHandler, FALSE ); #endif rMutex_free( g_hcpContext.cloudConnectionMutex ); rEvent_free( g_hcpContext.isCloudOnline ); g_hcpContext.cloudConnectionMutex = NULL; g_hcpContext.isCloudOnline = NULL; rpal_Context_cleanup(); rpal_Context_deinitialize(); // If the default crashContext is still present, remove it since // we are shutting down properly. If it's non-default leave it since // somehow we may have had a higher order crash we want to keep // track of but we are still leaving through our normal code path. if( 1 == getCrashContextSize() ) { rpal_debug_info( "clearing default crash context" ); cleanCrashContext(); } } else { rInterlocked_increment32( &g_hcpContext.isRunning ); } rpal_debug_info( "finished stopping hcp" ); return TRUE; }
RPRIVATE RU32 RPAL_THREAD_FUNC thread_quitAndCleanup ( RPVOID context ) { UNREFERENCED_PARAMETER( context ); if( 0 == rInterlocked_decrement32( &g_hcpContext.isRunning ) ) { rpal_thread_sleep( MSEC_FROM_SEC( 1 ) ); stopAllModules(); stopBeacons(); if( NULL != g_hcpContext.enrollmentToken && 0 != g_hcpContext.enrollmentTokenSize ) { rpal_memory_free( g_hcpContext.enrollmentToken ); } // If the default crashContext is still present, remove it since // we are shutting down properly. If it's non-default leave it since // somehow we may have had a higher order crash we want to keep // track of but we are still leaving through our normal code path. if( 1 == getCrashContextSize() ) { cleanCrashContext(); } rpal_Context_cleanup(); rpal_Context_deinitialize(); } else { rInterlocked_increment32( &g_hcpContext.isRunning ); } return 0; }