Cleanup: multiplex debug and system watch messages across a single port.

Simplify accordingly.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39875 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rene Gollent
2010-12-17 02:42:39 +00:00
parent b6ec842de4
commit 11e3001c3f
2 changed files with 67 additions and 114 deletions
@@ -231,7 +231,6 @@ DebuggerInterface::DebuggerInterface(team_id teamID)
fTeamID(teamID), fTeamID(teamID),
fDebuggerPort(-1), fDebuggerPort(-1),
fNubPort(-1), fNubPort(-1),
fSystemWatchPort(-1),
fDebugContextPool(NULL), fDebugContextPool(NULL),
fArchitecture(NULL) fArchitecture(NULL)
{ {
@@ -277,13 +276,8 @@ DebuggerInterface::Init()
if (fNubPort < 0) if (fNubPort < 0)
return fNubPort; return fNubPort;
snprintf(buffer, sizeof(buffer), "team %ld debug system watcher", fTeamID);
fSystemWatchPort = create_port(100, buffer);
if (fSystemWatchPort < 0)
return fSystemWatchPort;
error = start_watching_system(fTeamID, B_WATCH_SYSTEM_THREAD_PROPERTIES, error = start_watching_system(fTeamID, B_WATCH_SYSTEM_THREAD_PROPERTIES,
fSystemWatchPort, 0); fDebuggerPort, 0);
if (error != B_OK) if (error != B_OK)
return error; return error;
// TODO: Stop watching in Close()! // TODO: Stop watching in Close()!
@@ -311,9 +305,6 @@ DebuggerInterface::Close(bool killTeam)
if (fDebuggerPort >= 0) if (fDebuggerPort >= 0)
delete_port(fDebuggerPort); delete_port(fDebuggerPort);
if (fSystemWatchPort >= 0)
delete_port(fSystemWatchPort);
} }
@@ -321,15 +312,10 @@ status_t
DebuggerInterface::GetNextDebugEvent(DebugEvent*& _event) DebuggerInterface::GetNextDebugEvent(DebugEvent*& _event)
{ {
while (true) { while (true) {
object_wait_info infos[2]; char buffer[1024];
infos[0].object = fDebuggerPort; int32 messageCode;
infos[0].type = B_OBJECT_TYPE_PORT; ssize_t size = read_port(fDebuggerPort, &messageCode, buffer,
infos[0].events = B_EVENT_READ; sizeof(buffer));
infos[1].object = fSystemWatchPort;
infos[1].type = B_OBJECT_TYPE_PORT;
infos[1].events = B_EVENT_READ;
ssize_t size = wait_for_objects(infos, 2);
if (size < 0) { if (size < 0) {
if (size == B_INTERRUPTED) if (size == B_INTERRUPTED)
continue; continue;
@@ -337,14 +323,33 @@ DebuggerInterface::GetNextDebugEvent(DebugEvent*& _event)
return size; return size;
} }
if (infos[0].events & B_EVENT_INVALID if (messageCode <= B_DEBUGGER_MESSAGE_HANDED_OVER) {
|| infos[1].events & B_EVENT_INVALID) debug_debugger_message_data message;
return B_BAD_PORT_ID; memcpy(&message, buffer, size);
if (message.origin.team != fTeamID)
continue;
if (infos[0].events & B_EVENT_READ) bool ignore = false;
return _GetNextDebuggerEvent(_event); status_t error = _CreateDebugEvent(messageCode, message, ignore,
else if (infos[1].events & B_EVENT_READ) _event);
return _GetNextSystemWatchEvent(_event); if (error != B_OK)
return error;
if (ignore) {
if (message.origin.thread >= 0 && message.origin.nub_port >= 0)
continue_thread(message.origin.nub_port,
message.origin.thread);
continue;
}
return B_OK;
}
KMessage message;
size = message.SetTo(buffer);
if (size != B_OK)
return size;
return _GetNextSystemWatchEvent(_event, message);
} }
return B_OK; return B_OK;
@@ -741,62 +746,10 @@ DebuggerInterface::_CreateDebugEvent(int32 messageCode,
status_t status_t
DebuggerInterface::_GetNextDebuggerEvent(DebugEvent*& _event) DebuggerInterface::_GetNextSystemWatchEvent(DebugEvent*& _event,
KMessage& message)
{ {
while (true) { status_t error = B_OK;
debug_debugger_message_data message;
int32 messageCode;
ssize_t size = read_port(fDebuggerPort, &messageCode, &message,
sizeof(message));
if (size < 0) {
if (size == B_INTERRUPTED)
continue;
return size;
}
if (message.origin.team != fTeamID)
continue;
bool ignore = false;
status_t error = _CreateDebugEvent(messageCode, message, ignore,
_event);
if (error != B_OK)
return error;
if (ignore) {
if (message.origin.thread >= 0 && message.origin.nub_port >= 0)
continue_thread(message.origin.nub_port, message.origin.thread);
continue;
}
return B_OK;
}
return B_OK;
}
status_t
DebuggerInterface::_GetNextSystemWatchEvent(DebugEvent*& _event)
{
while (true) {
char buffer[1024];
int32 messageCode;
ssize_t bytesRead = read_port(fSystemWatchPort, &messageCode,
buffer, sizeof(buffer));
if (bytesRead < 0) {
if (bytesRead == B_INTERRUPTED)
continue;
return bytesRead;
}
KMessage message;
status_t error = message.SetTo((const void *)buffer, bytesRead);
if (error != B_OK)
return error;
if (message.What() != B_SYSTEM_OBJECT_UPDATE) if (message.What() != B_SYSTEM_OBJECT_UPDATE)
return B_BAD_DATA; return B_BAD_DATA;
@@ -835,6 +788,3 @@ DebuggerInterface::_GetNextSystemWatchEvent(DebugEvent*& _event)
return error; return error;
} }
return B_OK;
}
@@ -21,6 +21,10 @@ class ImageInfo;
class SymbolInfo; class SymbolInfo;
class ThreadInfo; class ThreadInfo;
namespace BPrivate {
class KMessage;
}
class DebuggerInterface : public TeamMemory { class DebuggerInterface : public TeamMemory {
public: public:
@@ -74,14 +78,13 @@ private:
const debug_debugger_message_data& message, const debug_debugger_message_data& message,
bool& _ignore, DebugEvent*& _event); bool& _ignore, DebugEvent*& _event);
status_t _GetNextDebuggerEvent(DebugEvent*& _event); status_t _GetNextSystemWatchEvent(DebugEvent*& _event,
status_t _GetNextSystemWatchEvent(DebugEvent*& _event); BPrivate::KMessage& message);
private: private:
team_id fTeamID; team_id fTeamID;
port_id fDebuggerPort; port_id fDebuggerPort;
port_id fNubPort; port_id fNubPort;
port_id fSystemWatchPort;
DebugContextPool* fDebugContextPool; DebugContextPool* fDebugContextPool;
Architecture* fArchitecture; Architecture* fArchitecture;
}; };