Skip to content

Commit 58abd38

Browse files
committed
Fix #978, store task parameters in task record
Implement a "CFE_ES_TaskStartParams_t" to complement the existing "CFE_ES_AppStartParams_t" and store this in the task record. This permits some nice cleanup: - All tasks can now use the same basic start function CFE_ES_StartAppTask() - No special/different logic is needed for main tasks/child tasks - Simplified APIs as parameters can be encapsulated in a single struct. - Fixes a race condition where child tasks may not be fully instantiated at the time the task function is invoked.
1 parent 6b9c267 commit 58abd38

File tree

10 files changed

+528
-510
lines changed

10 files changed

+528
-510
lines changed

fsw/cfe-core/src/es/cfe_es_api.c

Lines changed: 87 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,15 +1015,15 @@ int32 CFE_ES_GetAppInfo(CFE_ES_AppInfo_t *AppInfo, CFE_ES_AppId_t AppId)
10151015
AppInfo->ResourceId = CFE_RESOURCEID_UNWRAP(AppId); /* make into a generic resource ID */
10161016
AppInfo->Type = AppRecPtr->Type;
10171017

1018+
strncpy(AppInfo->Name, CFE_ES_AppRecordGetName(AppRecPtr), sizeof(AppInfo->Name)-1);
1019+
10181020
CFE_ES_CopyModuleBasicInfo(&AppRecPtr->StartParams.BasicInfo, AppInfo);
1019-
CFE_ES_CopyModuleStatusInfo(&AppRecPtr->ModuleInfo, AppInfo);
1021+
CFE_ES_CopyModuleStatusInfo(&AppRecPtr->LoadStatus, AppInfo);
10201022

1021-
AppInfo->StackSize = AppRecPtr->StartParams.StackSize;
10221023
AppInfo->ExceptionAction = AppRecPtr->StartParams.ExceptionAction;
1023-
AppInfo->Priority = AppRecPtr->StartParams.Priority;
10241024
AppInfo->MainTaskId = AppRecPtr->MainTaskId;
10251025

1026-
ModuleId = AppRecPtr->ModuleInfo.ModuleId;
1026+
ModuleId = AppRecPtr->LoadStatus.ModuleId;
10271027

10281028
/*
10291029
** Calculate the number of child tasks
@@ -1042,6 +1042,10 @@ int32 CFE_ES_GetAppInfo(CFE_ES_AppInfo_t *AppInfo, CFE_ES_AppId_t AppId)
10421042
strncpy(AppInfo->MainTaskName, TaskRecPtr->TaskName,
10431043
sizeof(AppInfo->MainTaskName) - 1);
10441044
AppInfo->MainTaskName[sizeof(AppInfo->MainTaskName) - 1] = '\0';
1045+
1046+
AppInfo->StackSize = TaskRecPtr->StartParams.StackSize;
1047+
AppInfo->Priority = TaskRecPtr->StartParams.Priority;
1048+
10451049
}
10461050
else
10471051
{
@@ -1105,10 +1109,12 @@ int32 CFE_ES_GetLibInfo(CFE_ES_AppInfo_t *LibInfo, CFE_ES_LibId_t LibId)
11051109
LibInfo->ResourceId = CFE_RESOURCEID_UNWRAP(LibId); /* make into generic ID */
11061110
LibInfo->Type = CFE_ES_AppType_LIBRARY;
11071111

1108-
CFE_ES_CopyModuleBasicInfo(&LibRecPtr->BasicInfo, LibInfo);
1109-
CFE_ES_CopyModuleStatusInfo(&LibRecPtr->ModuleInfo, LibInfo);
1112+
strncpy(LibInfo->Name, CFE_ES_LibRecordGetName(LibRecPtr), sizeof(LibInfo->Name)-1);
11101113

1111-
ModuleId = LibRecPtr->ModuleInfo.ModuleId;
1114+
CFE_ES_CopyModuleBasicInfo(&LibRecPtr->LoadParams, LibInfo);
1115+
CFE_ES_CopyModuleStatusInfo(&LibRecPtr->LoadStatus, LibInfo);
1116+
1117+
ModuleId = LibRecPtr->LoadStatus.ModuleId;
11121118

