static const ClassName name = KPort_Class;
- KClientPort m_Client;
- KServerPort m_Server;
+ KClientPort *m_Client;
+ KServerPort *m_Server;
char m_Name[9]; //this is not like on the 3DS but we use it like that for debugging
private:
};
static const ClassName name = KSession_Class;
- KServerSession m_Server;
- KClientSession m_Client;
+ KServerSession *m_Server;
+ KClientSession *m_Client;
KPort * m_owner; //this is for debugging
KLinkedList<u32> m_openMemAddr;
KLinkedList<u32> m_openMemSize;
if ( m_maxConnection > m_CurrentConnection)
{
//free the server so he can accept the connection
- KThread* found = m_owner->m_Server.SynGetNextPrio();
+ KThread* found = m_owner->m_Server->SynGetNextPrio();
if (found)
{
- m_owner->m_Server.SynFree(0, found);
+ m_owner->m_Server->SynFree(0, found);
}
KSession* sesi = new KSession(m_owner);
- m_owner->m_Server.m_sessionToTake.AddItem(sesi);
- sesion = &sesi->m_Client;
+ m_owner->m_Server->m_sessionToTake.AddItem(sesi);
+ sesion = sesi->m_Client;
return Success;
}
else
//tools
void KClientSession::Destroy() {
- m_owner->m_Server.SynFreeAll(0xC920181A);
- m_owner->m_Server.m_killed = true;
+ m_owner->m_Server->SynFreeAll(0xC920181A);
+ m_owner->m_Server->m_killed = true;
}
bool KClientSession::Synchronization(KThread* thread, u32 &error)
{
- KThread * tnew = m_owner->m_Server.SynGetNextPrio();
- if (tnew && !m_owner->m_Server.m_processingCmd)
+ KThread * tnew = m_owner->m_Server->SynGetNextPrio();
+ if (tnew && !m_owner->m_Server->m_processingCmd)
{
- m_owner->m_Server.m_waitingForCmdResp = thread;
- m_owner->m_Server.m_processingCmd = tnew;
+ m_owner->m_Server->m_waitingForCmdResp = thread;
+ m_owner->m_Server->m_processingCmd = tnew;
m_owner->Communicate(thread,tnew , false);
- m_owner->m_Server.SynFree(0, tnew);
+ m_owner->m_Server->SynFree(0, tnew);
}
return true; //stall
}
//tools
-KPort::KPort(char* name, u32 maxconnection) : m_Client(name, maxconnection, this), m_Server(name, maxconnection, this)
+KPort::KPort(char* name, u32 maxconnection) : m_Client(new KClientPort(name, maxconnection, this)), m_Server(new KServerPort(name, maxconnection, this))
{
strncpy(m_Name, name, 8);
+ m_Client->AcquireReference();
+ m_Server->AcquireReference();
}
KPort::~KPort()
{
-
+ m_Client->ReleaseReference();
+ m_Server->ReleaseReference();
}
bool KPort::IsInstanceOf(ClassName name) {
m_sessionToTake.RemoveItem(m_sessionToTake.list);
if (s == NULL)
return NULL;
- return &s->m_Server;
+ return s->m_Server;
}
bool KServerPort::IsInstanceOf(ClassName name) {
}
bool KServerSession::Synchronization(KThread* thread, u32 &error)
{
- KThread * tnew = m_owner->m_Client.SynGetNextPrio();
- if (tnew && !m_owner->m_Server.m_waitingForCmdResp)
+ KThread * tnew = m_owner->m_Client->SynGetNextPrio();
+ if (tnew && !m_owner->m_Server->m_waitingForCmdResp)
{
- m_owner->m_Server.m_waitingForCmdResp = tnew;
- m_owner->m_Server.m_processingCmd = thread;
+ m_owner->m_Server->m_waitingForCmdResp = tnew;
+ m_owner->m_Server->m_processingCmd = thread;
m_owner->Communicate(tnew, thread, false);
return false;
}
m_owner->Communicate(sender, m_waitingForCmdResp,true);
- m_owner->m_Client.SynFree(0, m_waitingForCmdResp);
+ m_owner->m_Client->SynFree(0, m_waitingForCmdResp);
m_processingCmd = NULL;
m_waitingForCmdResp = NULL;
//tools
-KSession::KSession(KPort * owner) : m_Server(this), m_Client(this)
+KSession::KSession(KPort * owner) : m_Server(new KServerSession(this)), m_Client(new KClientSession(this))
{
m_owner = owner;
+ m_Client->AcquireReference();
+ m_Server->AcquireReference();
}
KSession::~KSession()
{
-
+ m_Client->ReleaseReference();
+ m_Server->ReleaseReference();
}
bool KSession::IsInstanceOf(ClassName name) {
if (name == KSession::name)
//found it
KClientSession* ses;
u32 hand;
- if (temp->data->m_Client.connect(ses) == Success)
+ if (temp->data->m_Client->connect(ses) == Success)
{
s32 ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand, ses);
if (ret != Success)
currentThread->m_owner->m_Kernel->m_Portlist.AddItem(port);
u32 hand1 = 0;
- s32 ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand1, &port->m_Server);
+ s32 ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand1, port->m_Server);
if (ret != Success)
{
Reg[0] = SVCERROR_CREATE_HANLE;
return;
}
u32 hand2 = 0;
- ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand2, &port->m_Client);
+ ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand2, port->m_Client);
if (ret != Success)
{
Reg[0] = SVCERROR_CREATE_HANLE;
KSession* sesi = new KSession();
u32 hand1,hand2;
- s32 ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand1, &sesi->m_Server);
+ s32 ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand1, sesi->m_Server);
if (ret != Success)
{
Reg[0] = SVCERROR_CREATE_HANLE;
#endif
return;
}
- ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand2, &sesi->m_Client);
+ ret = currentThread->m_owner->GetHandleTable()->CreateHandle(hand2, sesi->m_Client);
if (ret != Success)
{
Reg[0] = SVCERROR_CREATE_HANLE;