Added comments to sys_(get|put)env() - please remove them from the kernel.
Renamed team_wait_on_team() to wait_for_team() (more BeOS-alike). Adapted to other changes (new thread functions). Cleanups. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2576 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
dba0db7fbe
commit
6d8aafc66e
@ -221,28 +221,31 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
status_t
|
||||||
team_wait_on_team(team_id id, int *retcode)
|
wait_for_team(team_id id, status_t *_returnCode)
|
||||||
{
|
{
|
||||||
struct team *p;
|
struct team *team;
|
||||||
thread_id tid;
|
thread_id thread;
|
||||||
int state;
|
cpu_status state;
|
||||||
|
|
||||||
|
// find main thread and wait for that
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_TEAM_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
p = team_get_team_struct_locked(id);
|
|
||||||
if (p && p->main_thread)
|
team = team_get_team_struct_locked(id);
|
||||||
tid = p->main_thread->id;
|
if (team && team->main_thread)
|
||||||
|
thread = team->main_thread->id;
|
||||||
else
|
else
|
||||||
tid = ERR_INVALID_HANDLE;
|
thread = ERR_INVALID_HANDLE;
|
||||||
|
|
||||||
RELEASE_TEAM_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|
||||||
if (tid < 0)
|
if (thread < 0)
|
||||||
return tid;
|
return thread;
|
||||||
|
|
||||||
return thread_wait_on_thread(tid, retcode);
|
return wait_for_thread(thread, _returnCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -389,7 +392,7 @@ get_arguments_data_size(char **args, int argc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int32
|
||||||
team_create_team2(void *args)
|
team_create_team2(void *args)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@ -551,13 +554,13 @@ team_create_team(const char *path, const char *name, char **args, int argc, char
|
|||||||
team->aspace = vm_get_aspace_by_id(team->_aspace_id);
|
team->aspace = vm_get_aspace_by_id(team->_aspace_id);
|
||||||
|
|
||||||
// create a kernel thread, but under the context of the new team
|
// create a kernel thread, but under the context of the new team
|
||||||
tid = thread_create_kernel_thread_etc(name, team_create_team2, teamArgs, team);
|
tid = spawn_kernel_thread_etc(team_create_team2, name, B_NORMAL_PRIORITY, teamArgs, team->id);
|
||||||
if (tid < 0) {
|
if (tid < 0) {
|
||||||
err = tid;
|
err = tid;
|
||||||
goto err5;
|
goto err5;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_resume_thread(tid);
|
resume_thread(tid);
|
||||||
|
|
||||||
return pid;
|
return pid;
|
||||||
|
|
||||||
@ -716,23 +719,25 @@ sys_setenv(const char *name, const char *value, int overwrite)
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
int i;
|
int i;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
|
// ToDo: please put me out of the kernel into libroot.so!
|
||||||
|
|
||||||
dprintf("sys_setenv: entry (name=%s, value=%s)\n", name, value);
|
dprintf("sys_setenv: entry (name=%s, value=%s)\n", name, value);
|
||||||
|
|
||||||
if (strlen(name) + strlen(value) + 1 >= SYS_THREAD_STRING_LENGTH_MAX)
|
if (strlen(name) + strlen(value) + 1 >= SYS_THREAD_STRING_LENGTH_MAX)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_TEAM_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
|
|
||||||
strcpy(var, name);
|
strcpy(var, name);
|
||||||
strncat(var, "=", SYS_THREAD_STRING_LENGTH_MAX-1);
|
strncat(var, "=", SYS_THREAD_STRING_LENGTH_MAX-1);
|
||||||
name_size = strlen(var);
|
name_size = strlen(var);
|
||||||
strncat(var, value, SYS_THREAD_STRING_LENGTH_MAX-1);
|
strncat(var, value, SYS_THREAD_STRING_LENGTH_MAX-1);
|
||||||
|
|
||||||
env_space = (addr)thread_get_current_thread()->team->user_env_base;
|
env_space = (addr)thread_get_current_thread()->team->user_env_base;
|
||||||
envp = (char **)env_space;
|
envp = (char **)env_space;
|
||||||
for (envc=0; envp[envc]; envc++) {
|
for (envc = 0; envp[envc]; envc++) {
|
||||||
if (!strncmp(envp[envc], var, name_size)) {
|
if (!strncmp(envp[envc], var, name_size)) {
|
||||||
var_exists = true;
|
var_exists = true;
|
||||||
var_pos = envc;
|
var_pos = envc;
|
||||||
@ -740,37 +745,34 @@ sys_setenv(const char *name, const char *value, int overwrite)
|
|||||||
}
|
}
|
||||||
if (!var_exists)
|
if (!var_exists)
|
||||||
var_pos = envc;
|
var_pos = envc;
|
||||||
|
|
||||||
dprintf("sys_setenv: variable does%s exist\n", var_exists ? "" : " not");
|
dprintf("sys_setenv: variable does%s exist\n", var_exists ? "" : " not");
|
||||||
if ((!var_exists) || (var_exists && overwrite)) {
|
if ((!var_exists) || (var_exists && overwrite)) {
|
||||||
|
|
||||||
// XXX- make a better allocator
|
// XXX- make a better allocator
|
||||||
if (var_exists) {
|
if (var_exists) {
|
||||||
if (strlen(var) <= strlen(envp[var_pos])) {
|
if (strlen(var) <= strlen(envp[var_pos])) {
|
||||||
strcpy(envp[var_pos], var);
|
strcpy(envp[var_pos], var);
|
||||||
}
|
} else {
|
||||||
else {
|
for (p = (char *)env_space + ENV_SIZE - 1, i = 0; envp[i]; i++)
|
||||||
for (p=(char *)env_space + ENV_SIZE - 1, i=0; envp[i]; i++)
|
|
||||||
if (envp[i] < p)
|
if (envp[i] < p)
|
||||||
p = envp[i];
|
p = envp[i];
|
||||||
p -= (strlen(var) + 1);
|
p -= (strlen(var) + 1);
|
||||||
if (p < (char *)env_space + (envc * sizeof(char *))) {
|
if (p < (char *)env_space + (envc * sizeof(char *))) {
|
||||||
rc = -1;
|
rc = -1;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
envp[var_pos] = p;
|
envp[var_pos] = p;
|
||||||
strcpy(envp[var_pos], var);
|
strcpy(envp[var_pos], var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (p=(char *)env_space + ENV_SIZE - 1, i=0; envp[i]; i++)
|
for (p = (char *)env_space + ENV_SIZE - 1, i=0; envp[i]; i++)
|
||||||
if (envp[i] < p)
|
if (envp[i] < p)
|
||||||
p = envp[i];
|
p = envp[i];
|
||||||
p -= (strlen(var) + 1);
|
p -= (strlen(var) + 1);
|
||||||
if (p < (char *)env_space + ((envc + 1) * sizeof(char *))) {
|
if (p < (char *)env_space + ((envc + 1) * sizeof(char *))) {
|
||||||
rc = -1;
|
rc = -1;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
envp[envc] = p;
|
envp[envc] = p;
|
||||||
strcpy(envp[envc], var);
|
strcpy(envp[envc], var);
|
||||||
envp[envc + 1] = NULL;
|
envp[envc + 1] = NULL;
|
||||||
@ -795,12 +797,14 @@ sys_getenv(const char *name, char **value)
|
|||||||
int i;
|
int i;
|
||||||
int len = strlen(name);
|
int len = strlen(name);
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
|
// ToDo: please put me out of the kernel into libroot.so!
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_TEAM_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
|
|
||||||
envp = (char **)thread_get_current_thread()->team->user_env_base;
|
envp = (char **)thread_get_current_thread()->team->user_env_base;
|
||||||
for (i=0; envp[i]; i++) {
|
for (i = 0; envp[i]; i++) {
|
||||||
if (!strncmp(envp[i], name, len)) {
|
if (!strncmp(envp[i], name, len)) {
|
||||||
p = envp[i] + len;
|
p = envp[i] + len;
|
||||||
if (*p == '=') {
|
if (*p == '=') {
|
||||||
@ -821,18 +825,18 @@ sys_getenv(const char *name, char **value)
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
int
|
status_t
|
||||||
user_team_wait_on_team(team_id id, int *userReturnCode)
|
user_wait_for_team(team_id id, status_t *_userReturnCode)
|
||||||
{
|
{
|
||||||
int returnCode;
|
status_t returnCode;
|
||||||
int status;
|
status_t status;
|
||||||
|
|
||||||
if (!CHECK_USER_ADDRESS(userReturnCode))
|
if (!CHECK_USER_ADDRESS(_userReturnCode))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
status = team_wait_on_team(id, &returnCode);
|
status = wait_for_team(id, &returnCode);
|
||||||
if (status >= B_OK) {
|
if (status >= B_OK) {
|
||||||
if (user_memcpy(userReturnCode, &returnCode, sizeof(returnCode)) < B_OK)
|
if (user_memcpy(_userReturnCode, &returnCode, sizeof(returnCode)) < B_OK)
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user