diff --git a/headers/os/kernel/debugger.h b/headers/os/kernel/debugger.h index 87b455496e..00b3d238e1 100644 --- a/headers/os/kernel/debugger.h +++ b/headers/os/kernel/debugger.h @@ -561,6 +561,7 @@ typedef struct { debug_origin origin; // thread is < 0, team is the deleted team // (asynchronous message) status_t status; // the exit code of the team + int signal; // the signal causing the exit, < 0 if none team_usage_info usage; // the usage info of the team } debug_team_deleted; diff --git a/headers/private/kernel/user_debugger.h b/headers/private/kernel/user_debugger.h index 8fbf5d91b4..49f33edce2 100644 --- a/headers/private/kernel/user_debugger.h +++ b/headers/private/kernel/user_debugger.h @@ -259,7 +259,7 @@ bool user_debug_handle_signal(int signal, struct sigaction *handler, void user_debug_stop_thread(); void user_debug_team_created(team_id teamID); void user_debug_team_deleted(team_id teamID, port_id debuggerPort, status_t status, - team_usage_info* usageInfo); + int signal, team_usage_info* usageInfo); void user_debug_team_exec(); void user_debug_update_new_thread_flags(Thread* thread); void user_debug_thread_created(thread_id threadID); diff --git a/src/system/kernel/debug/user_debugger.cpp b/src/system/kernel/debug/user_debugger.cpp index 91003ef5f0..4e318a734d 100644 --- a/src/system/kernel/debug/user_debugger.cpp +++ b/src/system/kernel/debug/user_debugger.cpp @@ -1000,7 +1000,7 @@ user_debug_team_created(team_id teamID) void -user_debug_team_deleted(team_id teamID, port_id debuggerPort, status_t status, +user_debug_team_deleted(team_id teamID, port_id debuggerPort, status_t status, int signal, team_usage_info* usageInfo) { if (debuggerPort >= 0) { @@ -1012,6 +1012,7 @@ user_debug_team_deleted(team_id teamID, port_id debuggerPort, status_t status, message.origin.team = teamID; message.origin.nub_port = -1; message.status = status; + message.signal = signal; message.usage = *usageInfo; write_port_etc(debuggerPort, B_DEBUGGER_MESSAGE_TEAM_DELETED, &message, sizeof(message), B_RELATIVE_TIMEOUT, 0); diff --git a/src/system/kernel/signal.cpp b/src/system/kernel/signal.cpp index 917dc75571..db85792fa9 100644 --- a/src/system/kernel/signal.cpp +++ b/src/system/kernel/signal.cpp @@ -1654,7 +1654,7 @@ send_signal_to_team_locked(Team* team, uint32 signalNumber, Signal* signal, // (only the main thread shuts down the team). Thread* mainThread = team->main_thread; if (mainThread != NULL) { - mainThread->AddPendingSignal(SIGKILLTHR); + mainThread->AddPendingSignal(signalNumber); // wake up main thread mainThread->going_to_suspend = false; diff --git a/src/system/kernel/team.cpp b/src/system/kernel/team.cpp index 2740a9c3b5..3b2cd0a7dd 100644 --- a/src/system/kernel/team.cpp +++ b/src/system/kernel/team.cpp @@ -3345,7 +3345,17 @@ team_delete_team(Team* team, port_id debuggerPort) } // get team exit information - status_t exitStatus = team->exit.status; + status_t exitStatus = -1; + int signal = -1; + + switch (team->exit.reason) { + case CLD_EXITED: + exitStatus = team->exit.status; + break; + case CLD_KILLED: + signal = team->exit.signal; + break; + } teamLocker.Unlock(); @@ -3371,7 +3381,7 @@ team_delete_team(Team* team, port_id debuggerPort) team->ReleaseReference(); // notify the debugger, that the team is gone - user_debug_team_deleted(teamID, debuggerPort, exitStatus, &usageInfo); + user_debug_team_deleted(teamID, debuggerPort, exitStatus, signal, &usageInfo); }