[haiku-commits] r41303 - in haiku/branches/developer/bonefish/signals: headers/private/kernel src/system/kernel src/system/kernel/debug src/system/kernel/vm

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 2 May 2011 17:31:33 +0200 (CEST)

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.


Other related posts:

  • » [haiku-commits] r41303 - in haiku/branches/developer/bonefish/signals: headers/private/kernel src/system/kernel src/system/kernel/debug src/system/kernel/vm - ingo_weinhold