LMMS
Loading...
Searching...
No Matches
JackBridge2.cpp
Go to the documentation of this file.
1/*
2 * JackBridge (Part 2, Semaphore + Shared memory and other misc functions)
3 * Copyright (C) 2013-2023 Filipe Coelho <falktx@falktx.com>
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any purpose with
6 * or without fee is hereby granted, provided that the above copyright notice and this
7 * permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
10 * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
11 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
12 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
13 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include "JackBridge.hpp"
18
19#ifdef JACKBRIDGE_DUMMY
20# include "CarlaUtils.hpp"
21#else
22# include "CarlaProcessUtils.hpp"
23# include "CarlaSemUtils.hpp"
24# include "CarlaShmUtils.hpp"
25# include "CarlaTimeUtils.hpp"
26# ifdef __WINE__
27# include "utils/PipeClient.cpp"
28# endif
29#endif // ! JACKBRIDGE_DUMMY
30
31// --------------------------------------------------------------------------------------------------------------------
32
33bool jackbridge_sem_init(void* sem) noexcept
34{
35 CARLA_SAFE_ASSERT_RETURN(sem != nullptr, false);
36
37#ifndef JACKBRIDGE_DUMMY
38 return carla_sem_create2(*(carla_sem_t*)sem, true);
39#endif
40}
41
42void jackbridge_sem_destroy(void* sem) noexcept
43{
44 CARLA_SAFE_ASSERT_RETURN(sem != nullptr,);
45
46#ifndef JACKBRIDGE_DUMMY
47 carla_sem_destroy2(*(carla_sem_t*)sem);
48#endif
49}
50
51bool jackbridge_sem_connect(void* sem) noexcept
52{
53 CARLA_SAFE_ASSERT_RETURN(sem != nullptr, false);
54
55#ifdef JACKBRIDGE_DUMMY
56 return false;
57#else
58 return carla_sem_connect(*(carla_sem_t*)sem);
59#endif
60}
61
62void jackbridge_sem_post(void* sem, bool server) noexcept
63{
64 CARLA_SAFE_ASSERT_RETURN(sem != nullptr,);
65
66#ifndef JACKBRIDGE_DUMMY
67 carla_sem_post(*(carla_sem_t*)sem, server);
68#endif
69}
70
71#ifndef CARLA_OS_WASM
72bool jackbridge_sem_timedwait(void* sem, uint msecs, bool server) noexcept
73{
74 CARLA_SAFE_ASSERT_RETURN(sem != nullptr, false);
75
76#ifdef JACKBRIDGE_DUMMY
77 return false;
78#else
79 return carla_sem_timedwait(*(carla_sem_t*)sem, msecs, server);
80#endif
81}
82#endif
83
84// --------------------------------------------------------------------------------------------------------------------
85
86bool jackbridge_shm_is_valid(const void* shm) noexcept
87{
88 CARLA_SAFE_ASSERT_RETURN(shm != nullptr, false);
89
90#ifdef JACKBRIDGE_DUMMY
91 return false;
92#else
93 return carla_is_shm_valid(*(const carla_shm_t*)shm);
94#endif
95}
96
97void jackbridge_shm_init(void* shm) noexcept
98{
99 CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
100
101#ifndef JACKBRIDGE_DUMMY
102 carla_shm_init(*(carla_shm_t*)shm);
103#endif
104}
105
106void jackbridge_shm_attach(void* shm, const char* name) noexcept
107{
108 CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
109
110#ifndef JACKBRIDGE_DUMMY
111 *(carla_shm_t*)shm = carla_shm_attach(name);
112#endif
113}
114
115void jackbridge_shm_close(void* shm) noexcept
116{
117 CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
118
119#ifndef JACKBRIDGE_DUMMY
120 carla_shm_close(*(carla_shm_t*)shm);
121#endif
122}
123
124void* jackbridge_shm_map(void* shm, uint64_t size) noexcept
125{
126 CARLA_SAFE_ASSERT_RETURN(shm != nullptr, nullptr);
127
128#ifdef JACKBRIDGE_DUMMY
129 return nullptr;
130#else
131 return carla_shm_map(*(carla_shm_t*)shm, static_cast<std::size_t>(size));
132#endif
133}
134
135void jackbridge_shm_unmap(void* shm, void* ptr) noexcept
136{
137 CARLA_SAFE_ASSERT_RETURN(shm != nullptr,);
138
139#ifndef JACKBRIDGE_DUMMY
140 return carla_shm_unmap(*(carla_shm_t*)shm, ptr);
141#endif
142}
143
144// --------------------------------------------------------------------------------------------------------------------
145
146#if !defined(JACKBRIDGE_DUMMY) && defined(__WINE__)
147static void discovery_pipe_callback(void*, const char* const msg) noexcept
148{
149 carla_stdout("discovery msgReceived %s", msg);
150}
151#endif
152
154{
155#if defined(JACKBRIDGE_DUMMY) || !defined(__WINE__)
156 return nullptr;
157 // unused
158 (void)argv;
159#else
160 return carla_pipe_client_new(argv, discovery_pipe_callback, nullptr);
161#endif
162}
163
164void jackbridge_discovery_pipe_message(void* pipe, const char* key, const char* value)
165{
166#if defined(JACKBRIDGE_DUMMY) || !defined(__WINE__)
167 // unused
168 (void)pipe;
169 (void)key;
170 (void)value;
171#else
176#endif
177}
178
180{
181#if defined(JACKBRIDGE_DUMMY) || !defined(__WINE__)
182 // unused
183 (void)pipe;
184#else
186 carla_pipe_client_write_msg(pipe, "exiting\n");
188
189 // NOTE: no more messages are handled after this point
190 // pData->clientClosingDown = true;
191
192 for (int i=0; i < 100 && carla_pipe_client_is_running(pipe); ++i)
193 {
194 carla_msleep(50);
196 }
197
199 carla_stderr2("jackbridge_discovery_pipe_destroy: pipe is still running!");
200
202#endif
203}
204
205// --------------------------------------------------------------------------------------------------------------------
206
207void jackbridge_parent_deathsig(bool kill) noexcept
208{
209#ifndef JACKBRIDGE_DUMMY
210 carla_terminateProcessOnParentExit(kill);
211#endif
212}
213
214// --------------------------------------------------------------------------------------------------------------------
#define CARLA_SAFE_ASSERT_RETURN(cond, ret)
Definition CarlaDefines.h:190
unsigned int uint
Definition CarlaDefines.h:327
bool jackbridge_sem_connect(void *sem) noexcept
Definition JackBridge2.cpp:51
void jackbridge_discovery_pipe_message(void *pipe, const char *key, const char *value)
Definition JackBridge2.cpp:164
bool jackbridge_shm_is_valid(const void *shm) noexcept
Definition JackBridge2.cpp:86
void jackbridge_sem_destroy(void *sem) noexcept
Definition JackBridge2.cpp:42
void jackbridge_shm_close(void *shm) noexcept
Definition JackBridge2.cpp:115
void jackbridge_shm_attach(void *shm, const char *name) noexcept
Definition JackBridge2.cpp:106
void jackbridge_discovery_pipe_destroy(void *pipe)
Definition JackBridge2.cpp:179
void jackbridge_shm_init(void *shm) noexcept
Definition JackBridge2.cpp:97
void * jackbridge_discovery_pipe_create(const char *argv[])
Definition JackBridge2.cpp:153
bool jackbridge_sem_timedwait(void *sem, uint msecs, bool server) noexcept
Definition JackBridge2.cpp:72
void jackbridge_sem_post(void *sem, bool server) noexcept
Definition JackBridge2.cpp:62
void jackbridge_shm_unmap(void *shm, void *ptr) noexcept
Definition JackBridge2.cpp:135
void jackbridge_parent_deathsig(bool kill) noexcept
Definition JackBridge2.cpp:207
bool jackbridge_sem_init(void *sem) noexcept
Definition JackBridge2.cpp:33
void * jackbridge_shm_map(void *shm, uint64_t size) noexcept
Definition JackBridge2.cpp:124
register unsigned i
Definition inflate.c:1575
CARLA_PLUGIN_EXPORT CarlaPipeClientHandle carla_pipe_client_new(const char *argv[], CarlaPipeCallbackFunc callbackFunc, void *callbackPtr)
Definition PipeClient.cpp:100
CARLA_PLUGIN_EXPORT void carla_pipe_client_idle(CarlaPipeClientHandle handle)
Definition PipeClient.cpp:115
CARLA_PLUGIN_EXPORT bool carla_pipe_client_flush_and_unlock(CarlaPipeClientHandle handle)
Definition PipeClient.cpp:219
CARLA_PLUGIN_EXPORT bool carla_pipe_client_is_running(CarlaPipeClientHandle handle)
Definition PipeClient.cpp:122
CARLA_PLUGIN_EXPORT void carla_pipe_client_destroy(CarlaPipeClientHandle handle)
Definition PipeClient.cpp:202
CARLA_PLUGIN_EXPORT bool carla_pipe_client_write_and_fix_msg(CarlaPipeClientHandle handle, const char *msg)
Definition PipeClient.cpp:178
CARLA_PLUGIN_EXPORT void carla_pipe_client_lock(CarlaPipeClientHandle handle)
Definition PipeClient.cpp:129
CARLA_PLUGIN_EXPORT bool carla_pipe_client_write_msg(CarlaPipeClientHandle handle, const char *msg)
Definition PipeClient.cpp:171
static PuglViewHint int value
Definition pugl.h:1708
char * argv[]
Definition unzip.c:738
static const char * name
Definition pugl.h:1582
lo_server server
Definition guimain.cpp:28
const char * msg
Definition missing_descriptor.c:20
ZCONST char * key
Definition crypt.c:587
ulg size
Definition extract.c:2350
#define void
Definition unzip.h:396