Author: bonefish Date: 2011-05-02 17:31:32 +0200 (Mon, 02 May 2011) New Revision: 41303 Changeset: https://dev.haiku-os.org/changeset/41303 Modified: haiku/branches/developer/bonefish/signals/headers/private/kernel/thread_types.h haiku/branches/developer/bonefish/signals/src/system/kernel/debug/system_profiler.cpp haiku/branches/developer/bonefish/signals/src/system/kernel/team.cpp haiku/branches/developer/bonefish/signals/src/system/kernel/thread.cpp haiku/branches/developer/bonefish/signals/src/system/kernel/vm/vm.cpp Log: * Made Team::name/args private, renamed them to fName/fArgs and added accessor methods. * Those members are now proteced by the team's lock instead of the global teams lock. Modified: haiku/branches/developer/bonefish/signals/headers/private/kernel/thread_types.h =================================================================== --- haiku/branches/developer/bonefish/signals/headers/private/kernel/thread_types.h 2011-05-02 13:39:22 UTC (rev 41302) +++ haiku/branches/developer/bonefish/signals/headers/private/kernel/thread_types.h 2011-05-02 15:31:32 UTC (rev 41303) @@ -244,8 +244,6 @@ pid_t group_id; pid_t session_id; struct process_group *group; - char name[B_OS_NAME_LENGTH]; - char args[64]; // contents for the team_info::args field int num_threads; // number of threads in this team int state; // current team state, see above int32 flags; @@ -303,13 +301,23 @@ void Unlock() { mutex_unlock(&fLock); } + const char* Name() const { return fName; } void SetName(const char* name); + const char* Args() const { return fArgs; } + void SetArgs(const char* args); + void SetArgs(const char* path, + const char* const* otherArgs, + int otherArgCount); + private: Team(bool kernel); private: mutex fLock; + char fName[B_OS_NAME_LENGTH]; + char fArgs[64]; + // contents for the team_info::args field }; Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/debug/system_profiler.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/debug/system_profiler.cpp 2011-05-02 13:39:22 UTC (rev 41302) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/debug/system_profiler.cpp 2011-05-02 15:31:32 UTC (rev 41303) @@ -817,9 +817,14 @@ bool SystemProfiler::_TeamAdded(Team* team) { - size_t nameLen = strlen(team->name); - size_t argsLen = strlen(team->args); + // TODO: We should lock the team here. Unfortunately that's problematic, + // since initially we are called with interrupts disabled and the global + // teams lock held. +// TeamLocker teamLocker(team); + size_t nameLen = strlen(team->Name()); + size_t argsLen = strlen(team->Args()); + InterruptsSpinLocker locker(fLock); system_profiler_team_added* event = (system_profiler_team_added*) @@ -830,9 +835,9 @@ return false; event->team = team->id; - strcpy(event->name, team->name); + strcpy(event->name, team->Name()); event->args_offset = nameLen + 1; - strcpy(event->name + nameLen + 1, team->args); + strcpy(event->name + nameLen + 1, team->Args()); fHeader->size = fBufferSize; @@ -862,8 +867,10 @@ bool SystemProfiler::_TeamExec(Team* team) { - size_t argsLen = strlen(team->args); + TeamLocker teamLocker(team); + size_t argsLen = strlen(team->Args()); + InterruptsSpinLocker locker(fLock); system_profiler_team_exec* event = (system_profiler_team_exec*) @@ -875,7 +882,7 @@ event->team = team->id; strlcpy(event->thread_name, team->main_thread->name, sizeof(event->thread_name)); - strcpy(event->args, team->args); + strcpy(event->args, team->Args()); fHeader->size = fBufferSize; Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/team.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/team.cpp 2011-05-02 13:39:22 UTC (rev 41302) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/team.cpp 2011-05-02 15:31:32 UTC (rev 41303) @@ -545,8 +545,8 @@ } next = siblings_next = children = parent = NULL; - name[0] = '\0'; - args[0] = '\0'; + fName[0] = '\0'; + fArgs[0] = '\0'; num_threads = 0; io_context = NULL; address_space = NULL; @@ -638,7 +638,8 @@ return NULL; ObjectDeleter<Team> teamDeleter(team); - team->SetName(name); + if (name != NULL) + team->SetName(name); // check initialization if (team->job_control_entry == NULL) @@ -680,10 +681,29 @@ if (const char* lastSlash = strrchr(name, '/')) name = lastSlash + 1; - strlcpy(this->name, name, B_OS_NAME_LENGTH); + strlcpy(fName, name, B_OS_NAME_LENGTH); } +void +Team::SetArgs(const char* args) +{ + strlcpy(fArgs, args, sizeof(fArgs)); +} + + +void +Team::SetArgs(const char* path, const char* const* otherArgs, int otherArgCount) +{ + fArgs[0] = '\0'; + strlcpy(fArgs, path, sizeof(fArgs)); + for (int i = 0; i < otherArgCount; i++) { + strlcat(fArgs, " ", sizeof(fArgs)); + strlcat(fArgs, otherArgs[i], sizeof(fArgs)); + } +} + + // #pragma mark - Private functions @@ -692,8 +712,8 @@ { kprintf("TEAM: %p\n", team); kprintf("id: %ld (%#lx)\n", team->id, team->id); - kprintf("name: '%s'\n", team->name); - kprintf("args: '%s'\n", team->args); + kprintf("name: '%s'\n", team->Name()); + kprintf("args: '%s'\n", team->Args()); kprintf("next: %p\n", team->next); kprintf("parent: %p", team->parent); if (team->parent != NULL) { @@ -743,7 +763,7 @@ // walk through the thread list, trying to match name or id for (TeamTable::Iterator it = sTeamHash.GetIterator(); Team* team = it.Next();) { - if ((team->name && strcmp(argv[1], team->name) == 0) + if ((team->Name() && strcmp(argv[1], team->Name()) == 0) || team->id == id) { _dump_team_info(team); found = true; @@ -764,7 +784,7 @@ for (TeamTable::Iterator it = sTeamHash.GetIterator(); Team* team = it.Next();) { - kprintf("%p%7ld %p %s\n", team, team->id, team->parent, team->name); + kprintf("%p%7ld %p %s\n", team, team->id, team->parent, team->Name()); } return 0; @@ -1204,7 +1224,7 @@ char** userArgs; char** userEnv; struct user_space_program_args* programArgs; - uint32 argCount, envCount, i; + uint32 argCount, envCount; thread = thread_get_current_thread(); team = thread->team; @@ -1240,7 +1260,7 @@ + USER_STACK_GUARD_PAGES * B_PAGE_SIZE; // the exact location at the end of the user stack area - sprintf(userStackName, "%s_main_stack", team->name); + sprintf(userStackName, "%s_main_stack", team->Name()); virtual_address_restrictions virtualRestrictions = {}; virtualRestrictions.address = (void*)thread->user_stack_base; virtualRestrictions.address_specification = B_EXACT_ADDRESS; @@ -1290,12 +1310,9 @@ TRACE(("team_create_thread_start: loading elf binary '%s'\n", path)); // add args to info member - team->args[0] = 0; - strlcpy(team->args, path, sizeof(team->args)); - for (i = 1; i < argCount; i++) { - strlcat(team->args, " ", sizeof(team->args)); - strlcat(team->args, teamArgs->flat_args[i], sizeof(team->args)); - } + team->Lock(); + team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1); + team->Unlock(); free_team_arg(teamArgs); // the arguments are already on the user stack, we no longer need @@ -1626,7 +1643,9 @@ // rename the team + team->Lock(); team->SetName(path); + team->Unlock(); // cut the path from the team name and rename the main thread, too threadName = strrchr(path, '/'); @@ -1720,11 +1739,14 @@ // TODO: this is very similar to load_image_internal() - maybe we can do // something about it :) - team = Team::Create(parentTeam->name, false); + team = Team::Create(NULL, false); if (team == NULL) return B_NO_MEMORY; - strlcpy(team->args, parentTeam->args, sizeof(team->args)); + parentTeam->Lock(); + team->SetName(parentTeam->Name()); + team->SetArgs(parentTeam->Args()); + parentTeam->Unlock(); // Inherit the parent's user/group. inherit_parent_user_and_group(team, parentTeam); @@ -2170,6 +2192,7 @@ info->image_count = count_images(team); // protected by sImageMutex + TeamLocker teamLocker(team); InterruptsSpinLocker locker(gTeamSpinlock); info->thread_count = team->num_threads; @@ -2179,7 +2202,7 @@ //info->uid = //info->gid = - strlcpy(info->args, team->args, sizeof(info->args)); + strlcpy(info->args, team->Args(), sizeof(info->args)); info->argc = 1; return B_OK; @@ -2271,7 +2294,7 @@ sKernelTeam = Team::Create("kernel_team", true); if (sKernelTeam == NULL) panic("could not create kernel team!\n"); - strcpy(sKernelTeam->args, sKernelTeam->name); + sKernelTeam->SetArgs(sKernelTeam->Name()); sKernelTeam->state = TEAM_STATE_NORMAL; sKernelTeam->saved_set_uid = 0; @@ -3938,7 +3961,7 @@ InterruptsSpinLocker _(gTeamSpinlock); teamClone->id = team->id; - strlcpy(teamClone->name, team->name, sizeof(teamClone->name)); + strlcpy(teamClone->name, team->Name(), sizeof(teamClone->name)); teamClone->group_id = team->group_id; teamClone->session_id = team->session_id; teamClone->real_uid = team->real_uid; Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/thread.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/thread.cpp 2011-05-02 13:39:22 UTC (rev 41302) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/thread.cpp 2011-05-02 15:31:32 UTC (rev 41303) @@ -1219,7 +1219,8 @@ kprintf("fault_handler: %p\n", (void *)thread->fault_handler); kprintf("args: %p %p\n", thread->args1, thread->args2); kprintf("entry: %p\n", (void *)thread->entry); - kprintf("team: %p, \"%s\"\n", thread->team, thread->team->name); + kprintf("team: %p, \"%s\"\n", thread->team, + thread->team->Name()); kprintf(" exit.sem: %ld\n", thread->exit.sem); kprintf(" exit.status: %#lx (%s)\n", thread->exit.status, strerror(thread->exit.status)); kprintf(" exit.reason: %#x\n", thread->exit.reason); Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/vm/vm.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/vm/vm.cpp 2011-05-02 13:39:22 UTC (rev 41302) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/vm/vm.cpp 2011-05-02 15:31:32 UTC (rev 41303) @@ -3930,9 +3930,9 @@ Thread* thread = thread_get_current_thread(); dprintf("vm_page_fault: thread \"%s\" (%ld) in team \"%s\" (%ld) " "tried to %s address %#lx, ip %#lx (\"%s\" +%#lx)\n", - thread->name, thread->id, thread->team->name, thread->team->id, - isWrite ? "write" : "read", address, faultAddress, - area ? area->name : "???", + thread->name, thread->id, thread->team->Name(), + thread->team->id, isWrite ? "write" : "read", address, + faultAddress, area ? area->name : "???", faultAddress - (area ? area->Base() : 0x0)); // We can print a stack trace of the userland thread here.