Browse Source

More robust code in JackWinNamedPipeClient::ConnectAux.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4628 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.8
sletz 14 years ago
parent
commit
a738e2e1e7
2 changed files with 142 additions and 7 deletions
  1. +127
    -3
      windows/JackWinNamedPipe.cpp
  2. +15
    -4
      windows/JackWinNamedPipe.h

+ 127
- 3
windows/JackWinNamedPipe.cpp View File

@@ -52,6 +52,59 @@ int JackWinNamedPipe::Write(void* data, int len)
} }
} }


/*
See :
http://answers.google.com/answers/threadview?id=430173
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365800(v=vs.85).aspx
*/

int JackWinNamedPipeClient::ConnectAux(int retry_count)
{
jack_log("Connect: fName %s", fName);

while (true) {

fNamedPipe = CreateFile(fName, // pipe name
GENERIC_READ | // read and write access
GENERIC_WRITE,
0, // no sharing
NULL, // default security attributes
OPEN_EXISTING, // opens existing pipe
0, // default attributes
NULL); // no template file

// Break if the pipe handle is valid.
if (fNamedPipe != INVALID_HANDLE_VALUE) {
return 0;
}

// Exit if an error other than ERROR_PIPE_BUSY occurs.
if (GetLastError() != ERROR_PIPE_BUSY) {
jack_error("Cannot connect to named pipe = %s err = %ld", fName, GetLastError());
return -1;
}

// All pipe instances are busy, so wait for 2 seconds.
if (!WaitNamedPipe(lpszPipename, 2000)) {
jack_error("Cannot connect to named pipe = %s err = %ld", fName, GetLastError());
return -1;
}
}
}

int JackWinNamedPipeClient::Connect(const char* dir, int which)
{
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which);
return ConnectAux();
}

int JackWinNamedPipeClient::Connect(const char* dir, const char* name, int which)
{
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%s_%d", dir, name, which);
return ConnectAux();
}

/*
int JackWinNamedPipeClient::Connect(const char* dir, int which) int JackWinNamedPipeClient::Connect(const char* dir, int which)
{ {
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which); snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which);
@@ -95,6 +148,7 @@ int JackWinNamedPipeClient::Connect(const char* dir, const char* name, int which
return 0; return 0;
} }
} }
*/


int JackWinNamedPipeClient::Close() int JackWinNamedPipeClient::Close()
{ {
@@ -131,8 +185,9 @@ JackWinAsyncNamedPipeClient::JackWinAsyncNamedPipeClient(HANDLE pipe, bool pendi
TRUE, // initial state = signaled TRUE, // initial state = signaled
NULL); // unnamed event object NULL); // unnamed event object


if (!fPendingIO)
if (!fPendingIO) {
SetEvent(fOverlap.hEvent); SetEvent(fOverlap.hEvent);
}


fIOState = (fPendingIO) ? kConnecting : kReading; fIOState = (fPendingIO) ? kConnecting : kReading;
} }
@@ -188,7 +243,6 @@ int JackWinAsyncNamedPipeClient::Read(void* data, int len)
DWORD read; DWORD read;
jack_log("JackWinNamedPipeClient::Read len = %ld", len); jack_log("JackWinNamedPipeClient::Read len = %ld", len);
BOOL res = ReadFile(fNamedPipe, data, len, &read, &fOverlap); BOOL res = ReadFile(fNamedPipe, data, len, &read, &fOverlap);
jack_log("JackWinNamedPipeClient::Read res = %ld read %ld", res, read);


