Skip to content

Commit a0cda23

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 c87adc4 commit a0cda23

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
@@ -1001,15 +1001,15 @@ int32 CFE_ES_GetAppInfo(CFE_ES_AppInfo_t *AppInfo, CFE_ES_AppId_t AppId)
10011001
AppInfo->ResourceId = CFE_RESOURCEID_UNWRAP(AppId); /* make into a generic resource ID */
10021002
AppInfo->Type = AppRecPtr->Type;
10031003

1004+
strncpy(AppInfo->Name, CFE_ES_AppRecordGetName(AppRecPtr), sizeof(AppInfo->Name)-1);
1005+
10041006
CFE_ES_CopyModuleBasicInfo(&AppRecPtr->StartParams.BasicInfo, AppInfo);
1005-
CFE_ES_CopyModuleStatusInfo(&AppRecPtr->ModuleInfo, AppInfo);
1007+
CFE_ES_CopyModuleStatusInfo(&AppRecPtr->LoadStatus, AppInfo);
10061008

1007-
AppInfo->StackSize = AppRecPtr->StartParams.StackSize;
10081009
AppInfo->ExceptionAction = AppRecPtr->StartParams.ExceptionAction;
1009-
AppInfo->Priority = AppRecPtr->StartParams.Priority;
10101010
AppInfo->MainTaskId = AppRecPtr->MainTaskId;
10111011

1012-
ModuleId = AppRecPtr->ModuleInfo.ModuleId;
1012+
ModuleId = AppRecPtr->LoadStatus.ModuleId;
10131013

10141014
/*
10151015
** Calculate the number of child tasks
@@ -1028,6 +1028,10 @@ int32 CFE_ES_GetAppInfo(CFE_ES_AppInfo_t *AppInfo, CFE_ES_AppId_t AppId)
10281028
strncpy(AppInfo->MainTaskName, TaskRecPtr->TaskName,
10291029
sizeof(AppInfo->MainTaskName) - 1);
10301030
AppInfo->MainTaskName[sizeof(AppInfo->MainTaskName) - 1] = '\0';
1031+
1032+
AppInfo->StackSize = TaskRecPtr->StartParams.StackSize;
1033+
AppInfo->Priority = TaskRecPtr->StartParams.Priority;
1034+
10311035
}
10321036
else
10331037
{
@@ -1091,10 +1095,12 @@ int32 CFE_ES_GetLibInfo(CFE_ES_AppInfo_t *LibInfo, CFE_ES_LibId_t LibId)
10911095
LibInfo->ResourceId = CFE_RESOURCEID_UNWRAP(LibId); /* make into generic ID */
10921096
LibInfo->Type = CFE_ES_AppType_LIBRARY;
10931097

1094-
CFE_ES_CopyModuleBasicInfo(&LibRecPtr->BasicInfo, LibInfo);
1095-
CFE_ES_CopyModuleStatusInfo(&LibRecPtr->ModuleInfo, LibInfo);
1098+
strncpy(LibInfo->Name, CFE_ES_LibRecordGetName(LibRecPtr), sizeof(LibInfo->Name)-1);
10961099

1097-
ModuleId = LibRecPtr->ModuleInfo.ModuleId;
1100+
CFE_ES_CopyModuleBasicInfo(&LibRecPtr->LoadParams, LibInfo);
1101+
CFE_ES_CopyModuleStatusInfo(&LibRecPtr->LoadStatus, LibInfo);
1102+
1103+
ModuleId = LibRecPtr->LoadStatus.ModuleId;
10981104

