diff --git a/src/system_wrappers/source/file_impl.cc b/src/system_wrappers/source/file_impl.cc index 4d06c54707..3832240777 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,6 +50,7 @@ FileWrapperImpl::~FileWrapperImpl() int FileWrapperImpl::CloseFile() { + WriteLockScoped write(*_rwLock); if (_id != NULL) { fclose(_id); @@ -59,6 +63,7 @@ int FileWrapperImpl::CloseFile() int FileWrapperImpl::Rewind() { + WriteLockScoped write(*_rwLock); if(_looping || !_readOnly) { if (_id != NULL) @@ -72,12 +77,14 @@ int FileWrapperImpl::Rewind() int FileWrapperImpl::SetMaxFileSize(size_t bytes) { + WriteLockScoped write(*_rwLock); _maxSizeInBytes = bytes; return 0; } int FileWrapperImpl::Flush() { + WriteLockScoped write(*_rwLock); if (_id != NULL) { return fflush(_id); @@ -88,6 +95,7 @@ int FileWrapperImpl::Flush() int FileWrapperImpl::FileName(char* fileNameUTF8, size_t size) const { + ReadLockScoped read(*_rwLock); size_t length = strlen(_fileNameUTF8); if(length > kMaxFileNameSize) { @@ -111,12 +119,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 +199,7 @@ int FileWrapperImpl::OpenFile(const char *fileNameUTF8, bool readOnly, int FileWrapperImpl::Read(void* buf, int length) { + WriteLockScoped write(*_rwLock); if (length < 0) return -1; @@ -205,6 +216,7 @@ int FileWrapperImpl::Read(void* buf, int length) int FileWrapperImpl::WriteText(const char* format, ...) { + WriteLockScoped write(*_rwLock); if (format == NULL) return -1; @@ -232,6 +244,7 @@ int FileWrapperImpl::WriteText(const char* format, ...) bool FileWrapperImpl::Write(const void* buf, int length) { + WriteLockScoped write(*_rwLock); if (buf == NULL) return false; diff --git a/src/system_wrappers/source/file_impl.h b/src/system_wrappers/source/file_impl.h index 31ab31e533..4cd7eecf0d 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,8 @@ public: virtual int Rewind(); private: + scoped_ptr _rwLock; + FILE* _id; bool _open; bool _looping;