From b13b0b0f4ef555bcf4467f76c069ad910d968cd4 Mon Sep 17 00:00:00 2001 From: "Ithamar R. Adema" Date: Sun, 11 Apr 2010 14:26:19 +0000 Subject: [PATCH] * Make sure LinkSender knows team ID of receiving team; this fixes the >64k ServerLink transfers. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36154 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/LinkSender.h | 17 +++++++++++++++++ headers/private/app/ServerLink.h | 17 +++++++++++++++++ src/kits/app/Application.cpp | 4 +++- src/servers/app/ServerApp.cpp | 6 ++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/headers/private/app/LinkSender.h b/headers/private/app/LinkSender.h index 6a08afadae..0090a473c0 100644 --- a/headers/private/app/LinkSender.h +++ b/headers/private/app/LinkSender.h @@ -24,6 +24,9 @@ class LinkSender { void SetPort(port_id port); port_id Port() const { return fPort; } + team_id TargetTeam() const; + void SetTargetTeam(team_id team); + status_t StartMessage(int32 code, size_t minSize = 0); void CancelMessage(void); status_t EndMessage(bool needsReply = false); @@ -56,6 +59,20 @@ class LinkSender { status_t fCurrentStatus; }; + +inline team_id +LinkSender::TargetTeam() const +{ + return fTargetTeam; +} + + +inline void +LinkSender::SetTargetTeam(team_id team) +{ + fTargetTeam = team; +} + } // namespace BPrivate #endif /* _LINK_SENDER_H */ diff --git a/headers/private/app/ServerLink.h b/headers/private/app/ServerLink.h index 4b1e73da10..7a5d12285a 100644 --- a/headers/private/app/ServerLink.h +++ b/headers/private/app/ServerLink.h @@ -43,6 +43,9 @@ public: void SetSenderPort(port_id port); port_id SenderPort(); + void SetTargetTeam(team_id team); + team_id TargetTeam(); + status_t StartMessage(int32 code, size_t minSize = 0); void CancelMessage(); status_t EndMessage(); @@ -109,6 +112,20 @@ ServerLink::SenderPort() } +inline void +ServerLink::SetTargetTeam(team_id team) +{ + fSender->SetTargetTeam(team); +} + + +inline team_id +ServerLink::TargetTeam() +{ + return fSender->TargetTeam(); +} + + inline status_t ServerLink::StartMessage(int32 code, size_t minSize) { diff --git a/src/kits/app/Application.cpp b/src/kits/app/Application.cpp index eaeea80cad..dc40511c97 100644 --- a/src/kits/app/Application.cpp +++ b/src/kits/app/Application.cpp @@ -1250,6 +1250,7 @@ BApplication::_ConnectToServer() fServerLink->AttachString(fAppName); area_id sharedReadOnlyArea; + team_id serverTeam; port_id serverPort; int32 code; @@ -1259,12 +1260,13 @@ BApplication::_ConnectToServer() // directly; we now talk to our server alter ego only. fServerLink->Read(&serverPort); fServerLink->Read(&sharedReadOnlyArea); + fServerLink->Read(&serverTeam); } else { fServerLink->SetSenderPort(-1); debugger("BApplication: couldn't obtain new app_server comm port"); return B_ERROR; } - + fServerLink->SetTargetTeam(serverTeam); fServerLink->SetSenderPort(serverPort); status = _SetupServerAllocator(); diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 1df4034a25..4323db28d8 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -116,6 +116,7 @@ ServerApp::ServerApp(Desktop* desktop, port_id clientReplyPort, fLink.SetSenderPort(fClientReplyPort); fLink.SetReceiverPort(fMessagePort); + fLink.SetTargetTeam(clientTeam); // we let the application own the port, so that we get aware when it's gone if (set_port_owner(fMessagePort, clientTeam) < B_OK) { @@ -2993,10 +2994,15 @@ ServerApp::_MessageLooper() { // Message-dispatching loop for the ServerApp + // get our own team ID + thread_info threadInfo; + get_thread_info(fThread, &threadInfo); + // First let's tell the client how to talk with us. fLink.StartMessage(B_OK); fLink.Attach(fMessagePort); fLink.Attach(fDesktop->SharedReadOnlyArea()); + fLink.Attach(threadInfo.team); fLink.Flush(); BPrivate::LinkReceiver &receiver = fLink.Receiver();