From 2c2ef93521f7afae472032d6dbe4a14b86c45cab Mon Sep 17 00:00:00 2001 From: Allan Odgaard Date: Wed, 20 Mar 2013 11:28:35 +0100 Subject: [PATCH] =?UTF-8?q?Don=E2=80=99t=20keep=20mutex=20locked=20longer?= =?UTF-8?q?=20than=20required?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Frameworks/HTMLOutput/src/HTMLOutput.mm | 55 ++++++++++++++++--------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/Frameworks/HTMLOutput/src/HTMLOutput.mm b/Frameworks/HTMLOutput/src/HTMLOutput.mm index 87f940d3..3fe5545f 100644 --- a/Frameworks/HTMLOutput/src/HTMLOutput.mm +++ b/Frameworks/HTMLOutput/src/HTMLOutput.mm @@ -31,57 +31,72 @@ namespace void output (int key, char const* data, size_t len) { - std::lock_guard lock(_lock); + NSURLProtocol* protocol; + + _lock.lock(); if(record_t* record = find(key)) { - if(record->protocol) - [[record->protocol client] URLProtocol:record->protocol didLoadData:[NSData dataWithBytes:data length:len]]; - else record->buffer.insert(record->buffer.end(), data, data + len); + if(!(protocol = record->protocol)) + record->buffer.insert(record->buffer.end(), data, data + len); } + _lock.unlock(); + + [[protocol client] URLProtocol:protocol didLoadData:[NSData dataWithBytes:data length:len]]; } void done (int key) { - std::lock_guard lock(_lock); + NSURLProtocol* protocol; + + _lock.lock(); if(record_t* record = find(key)) { record->process_id = 0; record->done = true; - - if(record->protocol) - [[record->protocol client] URLProtocolDidFinishLoading:record->protocol]; + protocol = record->protocol; } + _lock.unlock(); + + [[protocol client] URLProtocolDidFinishLoading:protocol]; } void start (int key, NSURLProtocol* protocol) { - std::lock_guard lock(_lock); + NSData* data; + bool done = false; + _lock.lock(); if(record_t* record = find(key)) { record->protocol = protocol; if(!record->buffer.empty()) - { - [[record->protocol client] URLProtocol:record->protocol didLoadData:[NSData dataWithBytes:record->buffer.data() length:record->buffer.size()]]; - record->buffer.clear(); - } - - if(record->done) - [[record->protocol client] URLProtocolDidFinishLoading:record->protocol]; + data = [NSData dataWithBytes:record->buffer.data() length:record->buffer.size()]; + record->buffer.clear(); + done = record->done; } + _lock.unlock(); + + if(data) + [[protocol client] URLProtocol:protocol didLoadData:data]; + if(done) + [[protocol client] URLProtocolDidFinishLoading:protocol]; } void stop (int key) { - std::lock_guard lock(_lock); + pid_t processId = 0; + + _lock.lock(); if(record_t* record = find(key)) { record->protocol = NULL; record->stop = true; - - if(record->process_id) - oak::kill_process_group_in_background(record->process_id); + processId = record->process_id; } + _lock.unlock(); + + if(processId) + oak::kill_process_group_in_background(processId); } private: