kernel/team: Set team arguments during load_image/exec_team.

This way, by the time we send a notification, the arguments
are already set even if the main thread has not yet started.

Fixes #12703.

Change-Id: Ib93b4b16bffa8cb943cf6389f0f72dce89f9749b
Reviewed-on: https://review.haiku-os.org/c/haiku/+/7702
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
Augustin Cavalier
2024-06-10 16:32:09 +00:00
committed by waddlesplash
parent 9631ca7349
commit 365b32bb6e
+11 -8
View File
@@ -1636,18 +1636,17 @@ team_create_thread_start_internal(void* args)
return B_BAD_ADDRESS;
}
TRACE(("team_create_thread_start: loading elf binary '%s'\n", path));
// set team args and update state
team->Lock();
team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1);
team->state = TEAM_STATE_NORMAL;
team->Unlock();
free_team_arg(teamArgs);
// the arguments are already on the user stack, we no longer need
// them in this form
TRACE(("team_create_thread_start: loading elf binary '%s'\n", path));
// update state
team->Lock();
team->state = TEAM_STATE_NORMAL;
team->Unlock();
// Clone commpage area
area_id commPageArea = clone_commpage_area(team->id,
&team->commpage_address);
@@ -1808,6 +1807,8 @@ load_image_internal(char**& _flatArgs, size_t flatArgsSize, int32 argCount,
_flatArgs = NULL;
// args are owned by the team_arg structure now
team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1);
// create a new io_context for this team
team->io_context = vfs_new_io_context(parentIOContext, true);
if (!team->io_context) {
@@ -2014,6 +2015,8 @@ exec_team(const char* path, char**& _flatArgs, size_t flatArgsSize,
_flatArgs = NULL;
// args are owned by the team_arg structure now
team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1);
// TODO: remove team resources if there are any left
// thread_atkernel_exit() might not be called at all