@@ -86,9 +86,6 @@ uint32_t mbed_heap_size = 0;
86
86
* (or rather index+3, as filehandles 0-2 are stdin/out/err).
87
87
*/
88
88
static FileLike *filehandles[OPEN_MAX];
89
- #if MBED_CONF_FILESYSTEM_PRESENT
90
- static File fileobjects[OPEN_MAX];
91
- #endif
92
89
static SingletonPtr<PlatformMutex> filehandle_mutex;
93
90
94
91
namespace mbed {
@@ -162,6 +159,27 @@ extern "C" WEAK void mbed_sdk_init(void);
162
159
extern " C" WEAK void mbed_sdk_init (void ) {
163
160
}
164
161
162
+ #if MBED_CONF_FILESYSTEM_PRESENT
163
+ // Internally used file objects with managed memory on close
164
+ class ManagedFile : public File {
165
+ public:
166
+ virtual int close () {
167
+ int err = File::close ();
168
+ delete this ;
169
+ return err;
170
+ }
171
+ };
172
+
173
+ class ManagedDir : public Dir {
174
+ public:
175
+ virtual int close () {
176
+ int err = Dir::close ();
177
+ delete this ;
178
+ return err;
179
+ }
180
+ };
181
+ #endif
182
+
165
183
/* @brief standard c library fopen() retargeting function.
166
184
*
167
185
* This function is invoked by the standard c library retargeting to handle fopen()
@@ -251,11 +269,13 @@ extern "C" FILEHANDLE PREFIX(_open)(const char* name, int openmode) {
251
269
return -1 ;
252
270
}
253
271
int posix_mode = openmode_to_posix (openmode);
254
- int err = fileobjects[fh_i].open (fs, path.fileName (), posix_mode);
272
+ File *file = new ManagedFile;
273
+ int err = file->open (fs, path.fileName (), posix_mode);
255
274
if (err < 0 ) {
256
275
errno = -err;
276
+ delete file;
257
277
} else {
258
- res = &fileobjects[fh_i] ;
278
+ res = file ;
259
279
}
260
280
#endif
261
281
}
@@ -536,7 +556,7 @@ extern "C" DIR *opendir(const char *path) {
536
556
FileSystem* fs = fp.fileSystem ();
537
557
if (fs == NULL ) return NULL ;
538
558
539
- Dir *dir = new Dir ;
559
+ Dir *dir = new ManagedDir ;
540
560
int err = dir->open (fs, fp.fileName ());
541
561
if (err < 0 ) {
542
562
errno = -err;
@@ -572,7 +592,6 @@ extern "C" struct dirent *readdir(DIR *dir) {
572
592
extern " C" int closedir (DIR *dir) {
573
593
#if MBED_CONF_FILESYSTEM_PRESENT
574
594
int err = dir->close ();
575
- delete dir;
576
595
if (err < 0 ) {
577
596
errno = -err;
578
597
return -1 ;
0 commit comments