From 9a6dac4193b7ec1629e45a51fd1462830426475f Mon Sep 17 00:00:00 2001 From: "henrike@webrtc.org" Date: Thu, 27 Sep 2012 22:20:34 +0000 Subject: [PATCH] Re-fixes issue 300. BUG=300 Review URL: https://webrtc-codereview.appspot.com/839007 git-svn-id: http://webrtc.googlecode.com/svn/trunk@2835 4adac7df-926f-26a2-2b94-8c16560cd09d --- src/system_wrappers/source/file_impl.cc | 60 +++++++++++++++++-------- src/system_wrappers/source/file_impl.h | 11 ++++- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/system_wrappers/source/file_impl.cc b/src/system_wrappers/source/file_impl.cc index 4d06c5470..37d2d410f 100644 --- a/src/system_wrappers/source/file_impl.cc +++ b/src/system_wrappers/source/file_impl.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "file_impl.h" +#include "system_wrappers/source/file_impl.h" #include @@ -19,6 +19,8 @@ #include #endif +#include "system_wrappers/interface/rw_lock_wrapper.h" + namespace webrtc { FileWrapper* FileWrapper::Create() @@ -27,7 +29,8 @@ FileWrapper* FileWrapper::Create() } FileWrapperImpl::FileWrapperImpl() - : _id(NULL), + : _rwLock(RWLockWrapper::CreateRWLock()), + _id(NULL), _open(false), _looping(false), _readOnly(false), @@ -47,18 +50,13 @@ FileWrapperImpl::~FileWrapperImpl() int FileWrapperImpl::CloseFile() { - if (_id != NULL) - { - fclose(_id); - _id = NULL; - } - memset(_fileNameUTF8, 0, kMaxFileNameSize); - _open = false; - return 0; + WriteLockScoped write(*_rwLock); + return CloseFileImpl(); } int FileWrapperImpl::Rewind() { + WriteLockScoped write(*_rwLock); if(_looping || !_readOnly) { if (_id != NULL) @@ -72,22 +70,21 @@ int FileWrapperImpl::Rewind() int FileWrapperImpl::SetMaxFileSize(size_t bytes) { + WriteLockScoped write(*_rwLock); _maxSizeInBytes = bytes; return 0; } int FileWrapperImpl::Flush() { - if (_id != NULL) - { - return fflush(_id); - } - return -1; + WriteLockScoped write(*_rwLock); + return FlushImpl(); } int FileWrapperImpl::FileName(char* fileNameUTF8, size_t size) const { + ReadLockScoped read(*_rwLock); size_t length = strlen(_fileNameUTF8); if(length > kMaxFileNameSize) { @@ -111,12 +108,14 @@ int FileWrapperImpl::FileName(char* fileNameUTF8, bool FileWrapperImpl::Open() const { + ReadLockScoped read(*_rwLock); return _open; } int FileWrapperImpl::OpenFile(const char *fileNameUTF8, bool readOnly, bool loop, bool text) { + WriteLockScoped write(*_rwLock); size_t length = strlen(fileNameUTF8); if (length > kMaxFileNameSize - 1) { @@ -189,6 +188,7 @@ int FileWrapperImpl::OpenFile(const char *fileNameUTF8, bool readOnly, int FileWrapperImpl::Read(void* buf, int length) { + WriteLockScoped write(*_rwLock); if (length < 0) return -1; @@ -198,13 +198,14 @@ int FileWrapperImpl::Read(void* buf, int length) int bytes_read = static_cast(fread(buf, 1, length, _id)); if (bytes_read != length && !_looping) { - CloseFile(); + CloseFileImpl(); } return bytes_read; } int FileWrapperImpl::WriteText(const char* format, ...) { + WriteLockScoped write(*_rwLock); if (format == NULL) return -1; @@ -225,13 +226,14 @@ int FileWrapperImpl::WriteText(const char* format, ...) } else { - CloseFile(); + CloseFileImpl(); return -1; } } bool FileWrapperImpl::Write(const void* buf, int length) { + WriteLockScoped write(*_rwLock); if (buf == NULL) return false; @@ -247,7 +249,7 @@ bool FileWrapperImpl::Write(const void* buf, int length) // Check if it's time to stop writing. if (_maxSizeInBytes > 0 && (_sizeInBytes + length) > _maxSizeInBytes) { - Flush(); + FlushImpl(); return false; } @@ -258,8 +260,28 @@ bool FileWrapperImpl::Write(const void* buf, int length) return true; } - CloseFile(); + CloseFileImpl(); return false; } +int FileWrapperImpl::CloseFileImpl() { + if (_id != NULL) + { + fclose(_id); + _id = NULL; + } + memset(_fileNameUTF8, 0, kMaxFileNameSize); + _open = false; + return 0; +} + +int FileWrapperImpl::FlushImpl() { + if (_id != NULL) + { + return fflush(_id); + } + return -1; +} + + } // namespace webrtc diff --git a/src/system_wrappers/source/file_impl.h b/src/system_wrappers/source/file_impl.h index 31ab31e53..c6881df3b 100644 --- a/src/system_wrappers/source/file_impl.h +++ b/src/system_wrappers/source/file_impl.h @@ -11,12 +11,16 @@ #ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_FILE_IMPL_H_ #define WEBRTC_SYSTEM_WRAPPERS_SOURCE_FILE_IMPL_H_ -#include "file_wrapper.h" +#include "system_wrappers/interface/file_wrapper.h" #include +#include "system_wrappers/interface/scoped_ptr.h" + namespace webrtc { +class RWLockWrapper; + class FileWrapperImpl : public FileWrapper { public: @@ -43,6 +47,11 @@ public: virtual int Rewind(); private: + int CloseFileImpl(); + int FlushImpl(); + + scoped_ptr _rwLock; + FILE* _id; bool _open; bool _looping;