if (res && read != 0) { if (res && read != 0) {
fPendingIO = false; fPendingIO = false;
@@ -224,6 +278,40 @@ int JackWinAsyncNamedPipeClient::Write(void* data, int len)


// Server side // Server side


int JackWinNamedPipeServer::BindAux()
{
jack_log("Bind: fName %s", fName);

if ((fNamedPipe = CreateNamedPipe(fName,
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
INFINITE, // client time-out
NULL)) == INVALID_HANDLE_VALUE) { // no security
jack_error("Cannot bind server to pipe err = %ld", GetLastError());
return -1;
} else {
return 0;
}
}

int JackWinNamedPipeServer::Bind(const char* dir, int which)
{
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which);
return BindAux();
}

int JackWinNamedPipeServer::Bind(const char* dir, const char* name, int which)
{
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%s_%d", dir, name, which);
return BindAux();
}

/*
int JackWinNamedPipeServer::Bind(const char* dir, int which) int JackWinNamedPipeServer::Bind(const char* dir, int which)
{ {
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which); snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which);
@@ -267,6 +355,7 @@ int JackWinNamedPipeServer::Bind(const char* dir, const char* name, int which)
return 0; return 0;
} }
} }
*/


bool JackWinNamedPipeServer::Accept() bool JackWinNamedPipeServer::Accept()
{ {
@@ -320,6 +409,40 @@ int JackWinNamedPipeServer::Close()


// Server side // Server side


int JackWinAsyncNamedPipeServer::BindAux()
{
jack_log("Bind: fName %s", fName);

if ((fNamedPipe = CreateNamedPipe(fName,
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
INFINITE, // client time-out
NULL)) == INVALID_HANDLE_VALUE) { // no security a
jack_error("Cannot bind server to pipe err = %ld", GetLastError());
return -1;
} else {
return 0;
}
}

int JackWinAsyncNamedPipeServer::Bind(const char* dir, int which)
{
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which);
return BindAux();
}

int JackWinAsyncNamedPipeServer::Bind(const char* dir, const char* name, int which)
{
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%s_%d", dir, name, which);
return BindAux();
}

/*
int JackWinAsyncNamedPipeServer::Bind(const char* dir, int which) int JackWinAsyncNamedPipeServer::Bind(const char* dir, int which)
{ {
snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which); snprintf(fName, sizeof(fName), "\\\\.\\pipe\\%s_jack_%d", dir, which);
@@ -363,6 +486,7 @@ int JackWinAsyncNamedPipeServer::Bind(const char* dir, const char* name, int whi
return 0; return 0;
} }
} }
*/


bool JackWinAsyncNamedPipeServer::Accept() bool JackWinAsyncNamedPipeServer::Accept()
{ {
@@ -383,7 +507,7 @@ JackWinNamedPipeClient* JackWinAsyncNamedPipeServer::AcceptClient()
return new JackWinAsyncNamedPipeClient(fNamedPipe, false); return new JackWinAsyncNamedPipeClient(fNamedPipe, false);


default: default:
jack_error("Cannot connect server pipe name = %s err = %ld", fName, GetLastError());
jack_error("Cannot connect server pipe name = %s err = %ld", fName, GetLastError());
return NULL; return NULL;
break; break;
} }


+ 15
- 4
windows/JackWinNamedPipe.h View File

@@ -1,20 +1,20 @@
/* /*
Copyright (C) 2004-2008 Grame Copyright (C) 2004-2008 Grame
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */




@@ -54,6 +54,10 @@ class JackWinNamedPipe
class JackWinNamedPipeClient : public JackWinNamedPipe class JackWinNamedPipeClient : public JackWinNamedPipe
{ {


private:

int ConnectAux();

public: public:


JackWinNamedPipeClient(): JackWinNamedPipe() JackWinNamedPipeClient(): JackWinNamedPipe()
@@ -114,6 +118,9 @@ class JackWinAsyncNamedPipeClient : public JackWinNamedPipeClient


class JackWinNamedPipeServer : public JackWinNamedPipe class JackWinNamedPipeServer : public JackWinNamedPipe
{ {
private:

int BindAux();


public: public:


@@ -136,6 +143,10 @@ class JackWinNamedPipeServer : public JackWinNamedPipe
class JackWinAsyncNamedPipeServer : public JackWinNamedPipeServer class JackWinAsyncNamedPipeServer : public JackWinNamedPipeServer
{ {


private:

int BindAux();

public: public:


JackWinAsyncNamedPipeServer(): JackWinNamedPipeServer() JackWinAsyncNamedPipeServer(): JackWinNamedPipeServer()


Loading…
Cancel
Save