Skip to content

Commit

Permalink
Correct thread code
Browse files Browse the repository at this point in the history
git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1232 0c269be4-1314-0410-8aa9-9f06e86f4224
  • Loading branch information
sletz committed Sep 8, 2006
1 parent 00a8d52 commit 308d46a
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 146 deletions.
2 changes: 1 addition & 1 deletion common/JackConstants.h
Expand Up @@ -19,7 +19,7 @@

#define PRINTDEBUG

#define VERSION "0.58"
#define VERSION "0.59"

#define FORK_SERVER 1

Expand Down
14 changes: 9 additions & 5 deletions common/JackPosixThread.cpp
Expand Up @@ -43,10 +43,12 @@ void* JackPosixThread::ThreadHandler(void* arg)

JackLog("ThreadHandler: start\n");

// If Init succeed, start the thread loop
while ((obj->fRunning = runnable->Execute())) {
//pthread_testcancel();
}
// If Init succeed, start the thread loop
bool res = true;
while (obj->fRunning && res) {
res = runnable->Execute();
//pthread_testcancel();
}

JackLog("ThreadHandler: exit\n");
return 0;
Expand Down Expand Up @@ -132,8 +134,9 @@ int JackPosixThread::Kill()
JackLog("JackPosixThread::Kill\n");
void* status;
pthread_cancel(fThread);
pthread_join(fThread, &status);
pthread_join(fThread, &status);
fRunning = false;
fThread = (pthread_t)NULL;
return 0;
} else {
return -1;
Expand All @@ -147,6 +150,7 @@ int JackPosixThread::Stop()
void* status;
fRunning = false; // Request for the thread to stop
pthread_join(fThread, &status);
fThread = (pthread_t)NULL;
return 0;
} else {
return -1;
Expand Down
7 changes: 1 addition & 6 deletions common/JackThread.h
Expand Up @@ -89,12 +89,7 @@ class JackThread
virtual void SetParams(UInt64 period, UInt64 computation, UInt64 constraint) // Empty implementation, will only make sense on OSX...
{}

virtual pthread_t GetThreadID() = 0;

bool IsRunning()
{
return fRunning;
}
virtual pthread_t GetThreadID() = 0;
};

} // end of namespace
Expand Down
23 changes: 0 additions & 23 deletions macosx/Jackdmp.xcodeproj/project.pbxproj
Expand Up @@ -259,23 +259,6 @@
4BFA99AA0AAAF40C009E916C /* jdelay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BFA99A90AAAF40C009E916C /* jdelay.cpp */; };
/* End PBXBuildFile section */

/* Begin PBXBuildStyle section */
4BEC9CDB0AAEA43A0088025A /* Development */ = {
isa = PBXBuildStyle;
buildSettings = {
COPY_PHASE_STRIP = NO;
};
name = Development;
};
4BEC9CDC0AAEA43A0088025A /* Deployment */ = {
isa = PBXBuildStyle;
buildSettings = {
COPY_PHASE_STRIP = YES;
};
name = Deployment;
};
/* End PBXBuildStyle section */

/* Begin PBXContainerItemProxy section */
4B699DB3097D421700A18468 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
Expand Down Expand Up @@ -1742,12 +1725,6 @@
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 4B699DD5097D427F00A18468 /* Build configuration list for PBXProject "Jackdmp" */;
buildSettings = {
};
buildStyles = (
4BEC9CDB0AAEA43A0088025A /* Development */,
4BEC9CDC0AAEA43A0088025A /* Deployment */,
);
hasScannedForEncodings = 1;
mainGroup = 08FB7794FE84155DC02AAC07 /* JackServer */;
projectDirPath = "";
Expand Down
102 changes: 51 additions & 51 deletions windows/JackWinNamedPipeServerChannel.cpp
Expand Up @@ -53,7 +53,7 @@ int JackClientPipeThread::Open(JackServer* server) // Open the Server/Client con
fServer = server;

