Skip to content

Commit

Permalink
macos mod-desktop fixup
Browse files Browse the repository at this point in the history
Signed-off-by: falkTX <falktx@falktx.com>
  • Loading branch information
falkTX committed Mar 17, 2024
1 parent 540f2c0 commit c60f7f1
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 25 deletions.
67 changes: 58 additions & 9 deletions common/JackModDesktopDriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
#include "JackMidiPort.h"
#include "JackTools.h"

#ifdef _WIN32
#else
#ifndef _WIN32
# include <fcntl.h>
# include <sys/mman.h>
# ifdef __APPLE__
Expand All @@ -34,7 +33,7 @@ namespace Jack
#ifdef __APPLE__
static void terminateHandler(void*)
{
printf("Desktop driver parent has died, terminating ourselves now\n");
printf("MOD Desktop driver parent has died, terminating ourselves now\n");
fflush(stdout);
kill(getpid(), SIGTERM);
}
Expand Down Expand Up @@ -95,6 +94,40 @@ class ModDesktopAudioDriver : public JackAudioDriver
mach_port_t task = MACH_PORT_NULL;
semaphore_t sem1 = MACH_PORT_NULL;
semaphore_t sem2 = MACH_PORT_NULL;
mach_port_t port1 = MACH_PORT_NULL;
mach_port_t port2 = MACH_PORT_NULL;

bool connectport(const mach_port_t port, semaphore_t* const sem)
{
mach_port_t reqport;

if (mach_port_allocate(task, MACH_PORT_RIGHT_RECEIVE, &reqport) != KERN_SUCCESS)
return false;

struct {
mach_msg_header_t hdr;
mach_msg_trailer_t trailer;
} msg;

msg.hdr.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE);
msg.hdr.msgh_local_port = reqport;
msg.hdr.msgh_remote_port = port;

if (mach_msg(&msg.hdr, MACH_SEND_MSG, sizeof(msg.hdr), 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL) != MACH_MSG_SUCCESS)
{
mach_port_destroy(task, reqport);
return false;
}

if (mach_msg(&msg.hdr, MACH_RCV_MSG, 0, sizeof(msg), reqport, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL) != MACH_MSG_SUCCESS)
{
mach_port_destroy(task, reqport);
return false;
}

*sem = msg.hdr.msgh_remote_port;
return true;
}

void post()
{
Expand Down Expand Up @@ -289,23 +322,27 @@ class ModDesktopAudioDriver : public JackAudioDriver
#ifdef __APPLE__
task = mach_task_self();

mach_port_t bootport1;
if (task_get_bootstrap_port(task, &bootport1) != KERN_SUCCESS ||
bootstrap_look_up(bootport1, fShmData->bootname1, &sem1) != KERN_SUCCESS)
mach_port_t bootport;
if (task_get_bootstrap_port(task, &bootport) != KERN_SUCCESS)
{
Close();
jack_error("Can't open default MOD Desktop driver 4");
return -1;
}

mach_port_t bootport2;
if (task_get_bootstrap_port(task, &bootport2) != KERN_SUCCESS ||
bootstrap_look_up(bootport2, fShmData->bootname2, &sem2) != KERN_SUCCESS)
if (bootstrap_look_up(bootport, fShmData->bootname1, &port1) != KERN_SUCCESS || !connectport(port1, &sem1))
{
Close();
jack_error("Can't open default MOD Desktop driver 5");
return -1;
}

if (bootstrap_look_up(bootport, fShmData->bootname2, &port2) != KERN_SUCCESS || !connectport(port2, &sem2))
{
Close();
jack_error("Can't open default MOD Desktop driver 6");
return -1;
}
#endif

return 0;
Expand All @@ -319,6 +356,18 @@ class ModDesktopAudioDriver : public JackAudioDriver
JackAudioDriver::Close();

#ifdef __APPLE__
if (port1 != MACH_PORT_NULL)
{
mach_port_deallocate(task, port1);
port1 = MACH_PORT_NULL;
}

if (port2 != MACH_PORT_NULL)
{
mach_port_deallocate(task, port2);
port2 = MACH_PORT_NULL;
}

if (sem1 != MACH_PORT_NULL)
{
semaphore_destroy(task, sem1);
Expand Down
4 changes: 0 additions & 4 deletions macosx/JackMachSemaphore.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ class SERVER_EXPORT JackMachSemaphore : public detail::JackSynchro
* (server) or Connect()ed (client). */
semaphore_t fSemaphore;

/*! \brief The bootstrap port for this task, or MACH_PORT_NULL if not yet obtained. */
mach_port_t fBootPort;

/*! \brief The IPC port used to pass the semaphore port from the server to the client, and
* for the client to request that this occurs. MACH_PORT_NULL if not yet created (server) or
* looked up (client). */
Expand All @@ -70,7 +67,6 @@ class SERVER_EXPORT JackMachSemaphore : public detail::JackSynchro
JackMachSemaphore():
JackSynchro(),
fSemaphore(MACH_PORT_NULL),
fBootPort(MACH_PORT_NULL),
fServicePort(MACH_PORT_NULL),
fSemServer(NULL),
fThreadSemServer(NULL)
Expand Down
22 changes: 10 additions & 12 deletions macosx/JackMachSemaphore.mm
Original file line number Diff line number Diff line change
Expand Up @@ -153,13 +153,12 @@
BuildName(client_name, server_name, fName, sizeof(fName));

mach_port_t task = mach_task_self();
mach_port_t bootport;
kern_return_t res;

if (fBootPort == MACH_PORT_NULL) {
if ((res = task_get_bootstrap_port(task, &fBootPort)) != KERN_SUCCESS) {
jack_mach_error(res, "can't find bootstrap mach port");
return false;
}
if ((res = task_get_bootstrap_port(task, &bootport)) != KERN_SUCCESS) {
jack_mach_error(res, "can't find bootstrap mach port");
return false;
}

if ((res = semaphore_create(task, &fSemaphore, SYNC_POLICY_FIFO, value)) != KERN_SUCCESS) {
Expand All @@ -185,7 +184,7 @@
return false;
}

if ((res = bootstrap_register(fBootPort, fName, fServicePort)) != KERN_SUCCESS) {
if ((res = bootstrap_register(bootport, fName, fServicePort)) != KERN_SUCCESS) {
jack_mach_bootstrap_err(res, "can't register IPC port with bootstrap server", fName);

// Cleanup created semaphore & mach port
Expand Down Expand Up @@ -224,21 +223,20 @@
BuildName(client_name, server_name, fName, sizeof(fName));

mach_port_t task = mach_task_self();
mach_port_t bootport;
kern_return_t res;

if (fSemaphore != MACH_PORT_NULL) {
jack_log("JackMachSemaphore::Connect: Already connected name = %s", fName);
return true;
}

if (fBootPort == MACH_PORT_NULL) {
if ((res = task_get_bootstrap_port(task, &fBootPort)) != KERN_SUCCESS) {
jack_mach_error(res, "can't find bootstrap port");
return false;
}
if ((res = task_get_bootstrap_port(task, &bootport)) != KERN_SUCCESS) {
jack_mach_error(res, "can't find bootstrap port");
return false;
}

if ((res = bootstrap_look_up(fBootPort, fName, &fServicePort)) != KERN_SUCCESS) {
if ((res = bootstrap_look_up(bootport, fName, &fServicePort)) != KERN_SUCCESS) {
jack_mach_bootstrap_err(res, "can't find IPC service port to request semaphore", fName);
return false;
}
Expand Down

0 comments on commit c60f7f1

Please sign in to comment.