diff --git a/NEWS b/NEWS index fd5ba5e86..f28be7e8f 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,10 @@ ver 0.21 (not yet released) ver 0.20.14 (not yet released) * database - simple: fix file corruption in the presence of mount points +* archive + - bz2: fix deadlock + - reduce lock contention, fixing lots of xrun problems +* fix Solaris build failure ver 0.20.13 (2017/12/18) * output diff --git a/src/archive/plugins/Bzip2ArchivePlugin.cxx b/src/archive/plugins/Bzip2ArchivePlugin.cxx index 3dc0b51c3..04597e2a2 100644 --- a/src/archive/plugins/Bzip2ArchivePlugin.cxx +++ b/src/archive/plugins/Bzip2ArchivePlugin.cxx @@ -162,7 +162,7 @@ Bzip2InputStream::FillBuffer() if (bzstream.avail_in > 0) return true; - size_t count = archive->istream->Read(buffer, sizeof(buffer)); + size_t count = archive->istream->LockRead(buffer, sizeof(buffer)); if (count == 0) return false; @@ -174,6 +174,8 @@ Bzip2InputStream::FillBuffer() size_t Bzip2InputStream::Read(void *ptr, size_t length) { + const ScopeUnlock unlock(mutex); + int bz_result; size_t nbytes = 0; @@ -224,4 +226,3 @@ const ArchivePlugin bz2_archive_plugin = { bz2_open, bz2_extensions, }; - diff --git a/src/archive/plugins/Iso9660ArchivePlugin.cxx b/src/archive/plugins/Iso9660ArchivePlugin.cxx index 9e4c4f16a..536745d85 100644 --- a/src/archive/plugins/Iso9660ArchivePlugin.cxx +++ b/src/archive/plugins/Iso9660ArchivePlugin.cxx @@ -182,6 +182,8 @@ Iso9660ArchiveFile::OpenStream(const char *pathname, size_t Iso9660InputStream::Read(void *ptr, size_t read_size) { + const ScopeUnlock unlock(mutex); + int readed = 0; int no_blocks, cur_block; size_t left_bytes = statbuf->size - offset; diff --git a/src/archive/plugins/ZzipArchivePlugin.cxx b/src/archive/plugins/ZzipArchivePlugin.cxx index 5ba087f48..fc1e50b16 100644 --- a/src/archive/plugins/ZzipArchivePlugin.cxx +++ b/src/archive/plugins/ZzipArchivePlugin.cxx @@ -138,6 +138,8 @@ ZzipArchiveFile::OpenStream(const char *pathname, size_t ZzipInputStream::Read(void *ptr, size_t read_size) { + const ScopeUnlock unlock(mutex); + int ret = zzip_file_read(file, ptr, read_size); if (ret < 0) throw std::runtime_error("zzip_file_read() has failed"); @@ -155,6 +157,8 @@ ZzipInputStream::IsEOF() noexcept void ZzipInputStream::Seek(offset_type new_offset) { + const ScopeUnlock unlock(mutex); + zzip_off_t ofs = zzip_seek(file, new_offset, SEEK_SET); if (ofs < 0) throw std::runtime_error("zzip_seek() has failed"); diff --git a/src/util/WStringAPI.hxx b/src/util/WStringAPI.hxx index e27f76bb8..6e3aa204d 100644 --- a/src/util/WStringAPI.hxx +++ b/src/util/WStringAPI.hxx @@ -103,11 +103,13 @@ UnsafeCopyStringP(wchar_t *dest, const wchar_t *src) noexcept { #if defined(_WIN32) || defined(__BIONIC__) || defined(__OpenBSD__) || \ defined(__NetBSD__) - /* emulate wcpcpy() */ - UnsafeCopyString(dest, src); - return dest + StringLength(dest); + /* emulate wcpcpy() */ + UnsafeCopyString(dest, src); + return dest + StringLength(dest); +#elif defined(__sun) && defined (__SVR4) + return std::wcpcpy(dest, src); #else - return wcpcpy(dest, src); + return wcpcpy(dest, src); #endif } @@ -159,7 +161,11 @@ gcc_malloc gcc_returns_nonnull gcc_nonnull_all static inline wchar_t * DuplicateString(const wchar_t *p) { +#if defined(__sun) && defined (__SVR4) + return std::wcsdup(p); +#else return wcsdup(p); +#endif } #endif