kernel/team: Allow retrieving more attributes

- Stored the additional start time of each team, expressed by
milliseconds since boot.
- Added more fields to the `team_info` structure. These field
include those provided by the `get_extended_team_info` syscall as
well as the newly introduced `start_time`.
- Extended the `_kern_get_team_info` system call to receive an
additional `size_t` argument. If this size is smaller than or
equal to the size of the old `team_info` structure, the newly
added attributes will not be retrieved.

Change-Id: I22ee6b91ad2ee3b66a7f770036c79a718c5f115c
Reviewed-on: https://review.haiku-os.org/c/haiku/+/6390
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: Jessica Hamilton <[email protected]>
This commit is contained in:
Trung Nguyen
2023-05-17 11:07:14 +00:00
committed by Jessica Hamilton
parent fe3f797dc8
commit b809279cd8
6 changed files with 49 additions and 19 deletions
+9
View File
@@ -247,6 +247,15 @@ typedef struct {
char args[64];
uid_t uid;
gid_t gid;
/* Haiku R1 extensions */
uid_t real_uid;
gid_t real_gid;
pid_t group_id;
pid_t session_id;
team_id parent;
char name[B_OS_NAME_LENGTH];
bigtime_t start_time;
} team_info;
#define B_CURRENT_TEAM 0
+2 -2
View File
@@ -80,8 +80,8 @@ pid_t _user_process_info(pid_t process, int32 which);
pid_t _user_setpgid(pid_t process, pid_t group);
pid_t _user_setsid(void);
status_t _user_get_team_info(team_id id, team_info *info);
status_t _user_get_next_team_info(int32 *cookie, team_info *info);
status_t _user_get_team_info(team_id id, team_info *info, size_t size);
status_t _user_get_next_team_info(int32 *cookie, team_info *info, size_t size);
status_t _user_get_team_usage_info(team_id team, int32 who,
team_usage_info *info, size_t size);
status_t _user_get_extended_team_info(team_id teamID, uint32 flags,
+2
View File
@@ -275,6 +275,8 @@ struct Team : TeamThreadIteratorEntry<team_id>, KernelReferenceable,
struct team_debug_info debug_info;
bigtime_t start_time;
// protected by time_lock
bigtime_t dead_threads_kernel_time;
bigtime_t dead_threads_user_time;
+4 -2
View File
@@ -180,8 +180,10 @@ extern int64 _kern_restore_signal_frame(
extern status_t _kern_get_thread_info(thread_id id, thread_info *info);
extern status_t _kern_get_next_thread_info(team_id team, int32 *cookie,
thread_info *info);
extern status_t _kern_get_team_info(team_id id, team_info *info);
extern status_t _kern_get_next_team_info(int32 *cookie, team_info *info);
extern status_t _kern_get_team_info(team_id id, team_info *info,
size_t size);
extern status_t _kern_get_next_team_info(int32 *cookie, team_info *info,
size_t size);
extern status_t _kern_get_team_usage_info(team_id team, int32 who,
team_usage_info *info, size_t size);
extern status_t _kern_get_extended_team_info(team_id teamID, uint32 flags,
+30 -7
View File
@@ -574,6 +574,8 @@ Team::Create(team_id id, const char* name, bool kernel)
return NULL;
}
team->start_time = system_time();
// everything went fine
return teamDeleter.Detach();
}
@@ -2676,7 +2678,7 @@ wait_for_child(pid_t child, uint32 flags, siginfo_t& _info,
static status_t
fill_team_info(Team* team, team_info* info, size_t size)
{
if (size != sizeof(team_info))
if (size > sizeof(team_info))
return B_BAD_VALUE;
// TODO: Set more informations for team_info
@@ -2700,6 +2702,21 @@ fill_team_info(Team* team, team_info* info, size_t size)
strlcpy(info->args, team->Args(), sizeof(info->args));
info->argc = 1;
if (size > offsetof(team_info, real_uid)) {
info->real_uid = team->real_uid;
info->real_gid = team->real_gid;
info->group_id = team->group_id;
info->session_id = team->session_id;
if (team->parent != NULL)
info->parent = team->parent->id;
else
info->parent = -1;
strlcpy(info->name, team->Name(), sizeof(info->name));
info->start_time = team->start_time;
}
return B_OK;
}
@@ -4360,17 +4377,20 @@ _user_kill_team(team_id team)
status_t
_user_get_team_info(team_id id, team_info* userInfo)
_user_get_team_info(team_id id, team_info* userInfo, size_t size)
{
status_t status;
team_info info;
if (size > sizeof(team_info))
return B_BAD_VALUE;
if (!IS_USER_ADDRESS(userInfo))
return B_BAD_ADDRESS;
status = _get_team_info(id, &info, sizeof(team_info));
status = _get_team_info(id, &info, size);
if (status == B_OK) {
if (user_memcpy(userInfo, &info, sizeof(team_info)) < B_OK)
if (user_memcpy(userInfo, &info, size) < B_OK)
return B_BAD_ADDRESS;
}
@@ -4379,23 +4399,26 @@ _user_get_team_info(team_id id, team_info* userInfo)
status_t
_user_get_next_team_info(int32* userCookie, team_info* userInfo)
_user_get_next_team_info(int32* userCookie, team_info* userInfo, size_t size)
{
status_t status;
team_info info;
int32 cookie;
if (size > sizeof(team_info))
return B_BAD_VALUE;
if (!IS_USER_ADDRESS(userCookie)
|| !IS_USER_ADDRESS(userInfo)
|| user_memcpy(&cookie, userCookie, sizeof(int32)) < B_OK)
return B_BAD_ADDRESS;
status = _get_next_team_info(&cookie, &info, sizeof(team_info));
status = _get_next_team_info(&cookie, &info, size);
if (status != B_OK)
return status;
if (user_memcpy(userCookie, &cookie, sizeof(int32)) < B_OK
|| user_memcpy(userInfo, &info, sizeof(team_info)) < B_OK)
|| user_memcpy(userInfo, &info, size) < B_OK)
return B_BAD_ADDRESS;
return status;
+2 -8
View File
@@ -35,19 +35,13 @@ kill_team(team_id team)
status_t
_get_team_info(team_id team, team_info *info, size_t size)
{
if (info == NULL || size != sizeof(team_info))
return B_BAD_VALUE;
return _kern_get_team_info(team, info);
return _kern_get_team_info(team, info, size);
}
status_t
_get_next_team_info(int32 *cookie, team_info *info, size_t size)
{
if (info == NULL || size != sizeof(team_info))
return B_BAD_VALUE;
return _kern_get_next_team_info(cookie, info);
return _kern_get_next_team_info(cookie, info, size);
}