Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CarlaPipeUtils.cpp 51KB

10 years ago
9 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
6 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
9 years ago
9 years ago
9 years ago
9 years ago
7 years ago
7 years ago
10 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893
  1. /*
  2. * Carla Pipe Utilities
  3. * Copyright (C) 2013-2019 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "CarlaPipeUtils.hpp"
  18. #include "CarlaProcessUtils.hpp"
  19. #include "CarlaString.hpp"
  20. #include "CarlaMIDI.h"
  21. // needed for atom-util
  22. #ifndef nullptr
  23. # undef NULL
  24. # define NULL nullptr
  25. #endif
  26. #ifdef BUILDING_CARLA
  27. # include "lv2/atom-util.h"
  28. #else
  29. # include "lv2/lv2plug.in/ns/ext/atom/util.h"
  30. #endif
  31. #include <fcntl.h>
  32. #include "water/misc/Time.h"
  33. #include "water/text/String.h"
  34. #ifdef CARLA_OS_WIN
  35. # include <ctime>
  36. #else
  37. # include <cerrno>
  38. # include <signal.h>
  39. # include <sys/wait.h>
  40. # ifdef CARLA_OS_LINUX
  41. # include <sys/prctl.h>
  42. # ifndef F_SETPIPE_SZ
  43. # define F_SETPIPE_SZ 1031
  44. # endif
  45. # endif
  46. #endif
  47. #ifdef CARLA_OS_WIN
  48. # define INVALID_PIPE_VALUE INVALID_HANDLE_VALUE
  49. #else
  50. # define INVALID_PIPE_VALUE -1
  51. #endif
  52. #ifdef CARLA_OS_WIN
  53. // -----------------------------------------------------------------------
  54. // win32 stuff
  55. static inline
  56. bool waitForAsyncObject(const HANDLE object, const HANDLE process = INVALID_HANDLE_VALUE)
  57. {
  58. DWORD dw, dw2;
  59. MSG msg;
  60. // we give it a max
  61. for (int i=20000; --i>=0;)
  62. {
  63. if (process != INVALID_HANDLE_VALUE)
  64. {
  65. switch (WaitForSingleObject(process, 0))
  66. {
  67. case WAIT_OBJECT_0:
  68. case -1:
  69. carla_stderr("waitForAsyncObject process has stopped");
  70. return false;
  71. }
  72. }
  73. carla_debug("waitForAsyncObject loop start");
  74. dw = ::MsgWaitForMultipleObjectsEx(1, &object, INFINITE, QS_POSTMESSAGE|QS_TIMER, 0);
  75. carla_debug("waitForAsyncObject initial code is: %u", dw);
  76. if (dw == WAIT_OBJECT_0)
  77. {
  78. carla_debug("waitForAsyncObject WAIT_OBJECT_0");
  79. return true;
  80. }
  81. dw2 = ::GetLastError();
  82. if (dw == WAIT_OBJECT_0 + 1)
  83. {
  84. carla_debug("waitForAsyncObject loop +1");
  85. while (::PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
  86. ::DispatchMessage(&msg);
  87. continue;
  88. }
  89. if (dw2 == 0)
  90. {
  91. carla_debug("waitForAsyncObject loop stop");
  92. return true;
  93. }
  94. carla_stderr2("waitForAsyncObject loop end reached, error was: %u", dw2);
  95. carla_msleep(5);
  96. }
  97. carla_stderr2("waitForAsyncObject reached the end, this should not happen");
  98. return false;
  99. }
  100. static inline
  101. ssize_t ReadFileWin32(const HANDLE pipeh, const HANDLE event, void* const buf, const std::size_t numBytes)
  102. {
  103. DWORD dw, dsize = numBytes;
  104. DWORD available = 0;
  105. if (::PeekNamedPipe(pipeh, nullptr, 0, nullptr, &available, nullptr) == FALSE || available == 0)
  106. return -1;
  107. OVERLAPPED ov;
  108. carla_zeroStruct(ov);
  109. ov.hEvent = event;
  110. if (::ReadFile(pipeh, buf, dsize, nullptr, &ov))
  111. {
  112. if (! ::GetOverlappedResult(pipeh, &ov, &dw, FALSE))
  113. {
  114. carla_stderr("ReadFileWin32 GetOverlappedResult failed, error was: %u", ::GetLastError());
  115. return -1;
  116. }
  117. return static_cast<ssize_t>(dsize);
  118. }
  119. dw = ::GetLastError();
  120. if (dw == ERROR_IO_PENDING)
  121. {
  122. if (! waitForAsyncObject(event))
  123. {
  124. carla_stderr("ReadFileWin32 waitForAsyncObject failed, error was: %u", ::GetLastError());
  125. return -1;
  126. }
  127. if (! ::GetOverlappedResult(pipeh, &ov, &dw, FALSE))
  128. {
  129. carla_stderr("ReadFileWin32 GetOverlappedResult of pending failed, error was: %u", ::GetLastError());
  130. return -1;
  131. }
  132. return static_cast<ssize_t>(dsize);
  133. }
  134. carla_stderr("ReadFileWin32 failed, error was: %u", dw);
  135. return -1;
  136. }
  137. static inline
  138. ssize_t WriteFileWin32(const HANDLE pipeh, const HANDLE event, const void* const buf, const std::size_t numBytes)
  139. {
  140. DWORD dw, dsize = numBytes;
  141. OVERLAPPED ov;
  142. carla_zeroStruct(ov);
  143. ov.hEvent = event;
  144. if (::WriteFile(pipeh, buf, dsize, nullptr, &ov))
  145. {
  146. if (! ::GetOverlappedResult(pipeh, &ov, &dw, FALSE))
  147. {
  148. carla_stderr("WriteFileWin32 GetOverlappedResult failed, error was: %u", ::GetLastError());
  149. return -1;
  150. }
  151. return static_cast<ssize_t>(dsize);
  152. }
  153. dw = ::GetLastError();
  154. if (dw == ERROR_IO_PENDING)
  155. {
  156. if (! waitForAsyncObject(event))
  157. {
  158. carla_stderr("WriteFileWin32 waitForAsyncObject failed, error was: %u", ::GetLastError());
  159. return -1;
  160. }
  161. if (! ::GetOverlappedResult(pipeh, &ov, &dw, FALSE))
  162. {
  163. carla_stderr("WriteFileWin32 GetOverlappedResult of pending failed, error was: %u", ::GetLastError());
  164. return -1;
  165. }
  166. return static_cast<ssize_t>(dsize);
  167. }
  168. if (dw == ERROR_PIPE_NOT_CONNECTED)
  169. {
  170. carla_stdout("WriteFileWin32 failed, client has closed");
  171. return -2;
  172. }
  173. carla_stderr("WriteFileWin32 failed, error was: %u", dw);
  174. return -1;
  175. }
  176. #endif // CARLA_OS_WIN
  177. // -----------------------------------------------------------------------
  178. // startProcess
  179. #ifdef CARLA_OS_WIN
  180. static inline
  181. bool startProcess(const char* const argv[], PROCESS_INFORMATION* const processInfo)
  182. {
  183. CARLA_SAFE_ASSERT_RETURN(processInfo != nullptr, false);
  184. using water::String;
  185. String command;
  186. for (int i=0; argv[i] != nullptr; ++i)
  187. {
  188. String arg(argv[i]);
  189. // If there are spaces, surround it with quotes. If there are quotes,
  190. // replace them with \" so that CommandLineToArgv will correctly parse them.
  191. if (arg.containsAnyOf("\" "))
  192. arg = arg.replace("\"", "\\\"").quoted();
  193. command << arg << ' ';
  194. }
  195. command = command.trim();
  196. STARTUPINFO startupInfo;
  197. carla_zeroStruct(startupInfo);
  198. startupInfo.cb = sizeof(startupInfo);
  199. return ::CreateProcess(nullptr, const_cast<LPSTR>(command.toRawUTF8()),
  200. nullptr, nullptr, TRUE, CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT,
  201. nullptr, nullptr, &startupInfo, processInfo) != FALSE;
  202. }
  203. static inline
  204. bool waitForClientConnect(const HANDLE pipe, const HANDLE event, const HANDLE process, const uint32_t timeOutMilliseconds) noexcept
  205. {
  206. CARLA_SAFE_ASSERT_RETURN(pipe != INVALID_PIPE_VALUE, false);
  207. CARLA_SAFE_ASSERT_RETURN(timeOutMilliseconds > 0, false);
  208. DWORD dw;
  209. OVERLAPPED ov;
  210. carla_zeroStruct(ov);
  211. ov.hEvent = event;
  212. const uint32_t timeoutEnd(water::Time::getMillisecondCounter() + timeOutMilliseconds);
  213. for (;;)
  214. {
  215. if (::ConnectNamedPipe(pipe, &ov))
  216. {
  217. if (! ::GetOverlappedResult(pipe, &ov, &dw, FALSE))
  218. {
  219. carla_stderr2("ConnectNamedPipe GetOverlappedResult failed, error was: %u", ::GetLastError());
  220. return false;
  221. }
  222. return true;
  223. }
  224. const DWORD err = ::GetLastError();
  225. switch (err)
  226. {
  227. case ERROR_PIPE_CONNECTED:
  228. return true;
  229. case ERROR_IO_PENDING:
  230. if (! waitForAsyncObject(event, process))
  231. {
  232. carla_stderr2("ConnectNamedPipe waitForAsyncObject failed, error was: %u", ::GetLastError());
  233. return false;
  234. }
  235. if (! ::GetOverlappedResult(pipe, &ov, &dw, FALSE))
  236. {
  237. carla_stderr2("ConnectNamedPipe GetOverlappedResult of pending failed, error was: %u", ::GetLastError());
  238. return false;
  239. }
  240. return true;
  241. case ERROR_PIPE_LISTENING:
  242. if (water::Time::getMillisecondCounter() < timeoutEnd)
  243. {
  244. carla_msleep(5);
  245. continue;
  246. }
  247. carla_stderr2("ConnectNamedPipe listening timed out");
  248. return false;
  249. default:
  250. carla_stderr2("ConnectNamedPipe failed, error was: %u", err);
  251. return false;
  252. }
  253. }
  254. return true;
  255. }
  256. #else
  257. static inline
  258. bool startProcess(const char* const argv[], pid_t& pidinst) noexcept
  259. {
  260. const ScopedEnvVar sev1("LD_LIBRARY_PATH", nullptr);
  261. const ScopedEnvVar sev2("LD_PRELOAD", nullptr);
  262. const pid_t ret = pidinst = vfork();
  263. switch (ret)
  264. {
  265. case 0: { // child process
  266. execvp(argv[0], const_cast<char* const*>(argv));
  267. CarlaString error(std::strerror(errno));
  268. carla_stderr2("exec failed: %s", error.buffer());
  269. _exit(1); // this is not noexcept safe but doesn't matter anyway
  270. } break;
  271. case -1: { // error
  272. CarlaString error(std::strerror(errno));
  273. carla_stderr2("vfork() failed: %s", error.buffer());
  274. } break;
  275. }
  276. return (ret > 0);
  277. }
  278. #endif
  279. // -----------------------------------------------------------------------
  280. // waitForClientFirstMessage
  281. template<typename P>
  282. static inline
  283. bool waitForClientFirstMessage(const P& pipe, void* const ovRecv, void* const process, const uint32_t timeOutMilliseconds) noexcept
  284. {
  285. CARLA_SAFE_ASSERT_RETURN(pipe != INVALID_PIPE_VALUE, false);
  286. CARLA_SAFE_ASSERT_RETURN(timeOutMilliseconds > 0, false);
  287. char c;
  288. ssize_t ret;
  289. const uint32_t timeoutEnd(water::Time::getMillisecondCounter() + timeOutMilliseconds);
  290. #ifdef CARLA_OS_WIN
  291. if (! waitForClientConnect(pipe, (HANDLE)ovRecv, (HANDLE)process, timeOutMilliseconds))
  292. return false;
  293. #endif
  294. for (;;)
  295. {
  296. try {
  297. #ifdef CARLA_OS_WIN
  298. ret = ReadFileWin32(pipe, (HANDLE)ovRecv, &c, 1);
  299. #else
  300. ret = ::read(pipe, &c, 1);
  301. #endif
  302. } CARLA_SAFE_EXCEPTION_RETURN("read pipe", false);
  303. switch (ret)
  304. {
  305. case 1:
  306. if (c == '\n')
  307. return true;
  308. carla_stderr("waitForClientFirstMessage() - read has wrong first char '%c'", c);return false;
  309. return false;
  310. case -1: // failed to read
  311. #ifdef CARLA_OS_WIN
  312. if (::GetLastError() == ERROR_NO_DATA)
  313. #else
  314. if (errno == EAGAIN)
  315. #endif
  316. {
  317. if (water::Time::getMillisecondCounter() < timeoutEnd)
  318. {
  319. carla_msleep(5);
  320. continue;
  321. }
  322. carla_stderr("waitForClientFirstMessage() - read timed out");
  323. }
  324. else
  325. {
  326. #ifdef CARLA_OS_WIN
  327. carla_stderr("waitForClientFirstMessage() - read failed");
  328. #else
  329. CarlaString error(std::strerror(errno));
  330. carla_stderr("waitForClientFirstMessage() - read failed: %s", error.buffer());
  331. #endif
  332. }
  333. return false;
  334. default: // ???
  335. carla_stderr("waitForClientFirstMessage() - read returned %i", int(ret));
  336. return false;
  337. }
  338. }
  339. // maybe unused
  340. (void)ovRecv; (void)process;
  341. }
  342. // -----------------------------------------------------------------------
  343. // waitForChildToStop / waitForProcessToStop
  344. #ifdef CARLA_OS_WIN
  345. static inline
  346. bool waitForProcessToStop(const HANDLE process, const uint32_t timeOutMilliseconds, bool sendTerminate) noexcept
  347. {
  348. CARLA_SAFE_ASSERT_RETURN(process != INVALID_HANDLE_VALUE, false);
  349. CARLA_SAFE_ASSERT_RETURN(timeOutMilliseconds > 0, false);
  350. const uint32_t timeoutEnd(water::Time::getMillisecondCounter() + timeOutMilliseconds);
  351. for (;;)
  352. {
  353. switch (::WaitForSingleObject(process, 0))
  354. {
  355. case WAIT_OBJECT_0:
  356. case -1:
  357. return true;
  358. }
  359. if (sendTerminate)
  360. {
  361. sendTerminate = false;
  362. ::TerminateProcess(process, 15);
  363. }
  364. if (water::Time::getMillisecondCounter() >= timeoutEnd)
  365. break;
  366. carla_msleep(5);
  367. }
  368. return false;
  369. }
  370. static inline
  371. void waitForProcessToStopOrKillIt(const HANDLE process, const uint32_t timeOutMilliseconds) noexcept
  372. {
  373. CARLA_SAFE_ASSERT_RETURN(process != INVALID_HANDLE_VALUE,);
  374. CARLA_SAFE_ASSERT_RETURN(timeOutMilliseconds > 0,);
  375. if (! waitForProcessToStop(process, timeOutMilliseconds, true))
  376. {
  377. carla_stderr("waitForProcessToStopOrKillIt() - process didn't stop, force termination");
  378. if (::TerminateProcess(process, 9) != FALSE)
  379. {
  380. // wait for process to stop
  381. waitForProcessToStop(process, timeOutMilliseconds, false);
  382. }
  383. }
  384. }
  385. #else
  386. static inline
  387. bool waitForChildToStop(const pid_t pid, const uint32_t timeOutMilliseconds, bool sendTerminate) noexcept
  388. {
  389. CARLA_SAFE_ASSERT_RETURN(pid > 0, false);
  390. CARLA_SAFE_ASSERT_RETURN(timeOutMilliseconds > 0, false);
  391. pid_t ret;
  392. const uint32_t timeoutEnd(water::Time::getMillisecondCounter() + timeOutMilliseconds);
  393. for (;;)
  394. {
  395. try {
  396. ret = ::waitpid(pid, nullptr, WNOHANG);
  397. } CARLA_SAFE_EXCEPTION_BREAK("waitpid");
  398. switch (ret)
  399. {
  400. case -1:
  401. if (errno == ECHILD)
  402. {
  403. // success, child doesn't exist
  404. return true;
  405. }
  406. else
  407. {
  408. CarlaString error(std::strerror(errno));
  409. carla_stderr("waitForChildToStop() - waitpid failed: %s", error.buffer());
  410. return false;
  411. }
  412. break;
  413. case 0:
  414. if (sendTerminate)
  415. {
  416. sendTerminate = false;
  417. ::kill(pid, SIGTERM);
  418. }
  419. if (water::Time::getMillisecondCounter() < timeoutEnd)
  420. {
  421. carla_msleep(5);
  422. continue;
  423. }
  424. carla_stderr("waitForChildToStop() - timed out");
  425. break;
  426. default:
  427. if (ret == pid)
  428. {
  429. // success
  430. return true;
  431. }
  432. else
  433. {
  434. carla_stderr("waitForChildToStop() - got wrong pid %i (requested was %i)", int(ret), int(pid));
  435. return false;
  436. }
  437. }
  438. break;
  439. }
  440. return false;
  441. }
  442. static inline
  443. void waitForChildToStopOrKillIt(pid_t& pid, const uint32_t timeOutMilliseconds) noexcept
  444. {
  445. CARLA_SAFE_ASSERT_RETURN(pid > 0,);
  446. CARLA_SAFE_ASSERT_RETURN(timeOutMilliseconds > 0,);
  447. if (! waitForChildToStop(pid, timeOutMilliseconds, true))
  448. {
  449. carla_stderr("waitForChildToStopOrKillIt() - process didn't stop, force killing");
  450. if (::kill(pid, SIGKILL) != -1)
  451. {
  452. // wait for killing to take place
  453. waitForChildToStop(pid, timeOutMilliseconds, false);
  454. }
  455. else
  456. {
  457. CarlaString error(std::strerror(errno));
  458. carla_stderr("waitForChildToStopOrKillIt() - kill failed: %s", error.buffer());
  459. }
  460. }
  461. }
  462. #endif
  463. // -----------------------------------------------------------------------
  464. struct CarlaPipeCommon::PrivateData {
  465. // pipes
  466. #ifdef CARLA_OS_WIN
  467. PROCESS_INFORMATION processInfo;
  468. HANDLE pipeRecv;
  469. HANDLE pipeSend;
  470. HANDLE ovRecv;
  471. HANDLE ovSend;
  472. #else
  473. pid_t pid;
  474. int pipeRecv;
  475. int pipeSend;
  476. #endif
  477. // read functions must only be called in context of idlePipe()
  478. bool isReading;
  479. // the client side is closing down, only waiting for response from server
  480. bool clientClosingDown;
  481. // other side of pipe has closed
  482. bool pipeClosed;
  483. // print error only once
  484. bool lastMessageFailed;
  485. // for debugging
  486. bool isServer;
  487. // common write lock
  488. CarlaMutex writeLock;
  489. // temporary buffers for _readline()
  490. mutable char tmpBuf[0xff+1];
  491. mutable CarlaString tmpStr;
  492. PrivateData() noexcept
  493. #ifdef CARLA_OS_WIN
  494. : processInfo(),
  495. #else
  496. : pid(-1),
  497. #endif
  498. pipeRecv(INVALID_PIPE_VALUE),
  499. pipeSend(INVALID_PIPE_VALUE),
  500. isReading(false),
  501. clientClosingDown(false),
  502. pipeClosed(true),
  503. lastMessageFailed(false),
  504. isServer(false),
  505. writeLock(),
  506. tmpBuf(),
  507. tmpStr()
  508. {
  509. #ifdef CARLA_OS_WIN
  510. carla_zeroStruct(processInfo);
  511. processInfo.hProcess = INVALID_HANDLE_VALUE;
  512. processInfo.hThread = INVALID_HANDLE_VALUE;
  513. ovRecv = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
  514. ovSend = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
  515. #endif
  516. carla_zeroChars(tmpBuf, 0xff+1);
  517. }
  518. CARLA_DECLARE_NON_COPY_STRUCT(PrivateData)
  519. };
  520. // -----------------------------------------------------------------------
  521. CarlaPipeCommon::CarlaPipeCommon() noexcept
  522. : pData(new PrivateData())
  523. {
  524. carla_debug("CarlaPipeCommon::CarlaPipeCommon()");
  525. }
  526. CarlaPipeCommon::~CarlaPipeCommon() /*noexcept*/
  527. {
  528. carla_debug("CarlaPipeCommon::~CarlaPipeCommon()");
  529. delete pData;
  530. }
  531. // -------------------------------------------------------------------
  532. bool CarlaPipeCommon::isPipeRunning() const noexcept
  533. {
  534. return (pData->pipeRecv != INVALID_PIPE_VALUE && pData->pipeSend != INVALID_PIPE_VALUE && ! pData->pipeClosed);
  535. }
  536. void CarlaPipeCommon::idlePipe(const bool onlyOnce) noexcept
  537. {
  538. for (;;)
  539. {
  540. const char* const msg(_readline());
  541. if (msg == nullptr)
  542. break;
  543. pData->isReading = true;
  544. if (std::strcmp(msg, "__carla-quit__") == 0)
  545. {
  546. pData->pipeClosed = true;
  547. }
  548. else if (! pData->clientClosingDown)
  549. {
  550. try {
  551. msgReceived(msg);
  552. } CARLA_SAFE_EXCEPTION("msgReceived");
  553. }
  554. pData->isReading = false;
  555. delete[] msg;
  556. if (onlyOnce || pData->pipeRecv == INVALID_PIPE_VALUE)
  557. break;
  558. }
  559. }
  560. // -------------------------------------------------------------------
  561. void CarlaPipeCommon::lockPipe() const noexcept
  562. {
  563. pData->writeLock.lock();
  564. }
  565. bool CarlaPipeCommon::tryLockPipe() const noexcept
  566. {
  567. return pData->writeLock.tryLock();
  568. }
  569. void CarlaPipeCommon::unlockPipe() const noexcept
  570. {
  571. pData->writeLock.unlock();
  572. }
  573. CarlaMutex& CarlaPipeCommon::getPipeLock() const noexcept
  574. {
  575. return pData->writeLock;
  576. }
  577. // -------------------------------------------------------------------
  578. bool CarlaPipeCommon::readNextLineAsBool(bool& value) const noexcept
  579. {
  580. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  581. if (const char* const msg = _readlineblock())
  582. {
  583. value = (std::strcmp(msg, "true") == 0);
  584. delete[] msg;
  585. return true;
  586. }
  587. return false;
  588. }
  589. bool CarlaPipeCommon::readNextLineAsByte(uint8_t& value) const noexcept
  590. {
  591. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  592. if (const char* const msg = _readlineblock())
  593. {
  594. int tmp = std::atoi(msg);
  595. delete[] msg;
  596. if (tmp >= 0 && tmp <= 0xFF)
  597. {
  598. value = static_cast<uint8_t>(tmp);
  599. return true;
  600. }
  601. }
  602. return false;
  603. }
  604. bool CarlaPipeCommon::readNextLineAsInt(int32_t& value) const noexcept
  605. {
  606. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  607. if (const char* const msg = _readlineblock())
  608. {
  609. value = std::atoi(msg);
  610. delete[] msg;
  611. return true;
  612. }
  613. return false;
  614. }
  615. bool CarlaPipeCommon::readNextLineAsUInt(uint32_t& value) const noexcept
  616. {
  617. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  618. if (const char* const msg = _readlineblock())
  619. {
  620. const int32_t tmp = std::atoi(msg);
  621. delete[] msg;
  622. if (tmp >= 0)
  623. {
  624. value = static_cast<uint32_t>(tmp);
  625. return true;
  626. }
  627. }
  628. return false;
  629. }
  630. bool CarlaPipeCommon::readNextLineAsLong(int64_t& value) const noexcept
  631. {
  632. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  633. if (const char* const msg = _readlineblock())
  634. {
  635. value = std::atol(msg);
  636. delete[] msg;
  637. return true;
  638. }
  639. return false;
  640. }
  641. bool CarlaPipeCommon::readNextLineAsULong(uint64_t& value) const noexcept
  642. {
  643. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  644. if (const char* const msg = _readlineblock())
  645. {
  646. const int64_t tmp = std::atol(msg);
  647. delete[] msg;
  648. if (tmp >= 0)
  649. {
  650. value = static_cast<uint64_t>(tmp);
  651. return true;
  652. }
  653. }
  654. return false;
  655. }
  656. bool CarlaPipeCommon::readNextLineAsFloat(float& value) const noexcept
  657. {
  658. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  659. if (const char* const msg = _readlineblock())
  660. {
  661. {
  662. const CarlaScopedLocale csl;
  663. value = static_cast<float>(std::atof(msg));
  664. }
  665. delete[] msg;
  666. return true;
  667. }
  668. return false;
  669. }
  670. bool CarlaPipeCommon::readNextLineAsDouble(double& value) const noexcept
  671. {
  672. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  673. if (const char* const msg = _readlineblock())
  674. {
  675. {
  676. const CarlaScopedLocale csl;
  677. value = std::atof(msg);
  678. }
  679. delete[] msg;
  680. return true;
  681. }
  682. return false;
  683. }
  684. bool CarlaPipeCommon::readNextLineAsString(const char*& value) const noexcept
  685. {
  686. CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);
  687. if (const char* const msg = _readlineblock())
  688. {
  689. value = msg;
  690. return true;
  691. }
  692. return false;
  693. }
  694. // -------------------------------------------------------------------
  695. // must be locked before calling
  696. bool CarlaPipeCommon::writeMessage(const char* const msg) const noexcept
  697. {
  698. CARLA_SAFE_ASSERT_RETURN(msg != nullptr && msg[0] != '\0', false);
  699. if (pData->pipeClosed)
  700. return false;
  701. const std::size_t size(std::strlen(msg));
  702. CARLA_SAFE_ASSERT_RETURN(size > 0, false);
  703. CARLA_SAFE_ASSERT_RETURN(msg[size-1] == '\n', false);
  704. return _writeMsgBuffer(msg, size);
  705. }
  706. bool CarlaPipeCommon::writeMessage(const char* const msg, std::size_t size) const noexcept
  707. {
  708. CARLA_SAFE_ASSERT_RETURN(msg != nullptr && msg[0] != '\0', false);
  709. CARLA_SAFE_ASSERT_RETURN(size > 0, false);
  710. CARLA_SAFE_ASSERT_RETURN(msg[size-1] == '\n', false);
  711. if (pData->pipeClosed)
  712. return false;
  713. return _writeMsgBuffer(msg, size);
  714. }
  715. bool CarlaPipeCommon::writeAndFixMessage(const char* const msg) const noexcept
  716. {
  717. CARLA_SAFE_ASSERT_RETURN(msg != nullptr, false);
  718. if (pData->pipeClosed)
  719. return false;
  720. const std::size_t size(std::strlen(msg));
  721. char fixedMsg[size+2];
  722. if (size > 0)
  723. {
  724. std::strcpy(fixedMsg, msg);
  725. for (std::size_t i=0; i<size; ++i)
  726. {
  727. if (fixedMsg[i] == '\n')
  728. fixedMsg[i] = '\r';
  729. }
  730. if (fixedMsg[size-1] == '\r')
  731. {
  732. fixedMsg[size-1] = '\n';
  733. fixedMsg[size ] = '\0';
  734. fixedMsg[size+1] = '\0';
  735. }
  736. else
  737. {
  738. fixedMsg[size ] = '\n';
  739. fixedMsg[size+1] = '\0';
  740. }
  741. }
  742. else
  743. {
  744. fixedMsg[0] = '\n';
  745. fixedMsg[1] = '\0';
  746. }
  747. return _writeMsgBuffer(fixedMsg, size+1);
  748. }
  749. bool CarlaPipeCommon::writeEmptyMessage() const noexcept
  750. {
  751. if (pData->pipeClosed)
  752. return false;
  753. return _writeMsgBuffer("\n", 1);
  754. }
  755. bool CarlaPipeCommon::flushMessages() const noexcept
  756. {
  757. CARLA_SAFE_ASSERT_RETURN(pData->pipeSend != INVALID_PIPE_VALUE, false);
  758. #if defined(CARLA_OS_LINUX) || defined(CARLA_OS_GNU_HURD)
  759. # if defined(__GLIBC__) && (__GLIBC__ * 1000 + __GLIBC_MINOR__) >= 2014
  760. // the only call that seems to do something
  761. return ::syncfs(pData->pipeSend) == 0;
  762. # endif
  763. #elif 0 // defined(CARLA_OS_WIN)
  764. // FIXME causes issues
  765. try {
  766. return (::FlushFileBuffers(pData->pipeSend) != FALSE);
  767. } CARLA_SAFE_EXCEPTION_RETURN("CarlaPipeCommon::writeMsgBuffer", false);
  768. #endif
  769. return true;
  770. }
  771. // -------------------------------------------------------------------
  772. void CarlaPipeCommon::writeErrorMessage(const char* const error) const noexcept
  773. {
  774. CARLA_SAFE_ASSERT_RETURN(error != nullptr && error[0] != '\0',);
  775. const CarlaMutexLocker cml(pData->writeLock);
  776. if (! _writeMsgBuffer("error\n", 6))
  777. return;
  778. if (! writeAndFixMessage(error))
  779. return;
  780. flushMessages();
  781. }
  782. void CarlaPipeCommon::writeControlMessage(const uint32_t index, const float value) const noexcept
  783. {
  784. char tmpBuf[0xff+1];
  785. tmpBuf[0xff] = '\0';
  786. const CarlaMutexLocker cml(pData->writeLock);
  787. if (! _writeMsgBuffer("control\n", 8))
  788. return;
  789. std::snprintf(tmpBuf, 0xff, "%i\n", index);
  790. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  791. return;
  792. {
  793. const CarlaScopedLocale csl;
  794. std::snprintf(tmpBuf, 0xff, "%f\n", static_cast<double>(value));
  795. }
  796. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  797. return;
  798. flushMessages();
  799. }
  800. void CarlaPipeCommon::writeConfigureMessage(const char* const key, const char* const value) const noexcept
  801. {
  802. CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',);
  803. CARLA_SAFE_ASSERT_RETURN(value != nullptr,);
  804. const CarlaMutexLocker cml(pData->writeLock);
  805. if (! _writeMsgBuffer("configure\n", 10))
  806. return;
  807. if (! writeAndFixMessage(key))
  808. return;
  809. if (! writeAndFixMessage(value))
  810. return;
  811. flushMessages();
  812. }
  813. void CarlaPipeCommon::writeProgramMessage(const uint32_t index) const noexcept
  814. {
  815. char tmpBuf[0xff+1];
  816. tmpBuf[0xff] = '\0';
  817. const CarlaMutexLocker cml(pData->writeLock);
  818. if (! _writeMsgBuffer("program\n", 8))
  819. return;
  820. std::snprintf(tmpBuf, 0xff, "%i\n", index);
  821. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  822. return;
  823. flushMessages();
  824. }
  825. void CarlaPipeCommon::writeProgramMessage(const uint8_t channel, const uint32_t bank, const uint32_t program) const noexcept
  826. {
  827. char tmpBuf[0xff+1];
  828. tmpBuf[0xff] = '\0';
  829. const CarlaMutexLocker cml(pData->writeLock);
  830. if (! _writeMsgBuffer("program\n", 8))
  831. return;
  832. std::snprintf(tmpBuf, 0xff, "%i\n", channel);
  833. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  834. return;
  835. std::snprintf(tmpBuf, 0xff, "%i\n", bank);
  836. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  837. return;
  838. std::snprintf(tmpBuf, 0xff, "%i\n", program);
  839. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  840. return;
  841. flushMessages();
  842. }
  843. void CarlaPipeCommon::writeMidiProgramMessage(const uint32_t bank, const uint32_t program) const noexcept
  844. {
  845. char tmpBuf[0xff+1];
  846. tmpBuf[0xff] = '\0';
  847. const CarlaMutexLocker cml(pData->writeLock);
  848. if (! _writeMsgBuffer("midiprogram\n", 12))
  849. return;
  850. std::snprintf(tmpBuf, 0xff, "%i\n", bank);
  851. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  852. return;
  853. std::snprintf(tmpBuf, 0xff, "%i\n", program);
  854. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  855. return;
  856. flushMessages();
  857. }
  858. void CarlaPipeCommon::writeReloadProgramsMessage(const int32_t index) const noexcept
  859. {
  860. char tmpBuf[0xff+1];
  861. tmpBuf[0xff] = '\0';
  862. const CarlaMutexLocker cml(pData->writeLock);
  863. if (! _writeMsgBuffer("reloadprograms\n", 15))
  864. return;
  865. std::snprintf(tmpBuf, 0xff, "%i\n", index);
  866. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  867. return;
  868. flushMessages();
  869. }
  870. void CarlaPipeCommon::writeMidiNoteMessage(const bool onOff, const uint8_t channel, const uint8_t note, const uint8_t velocity) const noexcept
  871. {
  872. CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,);
  873. CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_NOTE,);
  874. CARLA_SAFE_ASSERT_RETURN(velocity < MAX_MIDI_VALUE,);
  875. char tmpBuf[0xff+1];
  876. tmpBuf[0xff] = '\0';
  877. const CarlaMutexLocker cml(pData->writeLock);
  878. if (! _writeMsgBuffer("note\n", 5))
  879. return;
  880. std::snprintf(tmpBuf, 0xff, "%s\n", bool2str(onOff));
  881. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  882. return;
  883. std::snprintf(tmpBuf, 0xff, "%i\n", channel);
  884. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  885. return;
  886. std::snprintf(tmpBuf, 0xff, "%i\n", note);
  887. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  888. return;
  889. std::snprintf(tmpBuf, 0xff, "%i\n", velocity);
  890. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  891. return;
  892. flushMessages();
  893. }
  894. void CarlaPipeCommon::writeLv2AtomMessage(const uint32_t index, const LV2_Atom* const atom) const noexcept
  895. {
  896. CARLA_SAFE_ASSERT_RETURN(atom != nullptr,);
  897. char tmpBuf[0xff+1];
  898. tmpBuf[0xff] = '\0';
  899. const uint32_t atomTotalSize(lv2_atom_total_size(atom));
  900. CarlaString base64atom(CarlaString::asBase64(atom, atomTotalSize));
  901. const CarlaMutexLocker cml(pData->writeLock);
  902. if (! _writeMsgBuffer("atom\n", 5))
  903. return;
  904. std::snprintf(tmpBuf, 0xff, "%i\n", index);
  905. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  906. return;
  907. std::snprintf(tmpBuf, 0xff, "%i\n", atomTotalSize);
  908. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  909. return;
  910. if (! writeAndFixMessage(base64atom.buffer()))
  911. return;
  912. flushMessages();
  913. }
  914. void CarlaPipeCommon::writeLv2UridMessage(const uint32_t urid, const char* const uri) const noexcept
  915. {
  916. CARLA_SAFE_ASSERT_RETURN(urid != 0,);
  917. CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0',);
  918. char tmpBuf[0xff+1];
  919. tmpBuf[0xff] = '\0';
  920. const CarlaMutexLocker cml(pData->writeLock);
  921. if (! _writeMsgBuffer("urid\n", 5))
  922. return;
  923. std::snprintf(tmpBuf, 0xff, "%i\n", urid);
  924. if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
  925. return;
  926. if (! writeAndFixMessage(uri))
  927. return;
  928. flushMessages();
  929. }
  930. // -------------------------------------------------------------------
  931. // internal
  932. const char* CarlaPipeCommon::_readline() const noexcept
  933. {
  934. CARLA_SAFE_ASSERT_RETURN(pData->pipeRecv != INVALID_PIPE_VALUE, nullptr);
  935. char c;
  936. char* ptr = pData->tmpBuf;
  937. ssize_t ret = -1;
  938. pData->tmpStr.clear();
  939. for (int i=0; i<0xff; ++i)
  940. {
  941. try {
  942. #ifdef CARLA_OS_WIN
  943. ret = ReadFileWin32(pData->pipeRecv, pData->ovRecv, &c, 1);
  944. #else
  945. ret = ::read(pData->pipeRecv, &c, 1);
  946. #endif
  947. } CARLA_SAFE_EXCEPTION_BREAK("CarlaPipeCommon::readline() - read");
  948. if (ret != 1 || c == '\n')
  949. break;
  950. if (c == '\r')
  951. c = '\n';
  952. *ptr++ = c;
  953. if (i+1 == 0xff)
  954. {
  955. i = 0;
  956. *ptr = '\0';
  957. pData->tmpStr += pData->tmpBuf;
  958. ptr = pData->tmpBuf;
  959. }
  960. }
  961. if (ptr != pData->tmpBuf)
  962. {
  963. *ptr = '\0';
  964. pData->tmpStr += pData->tmpBuf;
  965. }
  966. else if (pData->tmpStr.isEmpty() && ret != 1)
  967. {
  968. // some error
  969. return nullptr;
  970. }
  971. try {
  972. return pData->tmpStr.dup();
  973. } CARLA_SAFE_EXCEPTION_RETURN("CarlaPipeCommon::readline() - dup", nullptr);
  974. }
  975. const char* CarlaPipeCommon::_readlineblock(const uint32_t timeOutMilliseconds) const noexcept
  976. {
  977. const uint32_t timeoutEnd(water::Time::getMillisecondCounter() + timeOutMilliseconds);
  978. for (;;)
  979. {
  980. if (const char* const msg = _readline())
  981. return msg;
  982. if (water::Time::getMillisecondCounter() >= timeoutEnd)
  983. break;
  984. carla_msleep(5);
  985. }
  986. if (std::getenv("CARLA_VALGRIND_TEST") != nullptr)
  987. {
  988. const uint32_t timeoutEnd2(water::Time::getMillisecondCounter() + 1000);
  989. for (;;)
  990. {
  991. if (const char* const msg = _readline())
  992. return msg;
  993. if (water::Time::getMillisecondCounter() >= timeoutEnd2)
  994. break;
  995. carla_msleep(100);
  996. }
  997. }
  998. carla_stderr("readlineblock timed out");
  999. return nullptr;
  1000. }
  1001. bool CarlaPipeCommon::_writeMsgBuffer(const char* const msg, const std::size_t size) const noexcept
  1002. {
  1003. if (pData->pipeClosed)
  1004. return false;
  1005. if (pData->pipeSend == INVALID_PIPE_VALUE)
  1006. {
  1007. carla_stderr2("CarlaPipe write error, isServer:%s, message was:\n%s", bool2str(pData->isServer), msg);
  1008. return false;
  1009. }
  1010. ssize_t ret;
  1011. try {
  1012. #ifdef CARLA_OS_WIN
  1013. ret = WriteFileWin32(pData->pipeSend, pData->ovSend, msg, size);
  1014. #else
  1015. ret = ::write(pData->pipeSend, msg, size);
  1016. #endif
  1017. } CARLA_SAFE_EXCEPTION_RETURN("CarlaPipeCommon::writeMsgBuffer", false);
  1018. #ifdef CARLA_OS_WIN
  1019. if (ret == -2)
  1020. {
  1021. pData->pipeClosed = true;
  1022. return false;
  1023. }
  1024. #endif
  1025. if (ret == static_cast<ssize_t>(size))
  1026. {
  1027. if (pData->lastMessageFailed)
  1028. pData->lastMessageFailed = false;
  1029. return true;
  1030. }
  1031. if (! pData->lastMessageFailed)
  1032. {
  1033. pData->lastMessageFailed = true;
  1034. fprintf(stderr,
  1035. "CarlaPipeCommon::_writeMsgBuffer(..., " P_SIZE ") - failed with " P_SSIZE " (%s), message was:\n%s",
  1036. size, ret, bool2str(pData->isServer), msg);
  1037. }
  1038. return false;
  1039. }
  1040. // -----------------------------------------------------------------------
  1041. CarlaPipeServer::CarlaPipeServer() noexcept
  1042. : CarlaPipeCommon()
  1043. {
  1044. carla_debug("CarlaPipeServer::CarlaPipeServer()");
  1045. pData->isServer = true;
  1046. }
  1047. CarlaPipeServer::~CarlaPipeServer() /*noexcept*/
  1048. {
  1049. carla_debug("CarlaPipeServer::~CarlaPipeServer()");
  1050. stopPipeServer(5*1000);
  1051. }
  1052. uintptr_t CarlaPipeServer::getPID() const noexcept
  1053. {
  1054. #ifndef CARLA_OS_WIN
  1055. return static_cast<uintptr_t>(pData->pid);
  1056. #else
  1057. return 0;
  1058. #endif
  1059. }
  1060. // --------------------------------------------------------------------------------------------------------------------
  1061. bool CarlaPipeServer::startPipeServer(const char* const filename,
  1062. const char* const arg1,
  1063. const char* const arg2,
  1064. const int size) noexcept
  1065. {
  1066. CARLA_SAFE_ASSERT_RETURN(pData->pipeRecv == INVALID_PIPE_VALUE, false);
  1067. CARLA_SAFE_ASSERT_RETURN(pData->pipeSend == INVALID_PIPE_VALUE, false);
  1068. #ifdef CARLA_OS_WIN
  1069. CARLA_SAFE_ASSERT_RETURN(pData->processInfo.hThread == INVALID_HANDLE_VALUE, false);
  1070. CARLA_SAFE_ASSERT_RETURN(pData->processInfo.hProcess == INVALID_HANDLE_VALUE, false);
  1071. #else
  1072. CARLA_SAFE_ASSERT_RETURN(pData->pid == -1, false);
  1073. #endif
  1074. CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
  1075. CARLA_SAFE_ASSERT_RETURN(arg1 != nullptr, false);
  1076. CARLA_SAFE_ASSERT_RETURN(arg2 != nullptr, false);
  1077. carla_debug("CarlaPipeServer::startPipeServer(\"%s\", \"%s\", \"%s\")", filename, arg1, arg2);
  1078. char pipeRecvServerStr[100+1];
  1079. char pipeSendServerStr[100+1];
  1080. char pipeRecvClientStr[100+1];
  1081. char pipeSendClientStr[100+1];
  1082. pipeRecvServerStr[100] = '\0';
  1083. pipeSendServerStr[100] = '\0';
  1084. pipeRecvClientStr[100] = '\0';
  1085. pipeSendClientStr[100] = '\0';
  1086. const CarlaMutexLocker cml(pData->writeLock);
  1087. //-----------------------------------------------------------------------------------------------------------------
  1088. // create pipes
  1089. #ifdef CARLA_OS_WIN
  1090. HANDLE pipe1, pipe2;
  1091. std::srand(static_cast<uint>(std::time(nullptr)));
  1092. static ulong sCounter = 0;
  1093. ++sCounter;
  1094. const int randint = std::rand();
  1095. std::snprintf(pipeRecvServerStr, 100, "\\\\.\\pipe\\carla-pipe1-%i-%li", randint, sCounter);
  1096. std::snprintf(pipeSendServerStr, 100, "\\\\.\\pipe\\carla-pipe2-%i-%li", randint, sCounter);
  1097. std::snprintf(pipeRecvClientStr, 100, "ignored");
  1098. std::snprintf(pipeSendClientStr, 100, "ignored");
  1099. SECURITY_ATTRIBUTES sa;
  1100. carla_zeroStruct(sa);
  1101. sa.nLength = sizeof(sa);
  1102. sa.bInheritHandle = TRUE;
  1103. pipe1 = ::CreateNamedPipeA(pipeRecvServerStr, PIPE_ACCESS_DUPLEX|FILE_FLAG_FIRST_PIPE_INSTANCE|FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE|PIPE_READMODE_BYTE, 1, size, size, 0, &sa);
  1104. if (pipe1 == INVALID_HANDLE_VALUE)
  1105. {
  1106. fail("pipe creation failed");
  1107. return false;
  1108. }
  1109. pipe2 = ::CreateNamedPipeA(pipeSendServerStr, PIPE_ACCESS_DUPLEX|FILE_FLAG_FIRST_PIPE_INSTANCE|FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE|PIPE_READMODE_BYTE, 1, size, size, 0, &sa);
  1110. if (pipe2 == INVALID_HANDLE_VALUE)
  1111. {
  1112. try { ::CloseHandle(pipe1); } CARLA_SAFE_EXCEPTION("CloseHandle(pipe1)");
  1113. fail("pipe creation failed");
  1114. return false;
  1115. }
  1116. const HANDLE pipeRecvClient = pipe2;
  1117. const HANDLE pipeSendClient = pipe1;
  1118. #else
  1119. int pipe1[2]; // read by server, written by client
  1120. int pipe2[2]; // read by client, written by server
  1121. if (::pipe(pipe1) != 0)
  1122. {
  1123. fail("pipe1 creation failed");
  1124. return false;
  1125. }
  1126. if (::pipe(pipe2) != 0)
  1127. {
  1128. try { ::close(pipe1[0]); } CARLA_SAFE_EXCEPTION("close(pipe1[0])");
  1129. try { ::close(pipe1[1]); } CARLA_SAFE_EXCEPTION("close(pipe1[1])");
  1130. fail("pipe2 creation failed");
  1131. return false;
  1132. }
  1133. /* */ int pipeRecvServer = pipe1[0];
  1134. /* */ int pipeSendServer = pipe2[1];
  1135. const int pipeRecvClient = pipe2[0];
  1136. const int pipeSendClient = pipe1[1];
  1137. std::snprintf(pipeRecvServerStr, 100, "%i", pipeRecvServer);
  1138. std::snprintf(pipeSendServerStr, 100, "%i", pipeSendServer);
  1139. std::snprintf(pipeRecvClientStr, 100, "%i", pipeRecvClient);
  1140. std::snprintf(pipeSendClientStr, 100, "%i", pipeSendClient);
  1141. //-----------------------------------------------------------------------------------------------------------------
  1142. // set size, non-fatal
  1143. # ifdef CARLA_OS_LINUX
  1144. try {
  1145. ::fcntl(pipeRecvClient, F_SETPIPE_SZ, size);
  1146. } CARLA_SAFE_EXCEPTION("Set pipe size");
  1147. try {
  1148. ::fcntl(pipeRecvServer, F_SETPIPE_SZ, size);
  1149. } CARLA_SAFE_EXCEPTION("Set pipe size");
  1150. # endif
  1151. //-----------------------------------------------------------------------------------------------------------------
  1152. // set non-block
  1153. int ret;
  1154. try {
  1155. ret = ::fcntl(pipeRecvClient, F_SETFL, ::fcntl(pipeRecvClient, F_GETFL) | O_NONBLOCK);
  1156. } catch (...) {
  1157. ret = -1;
  1158. fail("failed to set pipe as non-block");
  1159. }
  1160. if (ret == 0)
  1161. {
  1162. try {
  1163. ret = ::fcntl(pipeRecvServer, F_SETFL, ::fcntl(pipeRecvServer, F_GETFL) | O_NONBLOCK);
  1164. } catch (...) {
  1165. ret = -1;
  1166. fail("failed to set pipe as non-block");
  1167. }
  1168. }
  1169. if (ret < 0)
  1170. {
  1171. try { ::close(pipe1[0]); } CARLA_SAFE_EXCEPTION("close(pipe1[0])");
  1172. try { ::close(pipe1[1]); } CARLA_SAFE_EXCEPTION("close(pipe1[1])");
  1173. try { ::close(pipe2[0]); } CARLA_SAFE_EXCEPTION("close(pipe2[0])");
  1174. try { ::close(pipe2[1]); } CARLA_SAFE_EXCEPTION("close(pipe2[1])");
  1175. return false;
  1176. }
  1177. #endif
  1178. //-----------------------------------------------------------------------------------------------------------------
  1179. // set arguments
  1180. const char* argv[8];
  1181. //-----------------------------------------------------------------------------------------------------------------
  1182. // argv[0] => filename
  1183. argv[0] = filename;
  1184. //-----------------------------------------------------------------------------------------------------------------
  1185. // argv[1-2] => args
  1186. argv[1] = arg1;
  1187. argv[2] = arg2;
  1188. //-----------------------------------------------------------------------------------------------------------------
  1189. // argv[3-6] => pipes
  1190. argv[3] = pipeRecvServerStr;
  1191. argv[4] = pipeSendServerStr;
  1192. argv[5] = pipeRecvClientStr;
  1193. argv[6] = pipeSendClientStr;
  1194. //-----------------------------------------------------------------------------------------------------------------
  1195. // argv[7] => null
  1196. argv[7] = nullptr;
  1197. //-----------------------------------------------------------------------------------------------------------------
  1198. // start process
  1199. #ifdef CARLA_OS_WIN
  1200. if (! startProcess(argv, &pData->processInfo))
  1201. {
  1202. carla_zeroStruct(pData->processInfo);
  1203. pData->processInfo.hProcess = INVALID_HANDLE_VALUE;
  1204. pData->processInfo.hThread = INVALID_HANDLE_VALUE;
  1205. try { ::CloseHandle(pipe1); } CARLA_SAFE_EXCEPTION("CloseHandle(pipe1)");
  1206. try { ::CloseHandle(pipe2); } CARLA_SAFE_EXCEPTION("CloseHandle(pipe2)");
  1207. fail("startProcess() failed");
  1208. return false;
  1209. }
  1210. // just to make sure
  1211. CARLA_SAFE_ASSERT(pData->processInfo.hThread != INVALID_HANDLE_VALUE);
  1212. CARLA_SAFE_ASSERT(pData->processInfo.hProcess != INVALID_HANDLE_VALUE);
  1213. #else
  1214. if (! startProcess(argv, pData->pid))
  1215. {
  1216. pData->pid = -1;
  1217. try { ::close(pipe1[0]); } CARLA_SAFE_EXCEPTION("close(pipe1[0])");
  1218. try { ::close(pipe1[1]); } CARLA_SAFE_EXCEPTION("close(pipe1[1])");
  1219. try { ::close(pipe2[0]); } CARLA_SAFE_EXCEPTION("close(pipe2[0])");
  1220. try { ::close(pipe2[1]); } CARLA_SAFE_EXCEPTION("close(pipe2[1])");
  1221. fail("startProcess() failed");
  1222. return false;
  1223. }
  1224. //-----------------------------------------------------------------------------------------------------------------
  1225. // close duplicated handles used by the client
  1226. try { ::close(pipeRecvServer); } CARLA_SAFE_EXCEPTION("close(pipeRecvServer)");
  1227. try { ::close(pipeSendServer); } CARLA_SAFE_EXCEPTION("close(pipeSendServer)");
  1228. #endif
  1229. //-----------------------------------------------------------------------------------------------------------------
  1230. // wait for client to say something
  1231. #ifdef CARLA_OS_WIN
  1232. void* const ovRecv = pData->ovRecv;
  1233. void* const process = pData->processInfo.hProcess;
  1234. #else
  1235. void* const ovRecv = nullptr;
  1236. void* const process = nullptr;
  1237. #endif
  1238. if (waitForClientFirstMessage(pipeRecvClient, ovRecv, process, 10*1000 /* 10 secs */))
  1239. {
  1240. pData->pipeRecv = pipeRecvClient;
  1241. pData->pipeSend = pipeSendClient;
  1242. pData->pipeClosed = false;
  1243. carla_stdout("ALL OK!");
  1244. return true;
  1245. }
  1246. //-----------------------------------------------------------------------------------------------------------------
  1247. // failed to set non-block or get first child message, cannot continue
  1248. #ifdef CARLA_OS_WIN
  1249. if (::TerminateProcess(pData->processInfo.hProcess, 9) != FALSE)
  1250. {
  1251. // wait for process to stop
  1252. waitForProcessToStop(pData->processInfo.hProcess, 2*1000, false);
  1253. }
  1254. // clear pData->processInfo
  1255. try { ::CloseHandle(pData->processInfo.hThread); } CARLA_SAFE_EXCEPTION("CloseHandle(pData->processInfo.hThread)");
  1256. try { ::CloseHandle(pData->processInfo.hProcess); } CARLA_SAFE_EXCEPTION("CloseHandle(pData->processInfo.hProcess)");
  1257. carla_zeroStruct(pData->processInfo);
  1258. pData->processInfo.hProcess = INVALID_HANDLE_VALUE;
  1259. pData->processInfo.hThread = INVALID_HANDLE_VALUE;
  1260. #else
  1261. if (::kill(pData->pid, SIGKILL) != -1)
  1262. {
  1263. // wait for killing to take place
  1264. waitForChildToStop(pData->pid, 2*1000, false);
  1265. }
  1266. pData->pid = -1;
  1267. #endif
  1268. //-----------------------------------------------------------------------------------------------------------------
  1269. // close pipes
  1270. #ifdef CARLA_OS_WIN
  1271. try { ::CloseHandle(pipeRecvClient); } CARLA_SAFE_EXCEPTION("CloseHandle(pipeRecvClient)");
  1272. try { ::CloseHandle(pipeSendClient); } CARLA_SAFE_EXCEPTION("CloseHandle(pipeSendClient)");
  1273. #else
  1274. try { ::close (pipeRecvClient); } CARLA_SAFE_EXCEPTION("close(pipeRecvClient)");
  1275. try { ::close (pipeSendClient); } CARLA_SAFE_EXCEPTION("close(pipeSendClient)");
  1276. #endif
  1277. return false;
  1278. // maybe unused
  1279. (void)size; (void)ovRecv; (void)process;
  1280. }
  1281. void CarlaPipeServer::stopPipeServer(const uint32_t timeOutMilliseconds) noexcept
  1282. {
  1283. carla_debug("CarlaPipeServer::stopPipeServer(%i)", timeOutMilliseconds);
  1284. #ifdef CARLA_OS_WIN
  1285. if (pData->processInfo.hThread != INVALID_HANDLE_VALUE || pData->processInfo.hProcess != INVALID_HANDLE_VALUE)
  1286. {
  1287. const CarlaMutexLocker cml(pData->writeLock);
  1288. if (pData->pipeSend != INVALID_PIPE_VALUE)
  1289. {
  1290. if (_writeMsgBuffer("__carla-quit__\n", 15))
  1291. flushMessages();
  1292. }
  1293. waitForProcessToStopOrKillIt(pData->processInfo.hProcess, timeOutMilliseconds);
  1294. try { ::CloseHandle(pData->processInfo.hThread); } CARLA_SAFE_EXCEPTION("CloseHandle(pData->processInfo.hThread)");
  1295. try { ::CloseHandle(pData->processInfo.hProcess); } CARLA_SAFE_EXCEPTION("CloseHandle(pData->processInfo.hProcess)");
  1296. carla_zeroStruct(pData->processInfo);
  1297. pData->processInfo.hProcess = INVALID_HANDLE_VALUE;
  1298. pData->processInfo.hThread = INVALID_HANDLE_VALUE;
  1299. }
  1300. #else
  1301. if (pData->pid != -1)
  1302. {
  1303. const CarlaMutexLocker cml(pData->writeLock);
  1304. if (pData->pipeSend != INVALID_PIPE_VALUE)
  1305. {
  1306. if (_writeMsgBuffer("__carla-quit__\n", 15))
  1307. flushMessages();
  1308. }
  1309. waitForChildToStopOrKillIt(pData->pid, timeOutMilliseconds);
  1310. pData->pid = -1;
  1311. }
  1312. #endif
  1313. closePipeServer();
  1314. }
  1315. void CarlaPipeServer::closePipeServer() noexcept
  1316. {
  1317. carla_debug("CarlaPipeServer::closePipeServer()");
  1318. pData->pipeClosed = true;
  1319. const CarlaMutexLocker cml(pData->writeLock);
  1320. if (pData->pipeRecv != INVALID_PIPE_VALUE)
  1321. {
  1322. #ifdef CARLA_OS_WIN
  1323. DisconnectNamedPipe(pData->pipeRecv);
  1324. try { ::CloseHandle(pData->pipeRecv); } CARLA_SAFE_EXCEPTION("CloseHandle(pData->pipeRecv)");
  1325. #else
  1326. try { ::close (pData->pipeRecv); } CARLA_SAFE_EXCEPTION("close(pData->pipeRecv)");
  1327. #endif
  1328. pData->pipeRecv = INVALID_PIPE_VALUE;
  1329. }
  1330. if (pData->pipeSend != INVALID_PIPE_VALUE)
  1331. {
  1332. #ifdef CARLA_OS_WIN
  1333. DisconnectNamedPipe(pData->pipeSend);
  1334. try { ::CloseHandle(pData->pipeSend); } CARLA_SAFE_EXCEPTION("CloseHandle(pData->pipeSend)");
  1335. #else
  1336. try { ::close (pData->pipeSend); } CARLA_SAFE_EXCEPTION("close(pData->pipeSend)");
  1337. #endif
  1338. pData->pipeSend = INVALID_PIPE_VALUE;
  1339. }
  1340. }
  1341. void CarlaPipeServer::writeShowMessage() const noexcept
  1342. {
  1343. const CarlaMutexLocker cml(pData->writeLock);
  1344. if (! _writeMsgBuffer("show\n", 5))
  1345. return;
  1346. flushMessages();
  1347. }
  1348. void CarlaPipeServer::writeFocusMessage() const noexcept
  1349. {
  1350. const CarlaMutexLocker cml(pData->writeLock);
  1351. if (! _writeMsgBuffer("focus\n", 6))
  1352. return;
  1353. flushMessages();
  1354. }
  1355. void CarlaPipeServer::writeHideMessage() const noexcept
  1356. {
  1357. const CarlaMutexLocker cml(pData->writeLock);
  1358. if (! _writeMsgBuffer("show\n", 5))
  1359. return;
  1360. flushMessages();
  1361. }
  1362. // -----------------------------------------------------------------------
  1363. CarlaPipeClient::CarlaPipeClient() noexcept
  1364. : CarlaPipeCommon()
  1365. {
  1366. carla_debug("CarlaPipeClient::CarlaPipeClient()");
  1367. }
  1368. CarlaPipeClient::~CarlaPipeClient() /*noexcept*/
  1369. {
  1370. carla_debug("CarlaPipeClient::~CarlaPipeClient()");
  1371. closePipeClient();
  1372. }
  1373. bool CarlaPipeClient::initPipeClient(const char* argv[]) noexcept
  1374. {
  1375. CARLA_SAFE_ASSERT_RETURN(pData->pipeRecv == INVALID_PIPE_VALUE, false);
  1376. CARLA_SAFE_ASSERT_RETURN(pData->pipeSend == INVALID_PIPE_VALUE, false);
  1377. carla_debug("CarlaPipeClient::initPipeClient(%p)", argv);
  1378. const CarlaMutexLocker cml(pData->writeLock);
  1379. //----------------------------------------------------------------
  1380. // read arguments
  1381. #ifdef CARLA_OS_WIN
  1382. const char* const pipeRecvServerStr = argv[3];
  1383. const char* const pipeSendServerStr = argv[4];
  1384. HANDLE pipeRecvServer = ::CreateFileA(pipeRecvServerStr, GENERIC_READ, 0x0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
  1385. HANDLE pipeSendServer = ::CreateFileA(pipeSendServerStr, GENERIC_WRITE, 0x0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
  1386. CARLA_SAFE_ASSERT_RETURN(pipeRecvServer != INVALID_HANDLE_VALUE, false);
  1387. CARLA_SAFE_ASSERT_RETURN(pipeSendServer != INVALID_HANDLE_VALUE, false);
  1388. #else
  1389. const int pipeRecvServer = std::atoi(argv[3]);
  1390. const int pipeSendServer = std::atoi(argv[4]);
  1391. /* */ int pipeRecvClient = std::atoi(argv[5]);
  1392. /* */ int pipeSendClient = std::atoi(argv[6]);
  1393. CARLA_SAFE_ASSERT_RETURN(pipeRecvServer > 0, false);
  1394. CARLA_SAFE_ASSERT_RETURN(pipeSendServer > 0, false);
  1395. CARLA_SAFE_ASSERT_RETURN(pipeRecvClient > 0, false);
  1396. CARLA_SAFE_ASSERT_RETURN(pipeSendClient > 0, false);
  1397. //----------------------------------------------------------------
  1398. // close duplicated handles used by the client
  1399. try { ::close(pipeRecvClient); } CARLA_SAFE_EXCEPTION("close(pipeRecvClient)");
  1400. try { ::close(pipeSendClient); } CARLA_SAFE_EXCEPTION("close(pipeSendClient)");
  1401. //----------------------------------------------------------------
  1402. // kill ourselves if parent dies
  1403. carla_terminateProcessOnParentExit(false);
  1404. #endif
  1405. //----------------------------------------------------------------
  1406. // done
  1407. pData->pipeRecv = pipeRecvServer;
  1408. pData->pipeSend = pipeSendServer;
  1409. pData->pipeClosed = false;
  1410. pData->clientClosingDown = false;
  1411. if (writeMessage("\n", 1))
  1412. flushMessages();
  1413. return true;
  1414. }
  1415. void CarlaPipeClient::closePipeClient() noexcept
  1416. {
  1417. carla_debug("CarlaPipeClient::closePipeClient()");
  1418. pData->pipeClosed = true;
  1419. const CarlaMutexLocker cml(pData->writeLock);
  1420. if (pData->pipeRecv != INVALID_PIPE_VALUE)
  1421. {
  1422. #ifdef CARLA_OS_WIN
  1423. try { ::CloseHandle(pData->pipeRecv); } CARLA_SAFE_EXCEPTION("CloseHandle(pData->pipeRecv)");
  1424. #else
  1425. try { ::close (pData->pipeRecv); } CARLA_SAFE_EXCEPTION("close(pData->pipeRecv)");
  1426. #endif
  1427. pData->pipeRecv = INVALID_PIPE_VALUE;
  1428. }
  1429. if (pData->pipeSend != INVALID_PIPE_VALUE)
  1430. {
  1431. #ifdef CARLA_OS_WIN
  1432. try { ::CloseHandle(pData->pipeSend); } CARLA_SAFE_EXCEPTION("CloseHandle(pData->pipeSend)");
  1433. #else
  1434. try { ::close (pData->pipeSend); } CARLA_SAFE_EXCEPTION("close(pData->pipeSend)");
  1435. #endif
  1436. pData->pipeSend = INVALID_PIPE_VALUE;
  1437. }
  1438. }
  1439. void CarlaPipeClient::writeExitingMessageAndWait() noexcept
  1440. {
  1441. {
  1442. const CarlaMutexLocker cml(pData->writeLock);
  1443. if (_writeMsgBuffer("exiting\n", 8))
  1444. flushMessages();
  1445. }
  1446. // NOTE: no more messages are handled after this point
  1447. pData->clientClosingDown = true;
  1448. for (int i=0; i < 100 && ! pData->pipeClosed; ++i)
  1449. {
  1450. carla_msleep(50);
  1451. idlePipe(true);
  1452. }
  1453. if (! pData->pipeClosed)
  1454. carla_stderr2("writeExitingMessageAndWait pipe is still running!");
  1455. }
  1456. // -----------------------------------------------------------------------
  1457. ScopedEnvVar::ScopedEnvVar(const char* const key, const char* const value) noexcept
  1458. : fKey(nullptr),
  1459. fOrigValue(nullptr)
  1460. {
  1461. CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',);
  1462. fKey = carla_strdup_safe(key);
  1463. CARLA_SAFE_ASSERT_RETURN(fKey != nullptr,);
  1464. if (const char* const origValue = std::getenv(key))
  1465. {
  1466. fOrigValue = carla_strdup_safe(origValue);
  1467. CARLA_SAFE_ASSERT_RETURN(fOrigValue != nullptr,);
  1468. }
  1469. if (value != nullptr)
  1470. carla_setenv(key, value);
  1471. else if (fOrigValue != nullptr)
  1472. carla_unsetenv(key);
  1473. }
  1474. ScopedEnvVar::~ScopedEnvVar() noexcept
  1475. {
  1476. bool hasOrigValue = false;
  1477. if (fOrigValue != nullptr)
  1478. {
  1479. hasOrigValue = true;
  1480. carla_setenv(fKey, fOrigValue);
  1481. delete[] fOrigValue;
  1482. fOrigValue = nullptr;
  1483. }
  1484. if (fKey != nullptr)
  1485. {
  1486. if (! hasOrigValue)
  1487. carla_unsetenv(fKey);
  1488. delete[] fKey;
  1489. fKey = nullptr;
  1490. }
  1491. }
  1492. // -----------------------------------------------------------------------
  1493. #undef INVALID_PIPE_VALUE