archive/{iso9660,zzip}: unlock the mutex during I/O
Similar to commit 31ab78ae8e
			
			
This commit is contained in:
		
							
								
								
									
										1
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								NEWS
									
									
									
									
									
								
							@@ -3,6 +3,7 @@ ver 0.20.14 (not yet released)
 | 
				
			|||||||
  - simple: fix file corruption in the presence of mount points
 | 
					  - simple: fix file corruption in the presence of mount points
 | 
				
			||||||
* archive
 | 
					* archive
 | 
				
			||||||
  - bz2: fix deadlock
 | 
					  - bz2: fix deadlock
 | 
				
			||||||
 | 
					  - reduce lock contention, fixing lots of xrun problems
 | 
				
			||||||
* fix Solaris build failure
 | 
					* fix Solaris build failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ver 0.20.13 (2017/12/18)
 | 
					ver 0.20.13 (2017/12/18)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -182,6 +182,8 @@ Iso9660ArchiveFile::OpenStream(const char *pathname,
 | 
				
			|||||||
size_t
 | 
					size_t
 | 
				
			||||||
Iso9660InputStream::Read(void *ptr, size_t read_size)
 | 
					Iso9660InputStream::Read(void *ptr, size_t read_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						const ScopeUnlock unlock(mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int readed = 0;
 | 
						int readed = 0;
 | 
				
			||||||
	int no_blocks, cur_block;
 | 
						int no_blocks, cur_block;
 | 
				
			||||||
	size_t left_bytes = statbuf->size - offset;
 | 
						size_t left_bytes = statbuf->size - offset;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -138,6 +138,8 @@ ZzipArchiveFile::OpenStream(const char *pathname,
 | 
				
			|||||||
size_t
 | 
					size_t
 | 
				
			||||||
ZzipInputStream::Read(void *ptr, size_t read_size)
 | 
					ZzipInputStream::Read(void *ptr, size_t read_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						const ScopeUnlock unlock(mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int ret = zzip_file_read(file, ptr, read_size);
 | 
						int ret = zzip_file_read(file, ptr, read_size);
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		throw std::runtime_error("zzip_file_read() has failed");
 | 
							throw std::runtime_error("zzip_file_read() has failed");
 | 
				
			||||||
@@ -155,6 +157,8 @@ ZzipInputStream::IsEOF() noexcept
 | 
				
			|||||||
void
 | 
					void
 | 
				
			||||||
ZzipInputStream::Seek(offset_type new_offset)
 | 
					ZzipInputStream::Seek(offset_type new_offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						const ScopeUnlock unlock(mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	zzip_off_t ofs = zzip_seek(file, new_offset, SEEK_SET);
 | 
						zzip_off_t ofs = zzip_seek(file, new_offset, SEEK_SET);
 | 
				
			||||||
	if (ofs < 0)
 | 
						if (ofs < 0)
 | 
				
			||||||
		throw std::runtime_error("zzip_seek() has failed");
 | 
							throw std::runtime_error("zzip_seek() has failed");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user