Some minor updates

Fork of FATFileSystem by mbed official

Files at this revision

API Documentation at this revision

Comitter:
Kojto
Date:
Thu Aug 25 09:34:29 2016 +0100
Parent:
7:094f84646b9f
Commit message:
Synchronized with git revision 4047ff95767d307

- fix _name error (getName())
- add thread safety

Changed in this revision

FATDirHandle.cpp Show annotated file Show diff for this revision Revisions of this file
FATDirHandle.h Show annotated file Show diff for this revision Revisions of this file
FATFileHandle.cpp Show annotated file Show diff for this revision Revisions of this file
FATFileHandle.h Show annotated file Show diff for this revision Revisions of this file
FATFileSystem.cpp Show annotated file Show diff for this revision Revisions of this file
FATFileSystem.h Show annotated file Show diff for this revision Revisions of this file
--- a/FATDirHandle.cpp	Fri Dec 11 16:16:25 2015 +0000
+++ b/FATDirHandle.cpp	Thu Aug 25 09:34:29 2016 +0100
@@ -25,12 +25,14 @@
 
 using namespace mbed;
 
-FATDirHandle::FATDirHandle(const FATFS_DIR &the_dir) {
+FATDirHandle::FATDirHandle(const FATFS_DIR &the_dir, PlatformMutex * mutex): _mutex(mutex) {
     dir = the_dir;
 }
 
 int FATDirHandle::closedir() {
+    lock();
     int retval = f_closedir(&dir);
+    unlock();
     delete this;
     return retval;
 }
@@ -38,6 +40,7 @@
 struct dirent *FATDirHandle::readdir() {
     FILINFO finfo;
 
+    lock();
 #if _USE_LFN
     finfo.lfname = cur_entry.d_name;
     finfo.lfsize = sizeof(cur_entry.d_name);
@@ -47,33 +50,52 @@
 
 #if _USE_LFN
     if(res != 0 || finfo.fname[0]==0) {
+        unlock();
         return NULL;
     } else {
         if(cur_entry.d_name[0]==0) {
             // No long filename so use short filename.
             memcpy(cur_entry.d_name, finfo.fname, sizeof(finfo.fname));
         }
+        unlock();
         return &cur_entry;
     }
 #else
     if(res != 0 || finfo.fname[0]==0) {
+        unlock();
         return NULL;
     } else {
         memcpy(cur_entry.d_name, finfo.fname, sizeof(finfo.fname));
+        unlock();
         return &cur_entry;
     }
 #endif /* _USE_LFN */
 }
 
 void FATDirHandle::rewinddir() {
+    lock();
     dir.index = 0;
+    unlock();
 }
 
 off_t FATDirHandle::telldir() {
-    return dir.index;
+    lock();
+    off_t offset = dir.index;
+    unlock();
+    return offset;
 }
 
 void FATDirHandle::seekdir(off_t location) {
+    lock();
     dir.index = location;
+    unlock();
 }
 
+void FATDirHandle::lock() {
+    _mutex->lock();
+}
+
+void FATDirHandle::unlock() {
+    _mutex->unlock();
+}
+
--- a/FATDirHandle.h	Fri Dec 11 16:16:25 2015 +0000
+++ b/FATDirHandle.h	Thu Aug 25 09:34:29 2016 +0100
@@ -23,19 +23,27 @@
 #define MBED_FATDIRHANDLE_H
 
 #include "DirHandle.h"
+#include "PlatformMutex.h"
 
 using namespace mbed;
 
 class FATDirHandle : public DirHandle {
 
  public:
-    FATDirHandle(const FATFS_DIR &the_dir);
+    FATDirHandle(const FATFS_DIR &the_dir, PlatformMutex * mutex);
     virtual int closedir();
     virtual struct dirent *readdir();
     virtual void rewinddir();
     virtual off_t telldir();
     virtual void seekdir(off_t location);
 
+ protected:
+
+    virtual void lock();
+    virtual void unlock();
+
+    PlatformMutex * _mutex;
+
  private:
     FATFS_DIR dir;
     struct dirent cur_entry;
--- a/FATFileHandle.cpp	Fri Dec 11 16:16:25 2015 +0000
+++ b/FATFileHandle.cpp	Thu Aug 25 09:34:29 2016 +0100
@@ -25,34 +25,42 @@
 
 #include "FATFileHandle.h"
 
-FATFileHandle::FATFileHandle(FIL fh) {
+FATFileHandle::FATFileHandle(FIL fh, PlatformMutex * mutex): _mutex(mutex) {
     _fh = fh;
 }
 
 int FATFileHandle::close() {
+    lock();
     int retval = f_close(&_fh);
+    unlock();
     delete this;
     return retval;
 }
 
 ssize_t FATFileHandle::write(const void* buffer, size_t length) {
+    lock();
     UINT n;
     FRESULT res = f_write(&_fh, buffer, length, &n);
     if (res) {
         debug_if(FFS_DBG, "f_write() failed: %d", res);
+        unlock();
         return -1;
     }
+    unlock();
     return n;
 }
 
 ssize_t FATFileHandle::read(void* buffer, size_t length) {
+    lock();
     debug_if(FFS_DBG, "read(%d)\n", length);
     UINT n;
     FRESULT res = f_read(&_fh, buffer, length, &n);
     if (res) {
         debug_if(FFS_DBG, "f_read() failed: %d\n", res);
+        unlock();
         return -1;
     }
+    unlock();
     return n;
 }
 
@@ -61,6 +69,7 @@
 }
 
 off_t FATFileHandle::lseek(off_t position, int whence) {
+    lock();
     if (whence == SEEK_END) {
         position += _fh.fsize;
     } else if(whence==SEEK_CUR) {
@@ -69,22 +78,38 @@
     FRESULT res = f_lseek(&_fh, position);
     if (res) {
         debug_if(FFS_DBG, "lseek failed: %d\n", res);
+        unlock();
         return -1;
     } else {
         debug_if(FFS_DBG, "lseek OK, returning %i\n", _fh.fptr);
+        unlock();
         return _fh.fptr;
     }
 }
 
 int FATFileHandle::fsync() {
+    lock();
     FRESULT res = f_sync(&_fh);
     if (res) {
         debug_if(FFS_DBG, "f_sync() failed: %d\n", res);
+        unlock();
         return -1;
     }
+    unlock();
     return 0;
 }
 
 off_t FATFileHandle::flen() {
-    return _fh.fsize;
+    lock();
+    off_t size = _fh.fsize;
+    unlock();
+    return size;
 }
+
+void FATFileHandle::lock() {
+    _mutex->lock();
+}
+
+void FATFileHandle::unlock() {
+    _mutex->unlock();
+}
--- a/FATFileHandle.h	Fri Dec 11 16:16:25 2015 +0000
+++ b/FATFileHandle.h	Thu Aug 25 09:34:29 2016 +0100
@@ -23,13 +23,14 @@
 #define MBED_FATFILEHANDLE_H
 
 #include "FileHandle.h"
+#include "PlatformMutex.h"
 
 using namespace mbed;
 
 class FATFileHandle : public FileHandle {
 public:
 
-    FATFileHandle(FIL fh);
+    FATFileHandle(FIL fh, PlatformMutex * mutex);
     virtual int close();
     virtual ssize_t write(const void* buffer, size_t length);
     virtual ssize_t read(void* buffer, size_t length);
@@ -40,7 +41,11 @@
 
 protected:
 
+    virtual void lock();
+    virtual void unlock();
+
     FIL _fh;
+    PlatformMutex * _mutex;
 
 };
 
--- a/FATFileSystem.cpp	Fri Dec 11 16:16:25 2015 +0000
+++ b/FATFileSystem.cpp	Thu Aug 25 09:34:29 2016 +0100
@@ -27,6 +27,7 @@
 #include "FATFileSystem.h"
 #include "FATFileHandle.h"
 #include "FATDirHandle.h"
+#include "critical.h"
 
 DWORD get_fattime(void) {
     time_t rawtime;
@@ -41,33 +42,55 @@
 }
 
 FATFileSystem *FATFileSystem::_ffs[_VOLUMES] = {0};
+static PlatformMutex * mutex = NULL;
 
-FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) {
+PlatformMutex * get_fat_mutex() {
+    PlatformMutex * new_mutex = new PlatformMutex;
+
+    core_util_critical_section_enter();
+    if (NULL == mutex) {
+        mutex = new_mutex;
+    }
+    core_util_critical_section_exit();
+
+    if (mutex != new_mutex) {
+        delete new_mutex;
+    }
+    return mutex;
+}
+
+FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n), _mutex(get_fat_mutex()) {
+    lock();
     debug_if(FFS_DBG, "FATFileSystem(%s)\n", n);
     for(int i=0; i<_VOLUMES; i++) {
         if(_ffs[i] == 0) {
             _ffs[i] = this;
             _fsid[0] = '0' + i;
             _fsid[1] = '\0';
-            debug_if(FFS_DBG, "Mounting [%s] on ffs drive [%s]\n", _name, _fsid);
+            debug_if(FFS_DBG, "Mounting [%s] on ffs drive [%s]\n", getName(), _fsid);
             f_mount(&_fs, _fsid, 0);
+            unlock();
             return;
         }
     }
     error("Couldn't create %s in FATFileSystem::FATFileSystem\n", n);
+    unlock();
 }
 
 FATFileSystem::~FATFileSystem() {
+    lock();
     for (int i=0; i<_VOLUMES; i++) {
         if (_ffs[i] == this) {
             _ffs[i] = 0;
             f_mount(NULL, _fsid, 0);
         }
     }
+    unlock();
 }
 
 FileHandle *FATFileSystem::open(const char* name, int flags) {
-    debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%s]\n", name, _name, _fsid);
+    lock();
+    debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%s]\n", name, getName(), _fsid);
     char n[64];
     sprintf(n, "%s:/%s", _fsid, name);
 
@@ -92,63 +115,95 @@
     FRESULT res = f_open(&fh, n, openmode);
     if (res) {
         debug_if(FFS_DBG, "f_open('w') failed: %d\n", res);
+        unlock();
         return NULL;
     }
     if (flags & O_APPEND) {
         f_lseek(&fh, fh.fsize);
     }
-    return new FATFileHandle(fh);
+    FATFileHandle * handle = new FATFileHandle(fh, _mutex);
+    unlock();
+    return handle;
 }
 
 int FATFileSystem::remove(const char *filename) {
+    lock();
     FRESULT res = f_unlink(filename);
     if (res) {
         debug_if(FFS_DBG, "f_unlink() failed: %d\n", res);
+        unlock();
         return -1;
     }
+    unlock();
     return 0;
 }
 
 int FATFileSystem::rename(const char *oldname, const char *newname) {
+    lock();
     FRESULT res = f_rename(oldname, newname);
     if (res) {
         debug_if(FFS_DBG, "f_rename() failed: %d\n", res);
+        unlock();
         return -1;
     }
+    unlock();
     return 0;
 }
 
 int FATFileSystem::format() {
+    lock();
     FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
     if (res) {
         debug_if(FFS_DBG, "f_mkfs() failed: %d\n", res);
+        unlock();
         return -1;
     }
+    unlock();
     return 0;
 }
 
 DirHandle *FATFileSystem::opendir(const char *name) {
+    lock();
     FATFS_DIR dir;
     FRESULT res = f_opendir(&dir, name);
     if (res != 0) {
+        unlock();
         return NULL;
     }
-    return new FATDirHandle(dir);
+    FATDirHandle *handle = new FATDirHandle(dir, _mutex);
+    unlock();
+    return handle;
 }
 
 int FATFileSystem::mkdir(const char *name, mode_t mode) {
+    lock();
     FRESULT res = f_mkdir(name);
+    unlock();
     return res == 0 ? 0 : -1;
 }
 
 int FATFileSystem::mount() {
+    lock();
     FRESULT res = f_mount(&_fs, _fsid, 1);
+    unlock();
     return res == 0 ? 0 : -1;
 }
 
 int FATFileSystem::unmount() {
-    if (disk_sync())
+    lock();
+    if (disk_sync()) {
+        unlock();
         return -1;
+    }
     FRESULT res = f_mount(NULL, _fsid, 0);
+    unlock();
     return res == 0 ? 0 : -1;
 }
+
+void FATFileSystem::lock() {
+    _mutex->lock();
+}
+
+void FATFileSystem::unlock() {
+    _mutex->unlock();
+}
--- a/FATFileSystem.h	Fri Dec 11 16:16:25 2015 +0000
+++ b/FATFileSystem.h	Thu Aug 25 09:34:29 2016 +0100
@@ -26,6 +26,7 @@
 #include "FileHandle.h"
 #include "ff.h"
 #include <stdint.h>
+#include "PlatformMutex.h"
 
 using namespace mbed;
 
@@ -89,6 +90,15 @@
     virtual int disk_sync() { return 0; }
     virtual uint32_t disk_sectors() = 0;
 
+protected:
+
+    virtual void lock();
+    virtual void unlock();
+
+private:
+
+    PlatformMutex *_mutex;
+
 };
 
 #endif