// Start listening
if (fThread->Start() != 0){
if (fThread->Start() != 0) {
jack_error("Cannot start Jack server listener\n");
return -1;
} else {
Expand All @@ -63,30 +63,32 @@ int JackClientPipeThread::Open(JackServer* server) // Open the Server/Client con

void JackClientPipeThread::Close() // Close the Server/Client connection
{
fThread->Kill();
fThread->Kill();
fPipe->Close();
fRefNum = -1;
}

bool JackClientPipeThread::Execute()
{
JackLog("JackClientPipeThread::Execute\n");
return (HandleRequest() == 0);

bool JackClientPipeThread::Execute()
{
JackLog("JackClientPipeThread::Execute\n");
return (HandleRequest() == 0);
}

int JackClientPipeThread::HandleRequest()
{
// Read header
JackRequest header;
int res = header.Read(fPipe);
int ret = 0;
JackRequest header;
int res = header.Read(fPipe);
int ret = 0;

// Lock the global mutex
if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED)
jack_error("JackClientPipeThread::HandleRequest: mutex wait error");

if (res < 0) {
jack_error("HandleRequest: cannot read header");
KillClient();
ret = -1;
jack_error("JackClientPipeThread::HandleRequest: mutex wait error");

if (res < 0) {
jack_error("HandleRequest: cannot read header");
KillClient();
ret = -1;
} else {

// Read data
Expand All @@ -97,77 +99,77 @@ int JackClientPipeThread::HandleRequest()
JackClientNewRequest req;
JackClientNewResult res;
if (req.Read(fPipe) == 0)
AddClient(req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult);
AddClient(req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult);
res.Write(fPipe);
break;
}

case JackRequest::kClientClose: {
JackLog("JackRequest::ClientClose\n");
JackClientCloseRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum);
res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum);
res.Write(fPipe);
RemoveClient(req.fRefNum);
RemoveClient();
break;
}

case JackRequest::kActivateClient: {
JackActivateRequest req;
JackResult res;
JackLog("JackRequest::ActivateClient\n");
JackLog("JackRequest::ActivateClient\n");
if (req.Read(fPipe) == 0)
res.fResult = fServer->Activate(req.fRefNum);
res.fResult = fServer->Activate(req.fRefNum);
res.Write(fPipe);
break;
}

case JackRequest::kDeactivateClient: {
JackLog("JackRequest::DeactivateClient\n");
JackDeactivateRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->Deactivate(req.fRefNum);
res.fResult = fServer->Deactivate(req.fRefNum);
res.Write(fPipe);
break;
}

case JackRequest::kRegisterPort: {
JackLog("JackRequest::RegisterPort\n");
JackPortRegisterRequest req;
JackPortRegisterResult res;
JackPortRegisterResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex);
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex);
res.Write(fPipe);
break;
}

case JackRequest::kUnRegisterPort: {
JackLog("JackRequest::UnRegisterPort\n");
JackPortUnRegisterRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex);

res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex);

res.Write(fPipe);
break;
}

case JackRequest::kConnectNamePorts: {
JackLog("JackRequest::ConnectPorts\n");
JackPortConnectNameRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
res.Write(fPipe);
break;
}

