meso: impl AddServerSession

This commit is contained in:
TuxSH 2018-11-12 15:48:03 +01:00 committed by Michael Scire
parent 173bde2eca
commit efe7325af3
5 changed files with 40 additions and 3 deletions

View file

@ -27,6 +27,7 @@ class KClientPort final :
private:
friend class KPort;
std::atomic<int> numSessions{0}, currentCapacity{0}, maxSessions{0};
};
MESOSPHERE_AUTO_OBJECT_DEFINE_INCREF(ClientPort);

View file

@ -6,6 +6,7 @@
#include <mesosphere/interfaces/ISetAllocated.hpp>
#include <mesosphere/processes/KClientPort.hpp>
#include <mesosphere/processes/KServerPort.hpp>
#include <mesosphere/processes/KLightServerSession.hpp>
namespace mesosphere
{
@ -20,12 +21,14 @@ class KPort final :
virtual ~KPort();
Result Initialize();
Result Initialize(int maxSessions, bool isLight);
private:
friend class KClientPort;
friend class KServerPort;
Result AddServerSession(KLightServerSession &lightServerSession);
bool isClientAlive = false;
bool isServerAlive = false;
bool isLight = false;

View file

@ -23,7 +23,9 @@ class KServerPort final :
private:
friend class KPort;
Result AddServerSession(KLightServerSession &lightServerSession);
KLightServerSession::List lightServerSessions{};
};
MESOSPHERE_AUTO_OBJECT_DEFINE_INCREF(ServerPort);

View file

@ -1,5 +1,6 @@
#include <mesosphere/processes/KPort.hpp>
#include <mesosphere/core/KCoreContext.hpp>
#include <mesosphere/threading/KScopedCriticalSection.hpp>
namespace mesosphere
{
@ -8,13 +9,27 @@ KPort::~KPort()
{
}
Result KPort::Initialize()
Result KPort::Initialize(int maxSessions, bool isLight)
{
SetClientServerParent();
isClientAlive = true;
isServerAlive = true;
client.maxSessions = maxSessions;
this->isLight = isLight;
return ResultSuccess();
}
Result KPort::AddServerSession(KLightServerSession &lightServerSession)
{
KScopedCriticalSection critsec{};
if (isClientAlive || isServerAlive) {
return ResultKernelConnectionRefused();
} else {
return server.AddServerSession(lightServerSession);
}
}
}

View file

@ -14,7 +14,23 @@ KServerPort::~KServerPort()
bool KServerPort::IsSignaled() const
{
if (!parent->isLight) {
return false; // TODO
} else {
return !lightServerSessions.empty();
}
}
Result KServerPort::AddServerSession(KLightServerSession &lightServerSession)
{
KScopedCriticalSection critsec{};
bool wasEmpty = lightServerSessions.empty();
lightServerSessions.push_back(lightServerSession);
if (wasEmpty && !lightServerSessions.empty()) {
NotifyWaiters();
}
return ResultSuccess();
}
}