[FL-2502] Properly closing directory on free (#1174)
* Storage: better (at least working) mechanism to distinguish between files and dirs * Storage API: debug log * TarArchive: fix stream memleak * TarArchive: fix another memleak * Storage: better logs * Storage: changed the log level to trace Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
parent
7ce305fca3
commit
c60562a02c
@ -6,9 +6,17 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** File type */
|
||||
typedef enum {
|
||||
FileTypeClosed, /**< Closed file */
|
||||
FileTypeOpenDir, /**< Open dir */
|
||||
FileTypeOpenFile, /**< Open file */
|
||||
} FileType;
|
||||
|
||||
/** Structure that hold file index and returned api errors */
|
||||
struct File {
|
||||
uint32_t file_id; /**< File ID for internal references */
|
||||
FileType type;
|
||||
FS_Error error_id; /**< Standart API error from FS_Error enum */
|
||||
int32_t internal_error_id; /**< Internal API error value */
|
||||
void* storage;
|
||||
|
@ -7,6 +7,8 @@
|
||||
|
||||
#define MAX_NAME_LENGTH 256
|
||||
|
||||
#define TAG "StorageAPI"
|
||||
|
||||
#define S_API_PROLOGUE \
|
||||
osSemaphoreId_t semaphore = osSemaphoreNew(1, 0, NULL); \
|
||||
furi_check(semaphore != NULL);
|
||||
@ -47,10 +49,6 @@
|
||||
#define S_RETURN_ERROR (return_data.error_value);
|
||||
#define S_RETURN_CSTRING (return_data.cstring_value);
|
||||
|
||||
#define FILE_OPENED_FILE 1
|
||||
#define FILE_OPENED_DIR 2
|
||||
#define FILE_CLOSED 0
|
||||
|
||||
typedef enum {
|
||||
StorageEventFlagFileClose = (1 << 0),
|
||||
} StorageEventFlag;
|
||||
@ -72,7 +70,7 @@ static bool storage_file_open_internal(
|
||||
.open_mode = open_mode,
|
||||
}};
|
||||
|
||||
file->file_id = FILE_OPENED_FILE;
|
||||
file->type = FileTypeOpenFile;
|
||||
|
||||
S_API_MESSAGE(StorageCommandFileOpen);
|
||||
S_API_EPILOGUE;
|
||||
@ -113,6 +111,10 @@ bool storage_file_open(
|
||||
|
||||
furi_pubsub_unsubscribe(storage_get_pubsub(file->storage), subscription);
|
||||
osEventFlagsDelete(event);
|
||||
|
||||
FURI_LOG_T(
|
||||
TAG, "File %p - %p open (%s)", (uint32_t)file - SRAM_BASE, file->file_id - SRAM_BASE, path);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -124,7 +126,8 @@ bool storage_file_close(File* file) {
|
||||
S_API_MESSAGE(StorageCommandFileClose);
|
||||
S_API_EPILOGUE;
|
||||
|
||||
file->file_id = FILE_CLOSED;
|
||||
FURI_LOG_T(TAG, "File %p - %p closed", (uint32_t)file - SRAM_BASE, file->file_id - SRAM_BASE);
|
||||
file->type = FileTypeClosed;
|
||||
|
||||
return S_RETURN_BOOL;
|
||||
}
|
||||
@ -234,7 +237,7 @@ static bool storage_dir_open_internal(File* file, const char* path) {
|
||||
.path = path,
|
||||
}};
|
||||
|
||||
file->file_id = FILE_OPENED_DIR;
|
||||
file->type = FileTypeOpenDir;
|
||||
|
||||
S_API_MESSAGE(StorageCommandDirOpen);
|
||||
S_API_EPILOGUE;
|
||||
@ -259,6 +262,10 @@ bool storage_dir_open(File* file, const char* path) {
|
||||
|
||||
furi_pubsub_unsubscribe(storage_get_pubsub(file->storage), subscription);
|
||||
osEventFlagsDelete(event);
|
||||
|
||||
FURI_LOG_T(
|
||||
TAG, "Dir %p - %p open (%s)", (uint32_t)file - SRAM_BASE, file->file_id - SRAM_BASE, path);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -269,7 +276,9 @@ bool storage_dir_close(File* file) {
|
||||
S_API_MESSAGE(StorageCommandDirClose);
|
||||
S_API_EPILOGUE;
|
||||
|
||||
file->file_id = FILE_CLOSED;
|
||||
FURI_LOG_T(TAG, "Dir %p - %p closed", (uint32_t)file - SRAM_BASE, file->file_id - SRAM_BASE);
|
||||
|
||||
file->type = FileTypeClosed;
|
||||
|
||||
return S_RETURN_BOOL;
|
||||
}
|
||||
@ -448,18 +457,20 @@ FS_Error storage_sd_status(Storage* storage) {
|
||||
|
||||
File* storage_file_alloc(Storage* storage) {
|
||||
File* file = malloc(sizeof(File));
|
||||
file->file_id = FILE_CLOSED;
|
||||
file->type = FileTypeClosed;
|
||||
file->storage = storage;
|
||||
|
||||
FURI_LOG_T(TAG, "File/Dir %p alloc", (uint32_t)file - SRAM_BASE);
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
bool storage_file_is_open(File* file) {
|
||||
return (file->file_id != FILE_CLOSED);
|
||||
return (file->type != FileTypeClosed);
|
||||
}
|
||||
|
||||
bool storage_file_is_dir(File* file) {
|
||||
return (file->file_id == FILE_OPENED_DIR);
|
||||
return (file->type == FileTypeOpenDir);
|
||||
}
|
||||
|
||||
void storage_file_free(File* file) {
|
||||
@ -471,6 +482,7 @@ void storage_file_free(File* file) {
|
||||
}
|
||||
}
|
||||
|
||||
FURI_LOG_T(TAG, "File/Dir %p free", (uint32_t)file - SRAM_BASE);
|
||||
free(file);
|
||||
}
|
||||
|
||||
|
@ -38,6 +38,7 @@ static int mtar_storage_file_seek(void* stream, unsigned offset) {
|
||||
static int mtar_storage_file_close(void* stream) {
|
||||
if(stream) {
|
||||
storage_file_close(stream);
|
||||
storage_file_free(stream);
|
||||
}
|
||||
return MTAR_ESUCCESS;
|
||||
}
|
||||
@ -93,6 +94,7 @@ void tar_archive_free(TarArchive* archive) {
|
||||
if(mtar_is_open(&archive->tar)) {
|
||||
mtar_close(&archive->tar);
|
||||
}
|
||||
free(archive);
|
||||
}
|
||||
|
||||
void tar_archive_set_file_callback(TarArchive* archive, tar_unpack_file_cb callback, void* context) {
|
||||
|
Loading…
Reference in New Issue
Block a user