From 7531b3324f8c9382b7d3c1d2efac6dbece3f6ce2 Mon Sep 17 00:00:00 2001 From: Chris Moeller Date: Thu, 13 Feb 2014 20:21:44 -0800 Subject: [PATCH] Improved the robustness of the lazyusf communication process to terminate cleanly if the external process crashes or otherwise terminates improperly. Also updated lazyusf to terminate if its input pipe is broken during decoding. --- .../HighlyComplete/HCDecoder.mm | 64 +++++++++++++++--- ThirdParty/lazyusf/lazyusf | Bin 436600 -> 436600 bytes 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/Plugins/HighlyComplete/HighlyComplete/HCDecoder.mm b/Plugins/HighlyComplete/HighlyComplete/HCDecoder.mm index d997ad90c..c17733d92 100644 --- a/Plugins/HighlyComplete/HighlyComplete/HCDecoder.mm +++ b/Plugins/HighlyComplete/HighlyComplete/HCDecoder.mm @@ -899,6 +899,8 @@ struct usf_loader_state uint32_t samplerate; uint32_t pairsleft; + BOOL error_occurred; + usf_loader_state() : #ifdef USF_LOG @@ -906,7 +908,8 @@ struct usf_loader_state #endif task(nil), pipe_stdin(nil), pipe_stdout(nil), enablecompare(0), enablefifofull(0), - samplerate(0), pairsleft(0) { } + samplerate(0), pairsleft(0), + error_occurred(NO) { } ~usf_loader_state() { @@ -915,7 +918,20 @@ struct usf_loader_state void fwrite( const void * buf, ssize_t size, ssize_t count ) { - [file_stdin writeData:[NSData dataWithBytes:buf length:size * count]]; + if ( error_occurred ) + return; + + @try + { + [file_stdin writeData:[NSData dataWithBytes:buf length:size * count]]; + } + @catch (NSException *) + { + error_occurred = YES; + close(); + return; + } + #ifdef USF_LOG if ( log ) { @@ -927,7 +943,20 @@ struct usf_loader_state ssize_t fread( void * buf, ssize_t size, ssize_t count ) { - NSData * data = [file_stdout readDataOfLength:size * count]; + if ( error_occurred ) + return 0; + + NSData * data = nil; + @try + { + data = [file_stdout readDataOfLength:size * count]; + } + @catch (NSException *) + { + error_occurred = YES; + close(); + return 0; + } if ( data && [data length] ) { memcpy( buf, [data bytes], [data length] ); @@ -960,7 +989,16 @@ struct usf_loader_state file_stdin = [pipe_stdin fileHandleForWriting]; file_stdout = [pipe_stdout fileHandleForReading]; - [task launch]; + @try + { + [task launch]; + } + @catch (NSException *) + { + error_occurred = YES; + close(); + return; + } fwrite( &enablecompare, sizeof(enablecompare), 1 ); fwrite( &enablefifofull, sizeof(enablefifofull), 1 ); @@ -971,8 +1009,11 @@ struct usf_loader_state { if (task != nil) { - uint32_t zero = 0; - fwrite( &zero, sizeof(uint32_t), 1 ); + if ( !error_occurred ) + { + uint32_t zero = 0; + fwrite( &zero, sizeof(uint32_t), 1 ); + } [task release]; task = nil; [pipe_stdin release]; @@ -997,7 +1038,7 @@ struct usf_loader_state if ( reserved_size ) fwrite( reserved, 1, reserved_size ); } - BOOL read_samples( int16_t * out, uint32_t out_pairs ) + BOOL read_samples( int16_t * out, ssize_t out_pairs ) { if ( !donewriting ) { @@ -1046,6 +1087,9 @@ static int usf_loader(void * context, const uint8_t * exe, size_t exe_size, if ( !uUsf->opened() ) uUsf->open(); uUsf->write_reserved( reserved, (uint32_t) reserved_size ); + + if ( uUsf->error_occurred ) + return -1; return 0; } @@ -1634,11 +1678,11 @@ static int usf_info(void * context, const char * name, const char * value) else if ( type == 0x21 ) { struct usf_loader_state * uUsf = ( struct usf_loader_state * ) emulatorCore; - int16_t * temp = (int16_t *) malloc( sizeof(int16_t) * 4096 ); + int16_t temp[2048]; do { - uint32_t howmany = (uint32_t)(frame - framesRead) * 2 * sizeof(int16_t); - if (howmany > 2048) howmany = 2048; + ssize_t howmany = frame - framesRead; + if (howmany > 1024) howmany = 1024; if (!uUsf->read_samples( temp, howmany )) return -1; framesRead += howmany; } while (framesRead < frame); diff --git a/ThirdParty/lazyusf/lazyusf b/ThirdParty/lazyusf/lazyusf index dbd8827ff5ae40cdb6a90a3b6a6d7c85f083b482..9a036dc2c0d516096a39167b77ae42ff46964f6c 100755 GIT binary patch delta 2054 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 U9jivE?|nD#1`Y=Kid)wIZywPtApigX