11131119
Status = CFE_SUCCESS;
11141120
}
@@ -1243,108 +1249,90 @@ int32 CFE_ES_CreateChildTask(CFE_ES_TaskId_t *TaskIdPtr,
12431249
CFE_ES_TaskPriority_Atom_t Priority,
12441250
uint32 Flags)
12451251
{
1252+
int32 ReturnCode;
1253+
CFE_ES_AppRecord_t * AppRecPtr;
1254+
CFE_ES_AppId_t ParentAppId;
1255+
CFE_ES_TaskId_t SelfTaskId;
1256+
CFE_ES_TaskStartParams_t Params;
12461257

1247-
int32 Result;
1248-
CFE_ES_AppRecord_t *AppRecPtr;
1249-
CFE_ES_TaskRecord_t *TaskRecPtr;
1250-
int32 ReturnCode;
1251-
CFE_ES_TaskId_t SelfTaskId;
1252-
CFE_ES_TaskId_t LocalChildTaskId;
1253-
osal_id_t OsalId;
1258+
ParentAppId = CFE_ES_APPID_UNDEFINED;
12541259

1255-
/*
1256-
** Validate some of the arguments
1257-
*/
1258-
if ( TaskIdPtr == NULL )
1259-
{
1260-
if (TaskName == NULL)
1261-
{
1262-
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Task Id and Name Pointer Parameters are NULL.\n");
1263-
ReturnCode = CFE_ES_BAD_ARGUMENT;
1264-
}
1265-
else
1266-
{
1267-
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Task Id Pointer Parameter is NULL for Task '%s'.\n",TaskName);
1268-
ReturnCode = CFE_ES_BAD_ARGUMENT;
1269-
}
1270-
}
1271-
else if ( TaskName == NULL )
1272-
{
1273-
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: TaskName Parameter is NULL\n");
1274-
ReturnCode = CFE_ES_BAD_ARGUMENT;
1275-
}
1276-
else if ( FunctionPtr == NULL )
1277-
{
1278-
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Function Pointer Parameter is NULL for Task '%s'\n",TaskName);
1279-
ReturnCode = CFE_ES_BAD_ARGUMENT;
1280-
}
1281-
else
1282-
{
1283-
1284-
CFE_ES_LockSharedData(__func__,__LINE__);
1260+
memset(&Params, 0, sizeof(Params));
1261+
Params.Priority = Priority;
1262+
Params.StackSize = StackSize;
12851263

1286-
/*
1287-
** Get the App Record of the calling Application
1288-
*/
1289-
AppRecPtr = CFE_ES_GetAppRecordByContext();
1290-
if (AppRecPtr == NULL)
1291-
{
1292-
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Invalid calling context when creating Task '%s'\n",TaskName);
1293-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
1294-
}
1295-
else /* else AppId is valid */
1296-
{
1297-
/*
1298-
** First, Make sure the Calling Task is a cFE Main task.
1299-
** TaskID must be the same as the Parent Task ID.
1300-
*/
1301-
OsalId = OS_TaskGetId();
1302-
SelfTaskId = CFE_ES_TaskId_FromOSAL(OsalId);
1303-
if ( CFE_RESOURCEID_TEST_EQUAL(SelfTaskId, AppRecPtr->MainTaskId) )
1304-
{
1305-
/*
1306-
** Step 2: Create the new task using the OS API call
1307-
*/
1308-
Result = OS_TaskCreate(&OsalId, TaskName, FunctionPtr, StackPtr,
1309-
StackSize, Priority, OS_FP_ENABLED );
1310-
1311-
/*
1312-
** Step 3: Record the task information in the task table
1313-
*/
1314-
if ( Result == OS_SUCCESS )
1315-
{
1316-
LocalChildTaskId = CFE_ES_TaskId_FromOSAL(OsalId);
1317-
TaskRecPtr = CFE_ES_LocateTaskRecordByID(LocalChildTaskId);
1264+
/*
1265+
** Validate some of the arguments
1266+
*/
1267+
if (TaskIdPtr == NULL)
1268+
{
1269+
if (TaskName == NULL)
1270+
{
1271+
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Task Id and Name Pointer Parameters are NULL.\n");
1272+
ReturnCode = CFE_ES_BAD_ARGUMENT;
1273+
}
1274+
else
1275+
{
1276+
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Task Id Pointer Parameter is NULL for Task '%s'.\n",
1277+
TaskName);
1278+
ReturnCode = CFE_ES_BAD_ARGUMENT;
1279+
}
1280+
}
1281+
else if (TaskName == NULL)
1282+
{
1283+
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: TaskName Parameter is NULL\n");
1284+
ReturnCode = CFE_ES_BAD_ARGUMENT;
1285+
}
1286+
else if (FunctionPtr == NULL)
1287+
{
1288+
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Function Pointer Parameter is NULL for Task '%s'\n", TaskName);
1289+
ReturnCode = CFE_ES_BAD_ARGUMENT;
1290+
}
1291+
else
1292+
{
1293+
/*
1294+
** First, Make sure the Calling Task is a cFE Main task.
1295+
** TaskID must be the same as the Parent Task ID.
1296+
*/
1297+
SelfTaskId = CFE_ES_TaskId_FromOSAL(OS_TaskGetId());
13181298

1319-
CFE_ES_TaskRecordSetUsed(TaskRecPtr, CFE_RESOURCEID_UNWRAP(LocalChildTaskId));
1320-
TaskRecPtr->AppId = CFE_ES_AppRecordGetID(AppRecPtr);
1321-
strncpy(TaskRecPtr->TaskName,TaskName,sizeof(TaskRecPtr->TaskName) - 1);
1322-
TaskRecPtr->TaskName[sizeof(TaskRecPtr->TaskName) - 1] = '\0';
1323-
CFE_ES_Global.RegisteredTasks++;
1299+
CFE_ES_LockSharedData(__func__, __LINE__);
13241300

1325-
*TaskIdPtr = CFE_ES_TaskRecordGetID(TaskRecPtr);
1326-
ReturnCode = CFE_SUCCESS;
1327-
}
1328-
else
1329-
{
1330-
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Error calling OS_TaskCreate for Task '%s' RC = 0x%08X\n",TaskName,(unsigned int)Result);
1331-
ReturnCode = CFE_ES_ERR_CHILD_TASK_CREATE;
1332-
}
1333-
}
1334-
else
1335-
{
1336-
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Error: Cannot call from a Child Task (for Task '%s').\n",TaskName);
1301+
/*
1302+
** Get the App Record of the calling Application
1303+
*/
1304+
AppRecPtr = CFE_ES_GetAppRecordByContext();
1305+
if (AppRecPtr == NULL)
1306+
{
1307+
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Invalid calling context when creating Task '%s'\n",
1308+
TaskName);
1309+
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
1310+
}
1311+
else if (!CFE_RESOURCEID_TEST_EQUAL(SelfTaskId, AppRecPtr->MainTaskId))
1312+
{
1313+
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Error: Cannot call from a Child Task (for Task '%s').\n",
1314+
TaskName);
13371315
ReturnCode = CFE_ES_ERR_CHILD_TASK_CREATE;
1316+
}
1317+
else
1318+
{
1319+
ParentAppId = CFE_ES_AppRecordGetID(AppRecPtr);
1320+
ReturnCode = CFE_SUCCESS;
1321+
} /* end If AppID is valid */
13381322

1339-
} /* end if Calling task is a main task */
1340-
1341-
}/* end If AppID is valid */
1323+
CFE_ES_UnlockSharedData(__func__, __LINE__);
13421324

1343-
CFE_ES_UnlockSharedData(__func__,__LINE__);
1325+
} /* end if parameter checking */
13441326

1345-
} /* end if parameter checking */
1327+
/*
1328+
** Step 2: Create the new task if the parameter validation succeeded
1329+
*/
1330+
if (ReturnCode == CFE_SUCCESS)
1331+
{
1332+
ReturnCode = CFE_ES_StartAppTask(TaskIdPtr, TaskName, FunctionPtr, &Params, ParentAppId);
1333+
}
13461334

1347-
return(ReturnCode);
1335+
return (ReturnCode);
13481336

13491337
} /* End of CFE_ES_CreateChildTask() */
13501338

0 commit comments

Comments
 (0)