Skip to content

Commit

Permalink
In control API, UNIX like sigset_t replaced by more abstract jackctl_…
Browse files Browse the repository at this point in the history
…sigmask_t * opaque struct.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4775 0c269be4-1314-0410-8aa9-9f06e86f4224
  • Loading branch information
sletz committed Feb 9, 2012
1 parent 916f55e commit a6a2d8f
Show file tree
Hide file tree
Showing 9 changed files with 96 additions and 76 deletions.
4 changes: 4 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ John Emmas
Jackdmp changes log
---------------------------

2012-02-09 Stephane Letz <letz@grame.fr>

* In control API, UNIX like sigset_t replaced by more abstract jackctl_sigmask_t * opaque struct.

2012-02-01 Stephane Letz <letz@grame.fr>

* Check server API callback from notification thread.
Expand Down
71 changes: 41 additions & 30 deletions common/JackControlAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -440,32 +440,37 @@ jackctl_server_free_parameters(

#ifdef WIN32

static HANDLE waitEvent;
struct jackctl_sigmask
{
HANDLE wait_event;
};

static jackctl_sigmask sigmask;

static void do_nothing_handler(int signum)
static void signal_handler(int signum)
{
printf("Jack main caught signal %d\n", signum);
(void) signal(SIGINT, SIG_DFL);
SetEvent(waitEvent);
SetEvent(sigmask.wait_event);
}

sigset_t
jackctl_sigmask_t *
jackctl_setup_signals(
unsigned int flags)
{
if ((waitEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
if ((sigmask.wait_event = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
jack_error("CreateEvent fails err = %ld", GetLastError());
return 0;
}

(void) signal(SIGINT, do_nothing_handler);
(void) signal(SIGABRT, do_nothing_handler);
(void) signal(SIGTERM, do_nothing_handler);
(void) signal(SIGINT, signal_handler);
(void) signal(SIGABRT, signal_handler);
(void) signal(SIGTERM, signal_handler);

return (sigset_t)waitEvent;
return &sigmask;
}

void jackctl_wait_signals(sigset_t signals)
void jackctl_wait_signals(jackctl_sigmask_t * signals)
{
if (WaitForSingleObject(waitEvent, INFINITE) != WAIT_OBJECT_0) {
jack_error("WaitForSingleObject fails err = %ld", GetLastError());
Expand All @@ -474,23 +479,29 @@ void jackctl_wait_signals(sigset_t signals)

#else

struct jackctl_sigmask
{
sigset_t signals;
};

static jackctl_sigmask sigmask;

static
void
do_nothing_handler(int sig)
signal_handler(int sig)
{
/* this is used by the child (active) process, but it never
gets called unless we are already shutting down after
another signal.
*/
char buf[64];
snprintf (buf, sizeof(buf), "Received signal %d during shutdown (ignored)\n", sig);
snprintf(buf, sizeof(buf), "Received signal %d during shutdown (ignored)\n", sig);
}

SERVER_EXPORT sigset_t
SERVER_EXPORT jackctl_sigmask_t *
jackctl_setup_signals(
unsigned int flags)
{
sigset_t signals;
sigset_t allsignals;
struct sigaction action;
int i;
Expand Down Expand Up @@ -529,52 +540,52 @@ jackctl_setup_signals(
after a return from sigwait().
*/

sigemptyset(&signals);
sigaddset(&signals, SIGHUP);
sigaddset(&signals, SIGINT);
sigaddset(&signals, SIGQUIT);
sigaddset(&signals, SIGPIPE);
sigaddset(&signals, SIGTERM);
sigaddset(&signals, SIGUSR1);
sigaddset(&signals, SIGUSR2);
sigemptyset(&sigmask.signals);
sigaddset(&sigmask.signals, SIGHUP);
sigaddset(&sigmask.signals, SIGINT);
sigaddset(&sigmask.signals, SIGQUIT);
sigaddset(&sigmask.signals, SIGPIPE);
sigaddset(&sigmask.signals, SIGTERM);
sigaddset(&sigmask.signals, SIGUSR1);
sigaddset(&sigmask.signals, SIGUSR2);

/* all child threads will inherit this mask unless they
* explicitly reset it
*/

pthread_sigmask(SIG_BLOCK, &signals, 0);
pthread_sigmask(SIG_BLOCK, &sigmask.signals, 0);

/* install a do-nothing handler because otherwise pthreads
behaviour is undefined when we enter sigwait.
*/

sigfillset(&allsignals);
action.sa_handler = do_nothing_handler;
action.sa_handler = signal_handler;
action.sa_mask = allsignals;
action.sa_flags = SA_RESTART|SA_RESETHAND;

for (i = 1; i < NSIG; i++)
{
if (sigismember (&signals, i))
if (sigismember (&sigmask.signals, i))
{
sigaction(i, &action, 0);
}
}

return signals;
return &sigmask;
}

SERVER_EXPORT void
jackctl_wait_signals(sigset_t signals)
jackctl_wait_signals(jackctl_sigmask_t * sigmask)
{
int sig;
bool waiting = true;

while (waiting) {
#if defined(sun) && !defined(__sun__) // SUN compiler only, to check
sigwait(&signals);
sigwait(&sigmask->signals);
#else
sigwait(&signals, &sig);
sigwait(&sigmask->signals, &sig);
#endif
fprintf(stderr, "Jack main caught signal %d\n", sig);

Expand All @@ -598,7 +609,7 @@ jackctl_wait_signals(sigset_t signals)
// unblock signals so we can see them during shutdown.
// this will help prod developers not to lose sight of
// bugs that cause segfaults etc. during shutdown.
sigprocmask(SIG_UNBLOCK, &signals, 0);
sigprocmask(SIG_UNBLOCK, &sigmask->signals, 0);
}
}
#endif
Expand Down
16 changes: 5 additions & 11 deletions common/JackControlAPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,6 @@
#include "jslist.h"
#include "JackCompilerDeps.h"

#ifdef WIN32
#ifdef __MINGW32__
#include <sys/types.h>
typedef _sigset_t sigset_t;
#else
typedef HANDLE sigset_t;
#endif
#endif

/** Parameter types, intentionally similar to jack_driver_param_type_t */
typedef enum
{
Expand Down Expand Up @@ -80,20 +71,23 @@ typedef struct jackctl_internal jackctl_internal_t;
/** opaque type for parameter object */
typedef struct jackctl_parameter jackctl_parameter_t;

/** opaque type for sigmask object */
typedef struct jackctl_sigmask jackctl_sigmask_t;

#ifdef __cplusplus
extern "C" {
#endif
#if 0
} /* Adjust editor indent */
#endif

SERVER_EXPORT sigset_t
SERVER_EXPORT jackctl_sigmask_t *
jackctl_setup_signals(
unsigned int flags);

SERVER_EXPORT void
jackctl_wait_signals(
sigset_t signals);
jackctl_sigmask_t * signals);

SERVER_EXPORT jackctl_server_t *
jackctl_server_create(
Expand Down
3 changes: 1 addition & 2 deletions common/JackNetAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,6 @@ struct JackNetExtMaster : public JackNetMasterInterface {
}

if (rx_bytes == sizeof(session_params_t )) {

switch (GetPacketType(&fParams)) {

case SLAVE_AVAILABLE:
Expand All @@ -245,7 +244,7 @@ struct JackNetExtMaster : public JackNetMasterInterface {
}
while (fRunning);

// Set result paramaters
// Set result parameters
result->audio_input = fParams.fSendAudioChannels;
result->audio_output = fParams.fReturnAudioChannels;
result->midi_input = fParams.fSendMidiChannels;
Expand Down
1 change: 1 addition & 0 deletions common/JackNetManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -711,6 +711,7 @@ namespace Jack
session_params_t net_params;
rx_bytes = fSocket.CatchHost(&net_params, sizeof(session_params_t), 0);
SessionParamsNToH(&net_params, &host_params);

if ((rx_bytes == SOCKET_ERROR) && (fSocket.GetError() != NET_NO_DATA)) {
jack_error("Error in receive : %s", StrError(NET_ERROR_CODE));
if (++attempt == 10) {
Expand Down
6 changes: 3 additions & 3 deletions common/Jackdmp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ int main(int argc, char** argv)
int do_unlock = 0;
int loopback = 0;
bool show_version = false;
sigset_t signals;
jackctl_sigmask_t * sigmask;
jackctl_parameter_t* param;
union jackctl_parameter_value value;

Expand Down Expand Up @@ -450,7 +450,7 @@ int main(int argc, char** argv)
}

// Setup signals
signals = jackctl_setup_signals(0);
sigmask = jackctl_setup_signals(0);

// Open server
if (! jackctl_server_open(server_ctl, master_driver_ctl)) {
Expand Down Expand Up @@ -520,7 +520,7 @@ int main(int argc, char** argv)
return_value = 0;

// Waits for signal
jackctl_wait_signals(signals);
jackctl_wait_signals(sigmask);

stop_server:
if (!jackctl_server_stop(server_ctl)) {
Expand Down
12 changes: 9 additions & 3 deletions common/jack/control.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

#ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED
#define JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED


#include <types.h>
#include <jack/jslist.h>
#include <jack/systemdeps.h>
Expand Down Expand Up @@ -82,6 +82,12 @@ typedef struct jackctl_internal jackctl_internal_t;
/** opaque type for parameter object */
typedef struct jackctl_parameter jackctl_parameter_t;

/** opaque type for parameter object */
typedef struct jackctl_parameter jackctl_parameter_t;

/** opaque type for sigmask object */
typedef struct jackctl_sigmask jackctl_sigmask_t;

#ifdef __cplusplus
extern "C" {
#endif
Expand All @@ -103,7 +109,7 @@ extern "C" {
*
* @return the configurated signal set.
*/
sigset_t
jackctl_sigmask_t *
jackctl_setup_signals(
unsigned int flags);

Expand All @@ -114,7 +120,7 @@ jackctl_setup_signals(
*/
void
jackctl_wait_signals(
sigset_t signals);
jackctl_sigmask_t * signals);

/**
* Call this function to create server object.
Expand Down

0 comments on commit a6a2d8f

Please sign in to comment.