Explorar el Código

add: mmap不再局限于luadb文件系统

Wendal Chen hace 3 años
padre
commit
1d0e87b0a8
Se han modificado 4 ficheros con 49 adiciones y 8 borrados
  1. 2 0
      luat/include/luat_fs.h
  2. 1 0
      luat/vfs/luat_fs_luadb.c
  3. 43 2
      luat/vfs/luat_fs_mem.c
  4. 3 6
      luat/vfs/luat_vfs.c

+ 2 - 0
luat/include/luat_fs.h

@@ -50,6 +50,7 @@ int luat_fs_rename(const char *old_filename, const char *new_filename);
 size_t luat_fs_fsize(const char *filename);
 int luat_fs_fexist(const char *filename);
 int luat_fs_readline(char * buf, int bufsize, FILE * stream);
+void* luat_fs_mmap(FILE * stream);
 
 // TODO 文件夹相关的API
 //int luat_fs_diropen(char const* _FileName);
@@ -90,6 +91,7 @@ struct luat_vfs_file_opts {
     int (*ferror)(void* fsdata, FILE *stream);
     size_t (*fread)(void* fsdata, void *ptr, size_t size, size_t nmemb, FILE *stream);
     size_t (*fwrite)(void* fsdata, const void *ptr, size_t size, size_t nmemb, FILE *stream);
+    void* (*mmap)(void* fsdata, FILE *stream);
 };
 
 struct luat_vfs_filesystem_opts {

+ 1 - 0
luat/vfs/luat_fs_luadb.c

@@ -493,6 +493,7 @@ const struct luat_vfs_filesystem vfs_fs_luadb = {
         T(feof),
         T(ferror),
         T(fread),
+        T(mmap),
         .fwrite = NULL
     }
 };

+ 43 - 2
luat/vfs/luat_fs_mem.c

