@@ -284,8 +284,8 @@ void CFE_ES_StartApplications(uint32 ResetType, const char *StartFilePath)
284
284
*-----------------------------------------------------------------*/
285
285
int32 CFE_ES_ParseFileEntry (const char * * TokenList , uint32 NumTokens )
286
286
{
287
- const char * ModuleName ;
288
- const char * EntryType ;
287
+ const char * ModuleName ;
288
+ const char * EntryType ;
289
289
unsigned long ParsedValue ;
290
290
union
291
291
{
@@ -495,7 +495,7 @@ int32 CFE_ES_LoadModule(CFE_ResourceId_t ParentResourceId, const char *ModuleNam
495
495
*-----------------------------------------------------------------*/
496
496
int32 CFE_ES_GetTaskFunction (CFE_ES_TaskEntryFuncPtr_t * FuncPtr )
497
497
{
498
- CFE_ES_TaskRecord_t * TaskRecPtr ;
498
+ CFE_ES_TaskRecord_t * TaskRecPtr ;
499
499
CFE_ES_TaskEntryFuncPtr_t EntryFunc ;
500
500
int32 ReturnCode ;
501
501
int32 Timeout ;
@@ -656,6 +656,7 @@ int32 CFE_ES_StartAppTask(CFE_ES_TaskId_t *TaskIdPtr, const char *TaskName, CFE_
656
656
int32 CFE_ES_AppCreate (CFE_ES_AppId_t * ApplicationIdPtr , const char * AppName , const CFE_ES_AppStartParams_t * Params )
657
657
{
658
658
CFE_Status_t Status ;
659
+ CFE_Status_t CleanupStatus ;
659
660
CFE_ES_AppRecord_t * AppRecPtr ;
660
661
CFE_ResourceId_t PendingResourceId = CFE_RESOURCEID_UNDEFINED ;
661
662
@@ -799,6 +800,16 @@ int32 CFE_ES_AppCreate(CFE_ES_AppId_t *ApplicationIdPtr, const char *AppName, co
799
800
/*
800
801
* Set the table entry back to free
801
802
*/
803
+ if (OS_ObjectIdDefined (AppRecPtr -> LoadStatus .ModuleId ))
804
+ {
805
+ CleanupStatus = OS_ModuleUnload (AppRecPtr -> LoadStatus .ModuleId );
806
+ if (CleanupStatus != OS_SUCCESS )
807
+ {
808
+ CFE_ES_WriteToSysLog ("%s: Module (ID:0x%08lX) Unload failed. RC=%ld\n" , __func__ ,
809
+ OS_ObjectIdToInteger (AppRecPtr -> LoadStatus .ModuleId ), (long )CleanupStatus );
810
+ }
811
+ }
812
+
802
813
CFE_ES_AppRecordSetFree (AppRecPtr );
803
814
PendingResourceId = CFE_RESOURCEID_UNDEFINED ;
804
815
}
@@ -819,7 +830,7 @@ int32 CFE_ES_AppCreate(CFE_ES_AppId_t *ApplicationIdPtr, const char *AppName, co
819
830
int32 CFE_ES_LoadLibrary (CFE_ES_LibId_t * LibraryIdPtr , const char * LibName , const CFE_ES_ModuleLoadParams_t * Params )
820
831
{
821
832
CFE_ES_LibraryEntryFuncPtr_t FunctionPointer ;
822
- CFE_ES_LibRecord_t * LibSlotPtr ;
833
+ CFE_ES_LibRecord_t * LibSlotPtr ;
823
834
int32 Status ;
824
835
CFE_ResourceId_t PendingResourceId ;
825
836
@@ -974,7 +985,7 @@ bool CFE_ES_RunAppTableScan(uint32 ElapsedTime, void *Arg)
974
985
{
975
986
CFE_ES_AppTableScanState_t * State = (CFE_ES_AppTableScanState_t * )Arg ;
976
987
uint32 i ;
977
- CFE_ES_AppRecord_t * AppPtr ;
988
+ CFE_ES_AppRecord_t * AppPtr ;
978
989
CFE_ES_AppId_t AppTimeoutList [CFE_PLATFORM_ES_MAX_APPLICATIONS ];
979
990
uint32 NumAppTimeouts ;
980
991
@@ -1092,14 +1103,14 @@ bool CFE_ES_RunAppTableScan(uint32 ElapsedTime, void *Arg)
1092
1103
*-----------------------------------------------------------------*/
1093
1104
void CFE_ES_ProcessControlRequest (CFE_ES_AppId_t AppId )
1094
1105
{
1095
- CFE_ES_AppRecord_t * AppRecPtr ;
1106
+ CFE_ES_AppRecord_t * AppRecPtr ;
1096
1107
uint32 PendingControlReq ;
1097
1108
CFE_ES_AppStartParams_t RestartParams ;
1098
1109
char OrigAppName [OS_MAX_API_NAME ];
1099
1110
CFE_Status_t CleanupStatus ;
1100
1111
CFE_Status_t StartupStatus ;
1101
1112
CFE_ES_AppId_t NewAppId ;
1102
- const char * ReqName ;
1113
+ const char * ReqName ;
1103
1114
char MessageDetail [48 ];
1104
1115
uint16 EventID ;
1105
1116
CFE_EVS_EventType_Enum_t EventType ;
@@ -1325,8 +1336,8 @@ int32 CFE_ES_CleanUpApp(CFE_ES_AppId_t AppId)
1325
1336
osal_id_t ModuleId ;
1326
1337
uint32 NumTasks ;
1327
1338
uint32 NumPools ;
1328
- CFE_ES_AppRecord_t * AppRecPtr ;
1329
- CFE_ES_TaskRecord_t * TaskRecPtr ;
1339
+ CFE_ES_AppRecord_t * AppRecPtr ;
1340
+ CFE_ES_TaskRecord_t * TaskRecPtr ;
1330
1341
CFE_ES_MemPoolRecord_t * MemPoolRecPtr ;
1331
1342
1332
1343
NumTasks = 0 ;
@@ -1565,6 +1576,7 @@ void CFE_ES_CleanupObjectCallback(osal_id_t ObjectId, void *arg)
1565
1576
int32 OsStatus ;
1566
1577
osal_objtype_t ObjType ;
1567
1578
bool ObjIsValid ;
1579
+ CFE_Status_t ErrorStatus = CFE_ES_APP_CLEANUP_ERR ; // Set default cFE error status
1568
1580
1569
1581
CleanState = (CFE_ES_CleanupState_t * )arg ;
1570
1582
ObjIsValid = true;
@@ -1573,22 +1585,28 @@ void CFE_ES_CleanupObjectCallback(osal_id_t ObjectId, void *arg)
1573
1585
switch (ObjType )
1574
1586
{
1575
1587
case OS_OBJECT_TYPE_OS_TASK :
1576
- OsStatus = OS_TaskDelete (ObjectId );
1588
+ OsStatus = OS_TaskDelete (ObjectId );
1589
+ ErrorStatus = CFE_ES_ERR_CHILD_TASK_DELETE ;
1577
1590
break ;
1578
1591
case OS_OBJECT_TYPE_OS_QUEUE :
1579
- OsStatus = OS_QueueDelete (ObjectId );
1592
+ OsStatus = OS_QueueDelete (ObjectId );
1593
+ ErrorStatus = CFE_ES_QUEUE_DELETE_ERR ;
1580
1594
break ;
1581
1595
case OS_OBJECT_TYPE_OS_BINSEM :
1582
- OsStatus = OS_BinSemDelete (ObjectId );
1596
+ OsStatus = OS_BinSemDelete (ObjectId );
1597
+ ErrorStatus = CFE_ES_BIN_SEM_DELETE_ERR ;
1583
1598
break ;
1584
1599
case OS_OBJECT_TYPE_OS_COUNTSEM :
1585
- OsStatus = OS_CountSemDelete (ObjectId );
1600
+ OsStatus = OS_CountSemDelete (ObjectId );
1601
+ ErrorStatus = CFE_ES_COUNT_SEM_DELETE_ERR ;
1586
1602
break ;
1587
1603
case OS_OBJECT_TYPE_OS_MUTEX :
1588
- OsStatus = OS_MutSemDelete (ObjectId );
1604
+ OsStatus = OS_MutSemDelete (ObjectId );
1605
+ ErrorStatus = CFE_ES_MUT_SEM_DELETE_ERR ;
1589
1606
break ;
1590
1607
case OS_OBJECT_TYPE_OS_TIMECB :
1591
- OsStatus = OS_TimerDelete (ObjectId );
1608
+ OsStatus = OS_TimerDelete (ObjectId );
1609
+ ErrorStatus = CFE_ES_TIMER_DELETE_ERR ;
1592
1610
break ;
1593
1611
case OS_OBJECT_TYPE_OS_STREAM :
1594
1612
OsStatus = OS_close (ObjectId );
@@ -1615,36 +1633,8 @@ void CFE_ES_CleanupObjectCallback(osal_id_t ObjectId, void *arg)
1615
1633
OS_ObjectIdToInteger (ObjectId ), (long )OsStatus );
1616
1634
if (CleanState -> OverallStatus == CFE_SUCCESS )
1617
1635
{
1618
- /*
1619
- * Translate any OS failures into the appropriate CFE_ES return codes
1620
- * (Some object types have special return codes, depending on what type
1621
- * of object failed to delete)
1622
- */
1623
- switch (ObjType )
1624
- {
1625
- case OS_OBJECT_TYPE_OS_TASK :
1626
- CleanState -> OverallStatus = CFE_ES_ERR_CHILD_TASK_DELETE ;
1627
- break ;
1628
- case OS_OBJECT_TYPE_OS_QUEUE :
1629
- CleanState -> OverallStatus = CFE_ES_QUEUE_DELETE_ERR ;
1630
- break ;
1631
- case OS_OBJECT_TYPE_OS_BINSEM :
1632
- CleanState -> OverallStatus = CFE_ES_BIN_SEM_DELETE_ERR ;
1633
- break ;
1634
- case OS_OBJECT_TYPE_OS_COUNTSEM :
1635
- CleanState -> OverallStatus = CFE_ES_COUNT_SEM_DELETE_ERR ;
1636
- break ;
1637
- case OS_OBJECT_TYPE_OS_MUTEX :
1638
- CleanState -> OverallStatus = CFE_ES_MUT_SEM_DELETE_ERR ;
1639
- break ;
1640
- case OS_OBJECT_TYPE_OS_TIMECB :
1641
- CleanState -> OverallStatus = CFE_ES_TIMER_DELETE_ERR ;
1642
- break ;
1643
- default :
1644
- /* generic failure */
1645
- CleanState -> OverallStatus = CFE_ES_APP_CLEANUP_ERR ;
1646
- break ;
1647
- }
1636
+ // Save the object-type-specific error status that was set earlier in the switch statement
1637
+ CleanState -> OverallStatus = ErrorStatus ;
1648
1638
}
1649
1639
}
1650
1640
}
0 commit comments