Also trace set_job_control_entry() and wait_for_child().

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23597 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2008-01-18 00:01:32 +00:00
parent bd0689e668
commit 21e73322d8
+119 -2
View File
@@ -168,6 +168,113 @@ class ExecTeam : public AbstractTraceEntry {
char* fArgs;
};
static const char*
job_control_state_name(job_control_state state)
{
switch (state) {
case JOB_CONTROL_STATE_NONE:
return "none";
case JOB_CONTROL_STATE_STOPPED:
return "stopped";
case JOB_CONTROL_STATE_CONTINUED:
return "continued";
case JOB_CONTROL_STATE_DEAD:
return "dead";
default:
return "invalid";
}
}
class SetJobControlState : public AbstractTraceEntry {
public:
SetJobControlState(team_id team, job_control_state newState, int signal)
:
fTeam(team),
fNewState(newState),
fSignal(signal)
{
Initialized();
}
virtual void AddDump(char *buffer, size_t size)
{
snprintf(buffer, size, "team set job control state, team %ld, "
"new state: %s, signal: %d",
fTeam, job_control_state_name(fNewState), fSignal);
}
private:
team_id fTeam;
job_control_state fNewState;
int fSignal;
};
class WaitForChild : public AbstractTraceEntry {
public:
WaitForChild(pid_t child, uint32 flags)
:
fChild(child),
fFlags(flags)
{
Initialized();
}
virtual void AddDump(char *buffer, size_t size)
{
snprintf(buffer, size, "team wait for child, child: %ld, "
"flags: 0x%lx", fChild, fFlags);
}
private:
pid_t fChild;
uint32 fFlags;
};
class WaitForChildDone : public AbstractTraceEntry {
public:
WaitForChildDone(const job_control_entry& entry)
:
fState(entry.state),
fTeam(entry.thread),
fStatus(entry.status),
fReason(entry.reason),
fSignal(entry.signal)
{
Initialized();
}
WaitForChildDone(status_t error)
:
fTeam(error)
{
Initialized();
}
virtual void AddDump(char *buffer, size_t size)
{
if (fTeam >= 0) {
snprintf(buffer, size, "team wait for child done, team: %ld, "
"state: %s, status: 0x%lx, reason: 0x%x, signal: %d\n",
fTeam, job_control_state_name(fState), fStatus, fReason,
fSignal);
} else {
snprintf(buffer, size, "team wait for child failed, error: "
"0x%lx, ", fTeam);
}
}
private:
job_control_state fState;
team_id fTeam;
status_t fStatus;
uint16 fReason;
uint16 fSignal;
};
} // namespace TeamTracing
# define T(x) new(std::nothrow) TeamTracing::x;
@@ -1461,6 +1568,8 @@ wait_for_child(pid_t child, uint32 flags, int32 *_reason,
TRACE(("wait_for_child(child = %ld, flags = %ld)\n", child, flags));
T(WaitForChild(child, flags));
if (child == 0) {
// wait for all children in the process group of the calling team
child = -team->group_id;
@@ -1544,12 +1653,16 @@ wait_for_child(pid_t child, uint32 flags, int32 *_reason,
break;
}
if (status != B_WOULD_BLOCK || (flags & WNOHANG) != 0)
if (status != B_WOULD_BLOCK || (flags & WNOHANG) != 0) {
T(WaitForChildDone(status));
return status;
}
status = deadWaitEntry.Wait(B_CAN_INTERRUPT);
if (status == B_INTERRUPTED)
if (status == B_INTERRUPTED) {
T(WaitForChildDone(status));
return status;
}
// If SA_NOCLDWAIT is set or SIGCHLD is ignored, we shall wait until
// all our children are dead and fail with ECHILD. We check the
@@ -1597,6 +1710,8 @@ wait_for_child(pid_t child, uint32 flags, int32 *_reason,
atomic_and(&thread->sig_pending, ~SIGNAL_TO_MASK(SIGCHLD));
}
T(WaitForChildDone(foundEntry));
return foundEntry.thread;
}
@@ -2168,6 +2283,8 @@ team_set_job_control_state(struct team* team, job_control_state newState,
if (entry->state == newState || entry->state == JOB_CONTROL_STATE_DEAD)
return;
T(SetJobControlState(team->id, newState, signal));
// remove from the old list
switch (entry->state) {
case JOB_CONTROL_STATE_NONE: