* macOS: Pass JackMachSemaphore send right via mach_msg IPC
Previously, JackMachSemaphore would communicate the send right for the
semaphore object from the server to a client via a named service
registered via `bootstrap_register`. However, to do this, it would
register the semaphore's port as the service port directly.
In theory this ought to be fine, however in practice, macOS `launchd`,
which provides the `bootstrap_register` interface, does not correctly
detect when such a port becomes dead, and incorrectly believes that the
service that it provides is forever alive, even past the end of the
`jackd` process' (and therefore the semaphore's) existence. This seems
to be *specific* to semaphore ports, as `launchd` is expecting a
standard IPC port, owned by the task, not the kernel. This prevents
`jackd` from later registering another service with the same name, as
`launchd` rejects the registration as conflicting with an active service.
To get around this, `jackd` previously added a counter to the end of the
named service registrations, allowing old services to remain in the
system until the end of the session. To prevent things getting out of
hand, this was capped at 98 service registrations for a given semaphore
name. This led to #784, in which running a client for the 99th time
resulted in the semaphore creation failing and the client failing to
connect.
As `launchd` outlives multiple runs of `jackd`, this situation persisted
across restarts of `jackd`, requiring a restart of the user's session
(i.e. a reboot) to fix.
An initial attempt at fixing this (see #785) tried passing the port
rights directly via shared memory, however mach is too clever for us and
foils that plan by having port names be looked up in a per-task table
(sensible when you think about it).
In this commit, we use mach IPC messages to transfer the send right for
the semaphore from the server to the client. By registering a standard
IPC port with the bootstrap server, the service registrations are
correctly torn down when the ports are destroyed.
It works something like this:
* Server creates IPC port and registers it globally via `bootstrap_register`
* Server listens on IPC port for messages
* Client looks up IPC port via `bootstrap_look_up`
* Client sends it a message
* Server replies with a message containing a send right to the
semaphore's port
* Client is then free to use the semaphore port as before.
This resolves#784.
* Improve error handling
* Add myself to Authors
* Add jack_position_t::tick_double, and flags around it
Signed-off-by: falkTX <falktx@falktx.com>
* s/precision/resolution/
Signed-off-by: falkTX <falktx@falktx.com>
* Assert alignment is suitable for atomic accesses
* Move fields and pad to meet alignment constraints
* Add padding to JackEngineControl to account for inherited data
* Parenthesise padding length for clarity
* Revert "Parenthesise padding length for clarity"
This reverts commit 1f757b9ece.
* Revert "Add padding to JackEngineControl to account for inherited data"
This reverts commit 3d8c7d83ad.
* Revert "Move fields and pad to meet alignment constraints"
This reverts commit ff631bbbdc.
* Assure alignment by using 'alignas' on fields
FUTEX_WAIT may be interrupted by a signal and return EINTR. If a client
process takes a signal while on the futex, the jack client may error out
with no way to recover despite the signal being safe. Instead, retry if
errno is set to EINTR.
jack_port_get_latency_range only returns meaningful values after ports get
connected, and that is signalled via the latency callback. Saying that it's
normally used in callbacks is too soft, the docs should make it clear that the
function is not very useful outside of the callback, because you don't know
whether the port is connected / whether the latency values changed.
jack_port_get_latency_range only returns meaningful values after ports get
connected, and that is signalled via the latency callback. Saying that it's
normally used in callbacks is too soft, the docs should make it clear that the
function is not very useful outside of the callback, because you don't know
whether the port is connected / whether the latency values changed.
to ensure that it is not modified by any client.
const have internal linkage unless marked by extern
Change-Id: Ife1def2feb43aead32164f479e39ee3fd71b2ba0
Signed-off-by: Adam Miartus <external.Adam.Miartus@de.bosch.com>
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
Change-Id: I66e0960c9ab1a097de3098d4f51e0fff4d064186
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
(cherry picked from commit 12f6a01bcb)
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
Signed-off-by: Adam Miartus <amiartus@de.adit-jv.com>
(cherry picked from commit 733c147c23)
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
Change-Id: I63a7330408d75f21e25426e42260133669a0db0e
(cherry picked from commit 41b58edf09)
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
Change-Id: I88003f8c55184b141ffd4e068eba889776ce9b14
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
(cherry picked from commit 742dc38a0d)
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
Change-Id: I5f5b4a2d0a52ef12ac4e396f40002e8dec916cfb
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
(cherry picked from commit c438633ccc)
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
* Add guide for compiling on MinGW using waf
* Update wscripts and guide for MinGW
* Fix README_MINGW typos
* Add instructions for ASIO support
* Update jackd example
* Patch for metadata support on Windows
* Update VS project for building JackRouter
* JackRouter/VS: add int redefinition fix to all build configurations
* VS: ignore Visual Studio build files and user settings
* Revise and extend README_MINGW
* Fix typos in README_MINGW
* Update MinGW build guide
* Replace MAX_PATH with PATH_MAX (win32)
* Include limits.h in JackMetadata.h
Co-authored-by: Schrödinger's Cat <6382400+Schroedingers-Cat@users.noreply.github.com>