10991105
Status = CFE_SUCCESS;
11001106
}
@@ -1229,108 +1235,90 @@ int32 CFE_ES_CreateChildTask(CFE_ES_TaskId_t *TaskIdPtr,
12291235
CFE_ES_TaskPriority_Atom_t Priority,
12301236
uint32 Flags)
12311237
{
1238+
int32 ReturnCode;
1239+
CFE_ES_AppRecord_t * AppRecPtr;
1240+
CFE_ES_AppId_t ParentAppId;
1241+
CFE_ES_TaskId_t SelfTaskId;
1242+
CFE_ES_TaskStartParams_t Params;
12321243

1233-
int32 Result;
1234-
CFE_ES_AppRecord_t *AppRecPtr;
1235-
CFE_ES_TaskRecord_t *TaskRecPtr;
1236-
int32 ReturnCode;
1237-
CFE_ES_TaskId_t SelfTaskId;
1238-
CFE_ES_TaskId_t LocalChildTaskId;
1239-
osal_id_t OsalId;
1244+
ParentAppId = CFE_ES_APPID_UNDEFINED;
12401245

1241-
/*
1242-
** Validate some of the arguments
1243-
*/
1244-
if ( TaskIdPtr == NULL )
1245-
{
1246-
if (TaskName == NULL)
1247-
{
1248-
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Task Id and Name Pointer Parameters are NULL.\n");
1249-
ReturnCode = CFE_ES_BAD_ARGUMENT;
1250-
}
1251-
else
1252-
{
1253-
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Task Id Pointer Parameter is NULL for Task '%s'.\n",TaskName);
1254-
ReturnCode = CFE_ES_BAD_ARGUMENT;
1255-
}
1256-
}
1257-
else if ( TaskName == NULL )
1258-
{
1259-
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: TaskName Parameter is NULL\n");
1260-
ReturnCode = CFE_ES_BAD_ARGUMENT;
1261-
}
1262-
else if ( FunctionPtr == NULL )
1263-
{
1264-
CFE_ES_WriteToSysLog("CFE_ES_CreateChildTask: Function Pointer Parameter is NULL for Task '%s'\n",TaskName);
1265-
ReturnCode = CFE_ES_BAD_ARGUMENT;
1266-
}
1267-
else
1268-
{
1269-
1270-
CFE_ES_LockSharedData(__func__,__LINE__);
1246+
memset(&Params, 0, sizeof(Params));
1247+
Params.Priority = Priority;
1248+
Params.StackSize = StackSize;
12711249

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

1305-
CFE_ES_TaskRecordSetUsed(TaskRecPtr, CFE_RESOURCEID_UNWRAP(LocalChildTaskId));
1306-
TaskRecPtr->AppId = CFE_ES_AppRecordGetID(AppRecPtr);
1307-
strncpy(TaskRecPtr->TaskName,TaskName,sizeof(TaskRecPtr->TaskName) - 1);
1308-
TaskRecPtr->TaskName[sizeof(TaskRecPtr->TaskName) - 1] = '\0';
1309-
CFE_ES_Global.RegisteredTasks++;
1285+
CFE_ES_LockSharedData(__func__, __LINE__);
13101286

1311-
*TaskIdPtr = CFE_ES_TaskRecordGetID(TaskRecPtr);
1312-
ReturnCode = CFE_SUCCESS;
1313-
}
1314-
else
1315-
{
1316-
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Error calling OS_TaskCreate for Task '%s' RC = 0x%08X\n",TaskName,(unsigned int)Result);
1317-
ReturnCode = CFE_ES_ERR_CHILD_TASK_CREATE;
1318-
}
1319-
}
1320-
else
1321-
{
1322-
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Error: Cannot call from a Child Task (for Task '%s').\n",TaskName);
1287+
/*
1288+
** Get the App Record of the calling Application
1289+
*/
1290+
AppRecPtr = CFE_ES_GetAppRecordByContext();
1291+
if (AppRecPtr == NULL)
1292+
{
1293+
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Invalid calling context when creating Task '%s'\n",
1294+
TaskName);
1295+
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
1296+
}
1297+
else if (!CFE_RESOURCEID_TEST_EQUAL(SelfTaskId, AppRecPtr->MainTaskId))
1298+
{
1299+
CFE_ES_SysLogWrite_Unsync("CFE_ES_CreateChildTask: Error: Cannot call from a Child Task (for Task '%s').\n",
1300+
TaskName);
13231301
ReturnCode = CFE_ES_ERR_CHILD_TASK_CREATE;
1302+
}
1303+
else
1304+
{
1305+
ParentAppId = CFE_ES_AppRecordGetID(AppRecPtr);
1306+
ReturnCode = CFE_SUCCESS;
1307+
} /* end If AppID is valid */
13241308

1325-
} /* end if Calling task is a main task */
1326-
1327-
}/* end If AppID is valid */
1309+
CFE_ES_UnlockSharedData(__func__, __LINE__);
13281310

1329-
CFE_ES_UnlockSharedData(__func__,__LINE__);
1311+
} /* end if parameter checking */
13301312

1331-
} /* end if parameter checking */
1313+
/*
1314+
** Step 2: Create the new task if the parameter validation succeeded
1315+
*/
1316+
if (ReturnCode == CFE_SUCCESS)
1317+
{
1318+
ReturnCode = CFE_ES_StartAppTask(TaskIdPtr, TaskName, FunctionPtr, &Params, ParentAppId);
1319+
}
13321320

1333-
return(ReturnCode);
1321+
return (ReturnCode);
13341322

13351323
} /* End of CFE_ES_CreateChildTask() */
13361324

0 commit comments

Comments
 (0)