case JackRequest::kDisconnectNamePorts: {
JackLog("JackRequest::DisconnectPorts\n");
JackPortDisconnectNameRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
res.Write(fPipe);
Expand All @@ -177,7 +179,7 @@ int JackClientPipeThread::HandleRequest()
case JackRequest::kConnectPorts: {
JackLog("JackRequest::ConnectPorts\n");
JackPortConnectRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
res.Write(fPipe);
Expand All @@ -187,7 +189,7 @@ int JackClientPipeThread::HandleRequest()
case JackRequest::kDisconnectPorts: {
JackLog("JackRequest::DisconnectPorts\n");
JackPortDisconnectRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
res.Write(fPipe);
Expand All @@ -197,7 +199,7 @@ int JackClientPipeThread::HandleRequest()
case JackRequest::kSetBufferSize: {
JackLog("JackRequest::SetBufferSize\n");
JackSetBufferSizeRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->SetBufferSize(req.fBufferSize);
res.Write(fPipe);
Expand All @@ -207,7 +209,7 @@ int JackClientPipeThread::HandleRequest()
case JackRequest::kSetFreeWheel: {
JackLog("JackRequest::SetFreeWheel\n");
JackSetFreeWheelRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->SetFreewheel(req.fOnOff);
res.Write(fPipe);
Expand All @@ -217,7 +219,7 @@ int JackClientPipeThread::HandleRequest()
case JackRequest::kReleaseTimebase: {
JackLog("JackRequest::kReleaseTimebase\n");
JackReleaseTimebaseRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum);
res.Write(fPipe);
Expand All @@ -227,7 +229,7 @@ int JackClientPipeThread::HandleRequest()
case JackRequest::kSetTimebaseCallback: {
JackLog("JackRequest::kSetTimebaseCallback\n");
JackSetTimebaseCallbackRequest req;
JackResult res;
JackResult res;
if (req.Read(fPipe) == 0)
res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal);
res.Write(fPipe);
Expand All @@ -236,16 +238,16 @@ int JackClientPipeThread::HandleRequest()

case JackRequest::kNotification: {
JackLog("JackRequest::Notification\n");
JackClientNotificationRequest req;
JackClientNotificationRequest req;
if (req.Read(fPipe) == 0)
fServer->Notify(req.fRefNum, req.fNotify, req.fValue);
fServer->Notify(req.fRefNum, req.fNotify, req.fValue);
break;
}

default:
JackLog("Unknown request %ld\n", header.fType);
break;
}
}
}

// Unlock the global mutex
Expand All @@ -260,11 +262,10 @@ void JackClientPipeThread::AddClient(char* name, int* shared_engine, int* shared
*result = fServer->GetEngine()->ClientNew(name, &fRefNum, shared_engine, shared_client, shared_ports);
}

void JackClientPipeThread::RemoveClient(int refnum)
void JackClientPipeThread::RemoveClient()
{
JackLog("JackWinNamedPipeServerChannel::RemoveClient ref = %d\n", refnum);
fRefNum = -1;
fPipe->Close();
JackLog("JackWinNamedPipeServerChannel::RemoveClient ref = %d\n", fRefNum);
Close();
}

void JackClientPipeThread::KillClient()
Expand All @@ -280,8 +281,7 @@ void JackClientPipeThread::KillClient()
fServer->Notify(fRefNum, JackNotifyChannelInterface::kDeadClient, 0);
}

fRefNum = -1;
fPipe->Close();
Close();
}

JackWinNamedPipeServerChannel::JackWinNamedPipeServerChannel()
Expand Down Expand Up @@ -365,17 +365,17 @@ void JackWinNamedPipeServerChannel::AddClient(JackWinNamedPipeClient* pipe)
JackClientPipeThread* client;
while (it != fClientList.end()) {
client = *it;
if (client->IsRunning()) {
if (client->IsRunning()) {
it++;
} else {
JackLog("Remove client from list\n");
it = fClientList.erase(it);
JackLog("Remove client from list\n");
it = fClientList.erase(it);
delete(client);
}
}

client = new JackClientPipeThread(pipe);
client->Open(fServer);
client->Open(fServer);
// Here we are sure that the client is running (because it's thread is in "running" state).
fClientList.push_back(client);
}
Expand Down
6 changes: 3 additions & 3 deletions windows/JackWinNamedPipeServerChannel.h
Expand Up @@ -40,7 +40,7 @@ class JackClientPipeThread : public JackRunnableInterface
int fRefNum;

void AddClient(char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result);
void RemoveClient(int refnum);
void RemoveClient();
void KillClient();

static HANDLE fMutex;
Expand All @@ -57,11 +57,11 @@ class JackClientPipeThread : public JackRunnableInterface

// JackRunnableInterface interface
bool Execute();


// To be used for find out if the object can be deleted
bool IsRunning()
{
return fThread->IsRunning();
return (fRefNum >= 0);
}
};

Expand Down

0 comments on commit 308d46a

Please sign in to comment.