zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit e556f947fcb7b5bfe5545d823ff9f3d9fd5270d1
parent d32eda769d1fe77378d3bd318c12c0135b5cba9f
Author: Ricard Wanderlof <polluxsynth@butoba.net>
Date:   Mon, 11 Apr 2022 06:57:55 +0200

MiddleWare: Use lookahead read while waiting for /state_frozen

Use newly introduced lookahead read in ThreadLink to read
message buffer while looking for /state_frozen from backend,
while leaving the messages in the buffer for later processing.

Diffstat:
Msrc/Misc/MiddleWare.cpp | 30++++--------------------------
1 file changed, 4 insertions(+), 26 deletions(-)

diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp @@ -2047,20 +2047,15 @@ void MiddleWareImpl::doReadOnlyOp(std::function<void()> read_only_fn) assert(uToB); uToB->write("/freeze_state",""); - std::list<const char *> fico; int tries = 0; while(tries++ < 10000) { - if(!bToU->hasNext()) { + if(!bToU->hasNextLookahead()) { os_usleep(500); continue; } - const char *msg = bToU->read(); + const char *msg = bToU->read_lookahead(); if(!strcmp("/state_frozen", msg)) break; - size_t bytes = rtosc_message_length(msg, bToU->buffer_size()); - char *save_buf = new char[bytes]; - memcpy(save_buf, msg, bytes); - fico.push_back(save_buf); } assert(tries < 10000);//if this happens, the backend must be dead @@ -2072,10 +2067,6 @@ void MiddleWareImpl::doReadOnlyOp(std::function<void()> read_only_fn) //Now to resume normal operations uToB->write("/thaw_state",""); - for(auto x:fico) { - bToUhandle(x); - delete [] x; - } } //Offline detection code: @@ -2160,29 +2151,20 @@ bool MiddleWareImpl::doReadOnlyOpNormal(std::function<void()> read_only_fn, bool assert(uToB); uToB->write("/freeze_state",""); - std::list<const char *> fico; int tries = 0; while(tries++ < 2000) { - if(!bToU->hasNext()) { + if(!bToU->hasNextLookahead()) { os_usleep(500); continue; } - const char *msg = bToU->read(); + const char *msg = bToU->read_lookahead(); if(!strcmp("/state_frozen", msg)) break; - size_t bytes = rtosc_message_length(msg, bToU->buffer_size()); - char *save_buf = new char[bytes]; - memcpy(save_buf, msg, bytes); - fico.push_back(save_buf); } if(canfail) { //Now to resume normal operations uToB->write("/thaw_state",""); - for(auto x:fico) { - bToUhandle(x); - delete [] x; - } return false; } @@ -2195,10 +2177,6 @@ bool MiddleWareImpl::doReadOnlyOpNormal(std::function<void()> read_only_fn, bool //Now to resume normal operations uToB->write("/thaw_state",""); - for(auto x:fico) { - bToUhandle(x); - delete [] x; - } return true; }