progress on volatileFilesystem and fixed a file descriptor leak
This commit is contained in:
@@ -46,6 +46,12 @@ void nn_retainFilesystem(nn_filesystem *fs) {
|
||||
|
||||
nn_bool_t nn_destroyFilesystem(nn_filesystem *fs) {
|
||||
if(!nn_decRef(&fs->refc)) return false;
|
||||
|
||||
// close all files
|
||||
for(size_t i = 0; i < NN_MAX_OPEN_FILES; i++) {
|
||||
void *f = fs->files[i];
|
||||
if(f != NULL) fs->table.close(fs->table.userdata, f);
|
||||
}
|
||||
|
||||
if(fs->table.deinit != NULL) {
|
||||
fs->table.deinit(fs->table.userdata);
|
||||
|
||||
41
src/components/volatileFilesystem.c
Normal file
41
src/components/volatileFilesystem.c
Normal file
@@ -0,0 +1,41 @@
|
||||
#include "../neonucleus.h"
|
||||
|
||||
typedef struct nn_vfnode {
|
||||
struct nn_vfilesystem *fs;
|
||||
struct nn_vfnode *parent;
|
||||
char name[NN_MAX_PATH];
|
||||
nn_bool_t isDirectory;
|
||||
union {
|
||||
// if directory
|
||||
struct nn_vfnode **entries;
|
||||
// if file
|
||||
char *data;
|
||||
};
|
||||
nn_size_t len;
|
||||
nn_size_t cap;
|
||||
// this is used to block deleting
|
||||
nn_refc handleCount;
|
||||
} nn_vfnode;
|
||||
|
||||
typedef enum nn_vfmode {
|
||||
NN_VFMODE_READ,
|
||||
NN_VFMODE_WRITE,
|
||||
NN_VFMODE_APPEND,
|
||||
} nn_vfmode;
|
||||
|
||||
typedef struct nn_vfhandle {
|
||||
nn_vfnode *node;
|
||||
nn_size_t position;
|
||||
nn_vfmode mode;
|
||||
} nn_vfhandle;
|
||||
|
||||
typedef struct nn_vfilesystem {
|
||||
nn_Context ctx;
|
||||
nn_vfilesystemOptions opts;
|
||||
double birthday;
|
||||
nn_vfnode *root;
|
||||
} nn_vfilesystem;
|
||||
|
||||
nn_filesystem *nn_volatileFilesystem(nn_Context *context, nn_vfilesystemOptions opts, nn_filesystemControl control) {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user