|
|
|
@@ -50,95 +50,98 @@ class JackClient; |
|
|
|
\brief Global library static structure: singleton kind of pattern. |
|
|
|
*/ |
|
|
|
|
|
|
|
struct JackLibGlobals |
|
|
|
class JackLibGlobals |
|
|
|
{ |
|
|
|
JackShmReadWritePtr<JackGraphManager> fGraphManager; /*! Shared memory Port manager */ |
|
|
|
JackShmReadWritePtr<JackEngineControl> fEngineControl; /*! Shared engine control */ // transport engine has to be writable |
|
|
|
JackSynchro fSynchroTable[CLIENT_NUM]; /*! Shared synchro table */ |
|
|
|
JackMetadata *fMetadata; /*! Shared metadata base */ |
|
|
|
sigset_t fProcessSignals; |
|
|
|
|
|
|
|
static int fClientCount; |
|
|
|
static JackLibGlobals* fGlobals; |
|
|
|
|
|
|
|
JackLibGlobals() |
|
|
|
{ |
|
|
|
jack_log("JackLibGlobals"); |
|
|
|
if (!JackMessageBuffer::Create()) { |
|
|
|
jack_error("Cannot create message buffer"); |
|
|
|
} |
|
|
|
fGraphManager = -1; |
|
|
|
fEngineControl = -1; |
|
|
|
|
|
|
|
fMetadata = new JackMetadata(false); |
|
|
|
|
|
|
|
// Filter SIGPIPE to avoid having client get a SIGPIPE when trying to access a died server. |
|
|
|
#ifdef WIN32 |
|
|
|
// TODO |
|
|
|
#else |
|
|
|
sigset_t signals; |
|
|
|
sigemptyset(&signals); |
|
|
|
sigaddset(&signals, SIGPIPE); |
|
|
|
sigprocmask(SIG_BLOCK, &signals, &fProcessSignals); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
~JackLibGlobals() |
|
|
|
{ |
|
|
|
jack_log("~JackLibGlobals"); |
|
|
|
for (int i = 0; i < CLIENT_NUM; i++) { |
|
|
|
fSynchroTable[i].Disconnect(); |
|
|
|
} |
|
|
|
JackMessageBuffer::Destroy(); |
|
|
|
|
|
|
|
delete fMetadata; |
|
|
|
fMetadata = NULL; |
|
|
|
public: |
|
|
|
|
|
|
|
JackShmReadWritePtr<JackGraphManager> fGraphManager; /*! Shared memory Port manager */ |
|
|
|
JackShmReadWritePtr<JackEngineControl> fEngineControl; /*! Shared engine control */ // transport engine has to be writable |
|
|
|
JackSynchro fSynchroTable[CLIENT_NUM]; /*! Shared synchro table */ |
|
|
|
JackMetadata *fMetadata; /*! Shared metadata base */ |
|
|
|
sigset_t fProcessSignals; |
|
|
|
|
|
|
|
// Restore old signal mask |
|
|
|
#ifdef WIN32 |
|
|
|
// TODO |
|
|
|
#else |
|
|
|
sigprocmask(SIG_BLOCK, &fProcessSignals, 0); |
|
|
|
#endif |
|
|
|
} |
|
|
|
static int fClientCount; |
|
|
|
static JackLibGlobals* fGlobals; |
|
|
|
|
|
|
|
static void Init() |
|
|
|
{ |
|
|
|
if (!JackGlobals::fServerRunning && fClientCount > 0) { |
|
|
|
JackLibGlobals() |
|
|
|
{ |
|
|
|
jack_log("JackLibGlobals"); |
|
|
|
if (!JackMessageBuffer::Create()) { |
|
|
|
jack_error("Cannot create message buffer"); |
|
|
|
} |
|
|
|
fGraphManager = -1; |
|
|
|
fEngineControl = -1; |
|
|
|
|
|
|
|
fMetadata = new JackMetadata(false); |
|
|
|
|
|
|
|
// Cleanup remaining clients |
|
|
|
jack_error("Jack server was closed but clients are still allocated, cleanup..."); |
|
|
|
// Filter SIGPIPE to avoid having client get a SIGPIPE when trying to access a died server. |
|
|
|
#ifdef WIN32 |
|
|
|
// TODO |
|
|
|
#else |
|
|
|
sigset_t signals; |
|
|
|
sigemptyset(&signals); |
|
|
|
sigaddset(&signals, SIGPIPE); |
|
|
|
sigprocmask(SIG_BLOCK, &signals, &fProcessSignals); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
~JackLibGlobals() |
|
|
|
{ |
|
|
|
jack_log("~JackLibGlobals"); |
|
|
|
for (int i = 0; i < CLIENT_NUM; i++) { |
|
|
|
JackClient* client = JackGlobals::fClientTable[i]; |
|
|
|
if (client) { |
|
|
|
jack_error("Cleanup client ref = %d", i); |
|
|
|
client->Close(); |
|
|
|
delete client; |
|
|
|
} |
|
|
|
fSynchroTable[i].Disconnect(); |
|
|
|
} |
|
|
|
JackMessageBuffer::Destroy(); |
|
|
|
|
|
|
|
// Cleanup global context |
|
|
|
fClientCount = 0; |
|
|
|
delete fGlobals; |
|
|
|
fGlobals = NULL; |
|
|
|
delete fMetadata; |
|
|
|
fMetadata = NULL; |
|
|
|
|
|
|
|
// Restore old signal mask |
|
|
|
#ifdef WIN32 |
|
|
|
// TODO |
|
|
|
#else |
|
|
|
sigprocmask(SIG_BLOCK, &fProcessSignals, 0); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
if (fClientCount++ == 0 && !fGlobals) { |
|
|
|
jack_log("JackLibGlobals Init %x", fGlobals); |
|
|
|
InitTime(); |
|
|
|
fGlobals = new JackLibGlobals(); |
|
|
|
static void Init() |
|
|
|
{ |
|
|
|
if (!JackGlobals::fServerRunning && fClientCount > 0) { |
|
|
|
|
|
|
|
// Cleanup remaining clients |
|
|
|
jack_error("Jack server was closed but clients are still allocated, cleanup..."); |
|
|
|
for (int i = 0; i < CLIENT_NUM; i++) { |
|
|
|
JackClient* client = JackGlobals::fClientTable[i]; |
|
|
|
if (client) { |
|
|
|
jack_error("Cleanup client ref = %d", i); |
|
|
|
client->Close(); |
|
|
|
delete client; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Cleanup global context |
|
|
|
fClientCount = 0; |
|
|
|
delete fGlobals; |
|
|
|
fGlobals = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
if (fClientCount++ == 0 && !fGlobals) { |
|
|
|
jack_log("JackLibGlobals Init %x", fGlobals); |
|
|
|
InitTime(); |
|
|
|
fGlobals = new JackLibGlobals(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Destroy() |
|
|
|
{ |
|
|
|
if (--fClientCount == 0 && fGlobals) { |
|
|
|
jack_log("JackLibGlobals Destroy %x", fGlobals); |
|
|
|
EndTime(); |
|
|
|
delete fGlobals; |
|
|
|
fGlobals = NULL; |
|
|
|
|
|
|
|
static void Destroy() |
|
|
|
{ |
|
|
|
if (--fClientCount == 0 && fGlobals) { |
|
|
|
jack_log("JackLibGlobals Destroy %x", fGlobals); |
|
|
|
EndTime(); |
|
|
|
delete fGlobals; |
|
|
|
fGlobals = NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|