@@ -26,6 +26,7 @@ static ram_file_t* files[RAM_FILE_MAX];
 #ifdef LUAT_USE_FS_VFS
 
 FILE* luat_vfs_ram_fopen(void* userdata, const char *filename, const char *mode) {
+    (void)userdata;
     if (filename == NULL || mode == NULL || strlen(filename) > 31)
         return NULL;
     // 读文件
@@ -116,6 +117,7 @@ FILE* luat_vfs_ram_fopen(void* userdata, const char *filename, const char *mode)
 }
 
 int luat_vfs_ram_getc(void* userdata, FILE* stream) {
+    (void)userdata;
     //LLOGD("getc %p %p", userdata, stream);
     luat_raw_fd_t* fd = (luat_raw_fd_t*)stream;
     //LLOGD("getc %p %p %d %d", userdata, stream, fd->offset, fd->size);
@@ -129,6 +131,7 @@ int luat_vfs_ram_getc(void* userdata, FILE* stream) {
 }
 
 int luat_vfs_ram_fseek(void* userdata, FILE* stream, long int offset, int origin) {
+    (void)userdata;
     //LLOGD("fseek %p %p %d %d", userdata, stream, offset, origin);
     luat_raw_fd_t* fd = (luat_raw_fd_t*)stream;
     if (origin == SEEK_CUR) {
@@ -146,26 +149,32 @@ int luat_vfs_ram_fseek(void* userdata, FILE* stream, long int offset, int origin
 }
 
 int luat_vfs_ram_ftell(void* userdata, FILE* stream) {
+    (void)userdata;
     luat_raw_fd_t* fd = (luat_raw_fd_t*)stream;
     //LLOGD("tell %p %p %d %d", userdata, stream, fd->size, fd->offset);
     return fd->offset;
 }
 
 int luat_vfs_ram_fclose(void* userdata, FILE* stream) {
+    (void)userdata;
     luat_raw_fd_t* fd = (luat_raw_fd_t*)stream;
     //LLOGD("fclose %p %p %d %d", userdata, stream, fd->size, fd->offset);
     luat_heap_free(fd);
     return 0;
 }
 int luat_vfs_ram_feof(void* userdata, FILE* stream) {
+    (void)userdata;
     luat_raw_fd_t* fd = (luat_raw_fd_t*)stream;
     //LLOGD("feof %p %p %d %d", userdata, stream, fd->size, fd->offset);
     return fd->offset >= fd->file->size ? 1 : 0;
 }
 int luat_vfs_ram_ferror(void* userdata, FILE *stream) {
+    (void)userdata;
+    (void)stream;
     return 0;
 }
 size_t luat_vfs_ram_fread(void* userdata, void *ptr, size_t size, size_t nmemb, FILE *stream) {
+    (void)userdata;
     luat_raw_fd_t* fd = (luat_raw_fd_t*)stream;
     //LLOGD("fread %p %p %d %d", userdata, stream, fd->size, fd->offset);
     //LLOGD("fread2 %p %p %d %d", userdata, stream, size * nmemb, fd->offset);
@@ -178,6 +187,7 @@ size_t luat_vfs_ram_fread(void* userdata, void *ptr, size_t size, size_t nmemb,
     return read_size;
 }
 size_t luat_vfs_ram_fwrite(void* userdata, const void *ptr, size_t size, size_t nmemb, FILE *stream) {
+    (void)userdata;
     luat_raw_fd_t* fd = (luat_raw_fd_t*)stream;
     size_t write_size = size*nmemb;
     
@@ -195,6 +205,7 @@ size_t luat_vfs_ram_fwrite(void* userdata, const void *ptr, size_t size, size_t
     return write_size;
 }
 int luat_vfs_ram_remove(void* userdata, const char *filename) {
+    (void)userdata;
     for (size_t i = 0; i < RAM_FILE_MAX; i++)
     {
         if (files[i] == NULL)
@@ -207,6 +218,7 @@ int luat_vfs_ram_remove(void* userdata, const char *filename) {
     return 0;
 }
 int luat_vfs_ram_rename(void* userdata, const char *old_filename, const char *new_filename) {
+    (void)userdata;
     if (old_filename == NULL || new_filename == NULL)
         return -1;
     if (strlen(old_filename) > 31 || strlen(new_filename) > 31)
@@ -223,6 +235,7 @@ int luat_vfs_ram_rename(void* userdata, const char *old_filename, const char *ne
     return 0;
 }
 int luat_vfs_ram_fexist(void* userdata, const char *filename) {
+    (void)userdata;
     for (size_t i = 0; i < RAM_FILE_MAX; i++)
     {
         if (files[i] == NULL)
@@ -235,32 +248,58 @@ int luat_vfs_ram_fexist(void* userdata, const char *filename) {
 }
 
 size_t luat_vfs_ram_fsize(void* userdata, const char *filename) {
-    luat_raw_fd_t *fd = (luat_raw_fd_t*)(userdata);
+    (void)userdata;
+    for (size_t i = 0; i < RAM_FILE_MAX; i++)
+    {
+        if (files[i] == NULL)
+            continue;
+        if (!strcmp(filename, files[i]->name)) {
+            return files[i]->size;
+        }
+    }
+    return 0;
+}
+
+void* luat_vfs_ram_mmap(void* userdata, FILE *stream) {
+    (void)userdata;
+    luat_raw_fd_t *fd = (luat_raw_fd_t*)(stream);
     //LLOGD("fsize %p %p %d %d", userdata, fd);
-    return fd->file->size;
+    return fd->file->ptr;
 }
 
 int luat_vfs_ram_mkfs(void* userdata, luat_fs_conf_t *conf) {
+    (void)userdata;
+    (void)conf;
     return -1;
 }
 
 int luat_vfs_ram_mount(void** userdata, luat_fs_conf_t *conf) {
+    (void)userdata;
+    (void)conf;
     return 0;
 }
 
 int luat_vfs_ram_umount(void* userdata, luat_fs_conf_t *conf) {
+    (void)userdata;
+    (void)conf;
     return 0;
 }
 
 int luat_vfs_ram_mkdir(void* userdata, char const* _DirName) {
+    (void)userdata;
+    (void)_DirName;
     return -1;
 }
 
 int luat_vfs_ram_rmdir(void* userdata, char const* _DirName) {
+    (void)userdata;
+    (void)_DirName;
     return -1;
 }
 
 int luat_vfs_ram_lsdir(void* userdata, char const* _DirName, luat_fs_dirent_t* ents, size_t offset, size_t len) {
+    (void)userdata;
+    (void)_DirName;
     size_t count = 0;
     for (size_t i = 0; i < RAM_FILE_MAX; i++)
     {
@@ -280,6 +319,8 @@ int luat_vfs_ram_lsdir(void* userdata, char const* _DirName, luat_fs_dirent_t* e
 }
 
 int luat_vfs_ram_info(void* userdata, const char* path, luat_fs_info_t *conf) {
+    (void)userdata;
+    (void)path;
     memcpy(conf->filesystem, "ram", strlen("ram")+1);
     size_t ftotal = 0;
     for (size_t i = 0; i < RAM_FILE_MAX; i++)

+ 3 - 6
luat/vfs/luat_vfs.c

@@ -331,15 +331,12 @@ int luat_fs_lsdir(char const* _DirName, luat_fs_dirent_t* ents, size_t offset, s
     return mount->fs->opts.lsdir(mount->userdata,  _DirName + strlen(mount->prefix), ents, offset, len);
 }
 
-extern const struct luat_vfs_filesystem vfs_fs_luadb;
-const char* luat_vfs_luadb_mmap(void* userdata, int fd);
-
-const char* luat_vfs_mmap(FILE* stream) {
+void* luat_fs_mmap(FILE* stream) {
     luat_vfs_fd_t* fd = getfd(stream);
     if (fd == NULL)
         return NULL;
-    if (fd->fsMount->fs == &vfs_fs_luadb) {
-        return luat_vfs_luadb_mmap(fd->fsMount->userdata, (int)fd->fd);
+    if (fd->fsMount->fs->fopts.mmap != NULL) {
+        return fd->fsMount->fs->fopts.mmap(fd->fsMount->userdata, (int)fd->fd);
     }
     return NULL;
 }