Commit Graph

739 Commits

Author SHA1 Message Date
Robbert van der Helm f39ee82bd4 Update socket rework changelog entry 2020-10-28 01:21:56 +01:00
Robbert van der Helm bece654c2d Rename PluginContext to MainContext for clarity 2020-10-28 01:02:56 +01:00
Robbert van der Helm fac820c25a Execute all non-unsafe opcodes on calling thread
This will require more testing of course, but I think it should be safe.
This would increase the potential maximal throughput in group hosts
significantly.
2020-10-27 23:18:59 +01:00
Robbert van der Helm eb8d4ae1d8 Fix Win32Thread not capturing by move
std::function does not allow non-movable lambdas, so capturing by move
doesn't work there. And the old solution of course has issues with
dangling pointers (but because this is C++ the compiler still thinks
it's A-Ok).
2020-10-27 22:53:59 +01:00
Robbert van der Helm 1a18ea8614 Add a dependency for function2
std::function requires the function to be CopyConstructable and thus
does not allow you to capture by move, which is exactly what we need.
2020-10-27 22:53:08 +01:00
Robbert van der Helm 28886e7073 Replace all threads with Win32Thread in Wine host 2020-10-27 18:29:38 +01:00
Robbert van der Helm bafc36614b Properly forward arguments in Win32Thread 2020-10-27 18:28:23 +01:00
Robbert van der Helm a6b5951d81 Replace std::jthread with Win32Thread everywhere 2020-10-27 17:38:13 +01:00
Robbert van der Helm 59b57f48da Add a changelog entry for the thread rework 2020-10-27 17:30:18 +01:00
Robbert van der Helm 4038e198fe Replace the Win32Thread proxy functions
Now that we can use lambdas instead.
2020-10-27 17:16:20 +01:00
Robbert van der Helm 1681ec9767 Add support for lambdas to Win32Thread 2020-10-27 17:04:40 +01:00
Robbert van der Helm 058eb9f2ee Fix winedbg warning 2020-10-27 11:56:00 +01:00
Robbert van der Helm dc72dd97a5 Reword the socket rework changelog entry 2020-10-27 11:13:39 +01:00
Robbert van der Helm e51c7f7ae3 Get rid of hack_reaper_update_display
It is now no longer necessary.
2020-10-27 11:13:39 +01:00
Robbert van der Helm 5b00ddb0c4 Fall back to waiting when socket is not yet ready
This can happen with plugin groups.
2020-10-27 11:13:39 +01:00
Robbert van der Helm 016ceccc18 Mark several opcodes as unsafe
These potentially perform GUI operations and should always be handled on
the main thread.
2020-10-27 11:13:39 +01:00
Robbert van der Helm e12a56978d Reintroduce the additional IO contexts
Having these bound to the main context was not a good idea since that
would prevent sockets from being accepted on the Wine side while the
message loop is running.

Partial revert of ac17539ef3
2020-10-26 20:39:16 +01:00
Robbert van der Helm ca2b95e7aa Handle dispatch() directly during event handling
When the message loop is active and we get an incoming dispatch() event,
we'll just handle it directly. In practice this would only be needed
when the event is a response to an `audioMaster()` call made during the
event loop, but we can't know that. This allows the `getProgram()`
during `audioMasterUpdateDisplay()` in REAPER and Renoise to work
correctly. Hopefully this doesn't cause random rare breakage.
2020-10-26 20:03:54 +01:00
Robbert van der Helm c95e8aa63c Add a TODO for removing hack_reaper_update_display 2020-10-26 18:00:24 +01:00
Robbert van der Helm 4c490808c0 Add a changelog entry for the socket rework 2020-10-26 18:00:10 +01:00
Robbert van der Helm 816a2cbe01 [yabridgectl] Update Wine error detection
The usage string has changed, better to just match part of it so this
won't cause issues again in the future.
2020-10-26 17:54:41 +01:00
Robbert van der Helm e067bbbfbc Don't stop the whole IO context
This would break plugin groups since the different plugins share a
single IO context.
2020-10-26 17:44:34 +01:00
Robbert van der Helm ac17539ef3 Drop all additional IO contexts
Not really needed (since the only other thing happening in the IO
context is processing stdio from the Wine process) and it was causing
some impossible to debug malloc failures in Boost.Asio.
2020-10-26 17:32:37 +01:00
Robbert van der Helm cde7b4ec67 Properly move the sockets to the handler threads
At times like this you really wish you were writing Rust right now.
2020-10-26 15:48:57 +01:00
Robbert van der Helm 8d7826f1df Handle incoming events from off-threads separately
On the Wine side we want to handle most events on the main UI thread.
We'll assume any events coming in from a secondary socket are safe and
can be handled directly.
2020-10-26 13:45:37 +01:00
Robbert van der Helm 81efa6febe Listen for incoming secondary event requests 2020-10-26 12:58:03 +01:00
Robbert van der Helm 523ac64d11 Add a missing lock to reading from active_plugins
I've never seen this cause memory errors, but there exist a rare
situation where it could.
2020-10-26 12:45:38 +01:00
Robbert van der Helm 2f6883977f Create secondary sockets for sending nested events 2020-10-26 12:13:27 +01:00
Robbert van der Helm d82f8463d9 Use simple numerical IDs for plugins in groups
We'll be using a similar approach to identify threads for event
handlers.
2020-10-26 11:51:13 +01:00
Robbert van der Helm 74c3cab046 Move event handling logic to a dedicated class
Now all pieces are in place to allow handling events over multiple
socket connections.
2020-10-26 11:40:38 +01:00
Robbert van der Helm 54ed69c408 Merge events.h into communication.h 2020-10-25 21:37:04 +01:00
Robbert van der Helm 4b53342514 💥 Encapsulate and rework all socket logic
This is a pretty huge change that will be important for being able to
handle nested or mutually recursive `dispatch()` and `audioMaster()`
calls. This sadly all had to be done in a single commit, so here's a
summary:

- `src/common/sockets.h:Sockets` contains all sockets on both the plugin
  and the Wine host side, and is used to both listen on and connect to
  the sockets.
- Sockets and other temporary files respect `$XDG_RUNTIME_DIR` instead
  of being dumped in `/tmp`.
- All sockets now have a unique endpoint in
  `/run/user/<uid>/yabridge-<plugin_name>-<random_id>/`. This is
  important for when we want to have multiple socket connections for
  handling `dispatch()` and `audioMaster()`.
- Because of the above, we no longer clean up the socket endpoint files
  after the connection gets established during initialization. Instead
  we'll remove the socket base directory when shutting down.
2020-10-25 21:24:56 +01:00
Robbert van der Helm 4b4b19bbd8 Mention multiple socket endpoints in architecture 2020-10-25 21:21:00 +01:00
Robbert van der Helm a1e7142f17 Mark max_win32_messages as [[maybe_unused]]
ccls/clangd doesn't know that it's being used elsewhere.
2020-10-25 13:00:50 +01:00
Robbert van der Helm ae6a557482 Mention Tk-Glitch's Wine PKGBUILD now esync's back
Esync got rebased a week ago, so esync and the fsync patches will work
again with recent versions of Wine Staging.
2020-10-24 13:25:26 +02:00
Robbert van der Helm 532bfb4e5e Change wording in changelog 2020-10-23 15:56:44 +02:00
Robbert van der Helm cbc55aa16f Bump to version 1.7.1 1.7.1 2020-10-23 14:10:11 +02:00
Robbert van der Helm 9e7888a78e Reword part of changelog 2020-10-23 14:09:49 +02:00
Robbert van der Helm c2ec1ce994 [yabridgectl] Fix removing non-existent directory
As mentioned in #46.
2020-10-23 01:49:46 +02:00
Robbert van der Helm db02fa1c43 Fix issue with closing sockets in plugin groups
As per Boost.Asio's manual, an explicit `socket.shutdown()` is needed
before calling `close()`. For some reason this worked fine in almost
every situation, but when hosting both a plugin hosted within a group
host process and a normal individually hosted plugin within a single
process, and then removing those two plugins in order, the
`host_vst_dispatch` socket of the first plugin never got closed. This
would hang the entire shutdown sequence to hang on the
`dispatch_handler` jthread.

First discovered in #45
2020-10-22 14:05:59 +02:00
Robbert van der Helm ce385f39d3 Use vfork() for spawning processes #45 2020-10-21 22:30:50 +02:00
Robbert van der Helm 3facdf532a Fix fake dropdown menus in TDR plugins
These would close immediately when hovering over them with the new focus
grabbing method.
2020-10-19 14:34:52 +02:00
Robbert van der Helm e6af947fe1 [yabridgectl] Only recreate files when necessary
As suggested in #42. This also adds a `--force` flag to reenable the old
behaviour and always recreate files even when not necessary.
2020-10-17 18:21:53 +02:00
Robbert van der Helm 8dc95f939e [yabridgectl] Move file hashing to a function 2020-10-17 17:09:03 +02:00
Robbert van der Helm 150845a301 Fix editor_double_embed causing X11 errors
Since the error codes were not before version 1.7.0 we just didn't
notice this, even though everything still appeared to work fine.
2020-10-14 16:36:48 +02:00
Robbert van der Helm 21c1f53b40 Update version in changelog 1.7.0 2020-10-13 15:41:24 +02:00
Robbert van der Helm 2b077c1a4e Bump to version 1.7.0 2020-10-13 15:38:22 +02:00
Robbert van der Helm 0602a6e3d4 Reword parts of the changelog 2020-10-13 15:38:10 +02:00
Robbert van der Helm a1162c2256 Print invalid and unknown options on startup 2020-10-13 15:04:33 +02:00
Robbert van der Helm a125f7a535 Rewrite documentation on yabridge.toml files 2020-10-13 15:04:33 +02:00