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:
committed by
Jessica Hamilton
parent
fe3f797dc8
commit
b809279cd8
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user