forked from enlightenment/efl
parent
5a36e40473
commit
f2474ddf7c
|
@ -162,11 +162,11 @@ EAPI int eina_cpu_count(void)
|
|||
size_t len = sizeof(cpus);
|
||||
|
||||
mib[0] = CTL_HW;
|
||||
# ifdef HW_AVAILCPU
|
||||
#ifdef HW_AVAILCPU
|
||||
mib[1] = HW_AVAILCPU;
|
||||
# else
|
||||
#else
|
||||
mib[1] = HW_NCPU;
|
||||
# endif
|
||||
#endif
|
||||
sysctl(mib, 2, &cpus, &len, NULL, 0);
|
||||
if (cpus < 1)
|
||||
cpus = 1;
|
||||
|
|
|
@ -44,8 +44,6 @@ void *alloca (size_t);
|
|||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#define PATH_DELIM '/'
|
||||
|
||||
|
@ -62,7 +60,6 @@ void *alloca (size_t);
|
|||
#include "eina_safety_checks.h"
|
||||
#include "eina_file.h"
|
||||
#include "eina_stringshare.h"
|
||||
#include "eina_hash.h"
|
||||
|
||||
/*============================================================================*
|
||||
* Local *
|
||||
|
@ -688,281 +685,6 @@ eina_file_stat_ls(const char *dir)
|
|||
return &it->iterator;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
H : half
|
||||
X : done
|
||||
|
||||
[ ] nom du fichier pour shm_open
|
||||
[ ] stringshare pour le fichier
|
||||
[H] flags dans des enum
|
||||
[X] fstat pour la taille
|
||||
[H] enregistrer dans un cache (hash) les fichiers ouverts
|
||||
[ ] garder la liste des map ouvertes et les detruire
|
||||
[X] mmap tout le fichier
|
||||
[ ] hash pour les blocs mmap
|
||||
[ ] taille de mmap : sauvegarder dans Eina_File
|
||||
*/
|
||||
|
||||
#include "eina_log.h"
|
||||
|
||||
static Eina_Hash *_eina_file_files = NULL;
|
||||
|
||||
/* _eina_file_files = eina_hash_string_small_new(NULL) */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
EINA_FILE_FLAG_READ = 0,
|
||||
EINA_FILE_FLAG_WRITE = 1,
|
||||
EINA_FILE_FLAG_READ_WRITE = 2,
|
||||
EINA_FILE_FLAG_CREATE = 1 << 2,
|
||||
EINA_FILE_FLAG_TRUNCATE = 1 << 3
|
||||
} Eina_File_Flag;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
EINA_FILE_MODE_READ = 1 << 0,
|
||||
EINA_FILE_MODE_WRITE = 1 << 1
|
||||
} Eina_File_Mode;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
EINA_FILE_MAP_PROT_EXEC,
|
||||
EINA_FILE_MAP_PROT_READ,
|
||||
EINA_FILE_MAP_PROT_WRITE,
|
||||
EINA_FILE_MAP_PROT_NONE
|
||||
} Eina_File_Map_Prot;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
/* No MAP_FIXED, its use is discouraged */
|
||||
EINA_FILE_MAP_FLAG_SHARED,
|
||||
EINA_FILE_MAP_FLAG_PRIVATE
|
||||
} Eina_File_Map_Flag;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *filename;
|
||||
Eina_File_Flag flag;
|
||||
Eina_File_Mode mode;
|
||||
int fd;
|
||||
off_t file_size;
|
||||
off_t map_size;
|
||||
void *map_full;
|
||||
Eina_Hash *map_blocks;
|
||||
Eina_Bool shared : 1;
|
||||
} Eina_File;
|
||||
|
||||
static int _eina_file_log_dom = -1;
|
||||
|
||||
#ifdef ERR
|
||||
#undef ERR
|
||||
#endif
|
||||
#define ERR(...) EINA_LOG_DOM_ERR(_eina_file_log_dom, __VA_ARGS__)
|
||||
|
||||
Eina_Bool
|
||||
eina_file_init(void)
|
||||
{
|
||||
_eina_file_log_dom = eina_log_domain_register("eina_file",
|
||||
EINA_LOG_COLOR_DEFAULT);
|
||||
if (_eina_file_log_dom < 0)
|
||||
{
|
||||
EINA_LOG_ERR("Could not register log domain: eina_file");
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
Eina_Bool
|
||||
eina_file_shutdown(void)
|
||||
{
|
||||
eina_log_domain_unregister(_eina_file_log_dom);
|
||||
_eina_file_log_dom = -1;
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
EAPI Eina_File *
|
||||
eina_file_open(const char *filename, Eina_File_Flag flag, Eina_File_Mode mode, Eina_Bool shared)
|
||||
{
|
||||
struct stat st;
|
||||
Eina_File *file;
|
||||
Eina_File *cache;
|
||||
int oflag;
|
||||
mode_t omode = 0;
|
||||
|
||||
if (!filename || !*filename) return NULL;
|
||||
|
||||
file = (Eina_File *)calloc(1, sizeof(Eina_File));
|
||||
if (!file) return NULL;
|
||||
|
||||
if (shared)
|
||||
{
|
||||
size_t length;
|
||||
|
||||
length = strlen(filename) + 1;
|
||||
file->filename = (char *)malloc(length + 1);
|
||||
if (!file->filename) goto free_file;
|
||||
*file->filename = '/';
|
||||
memcpy(file->filename + 1, filename, length);
|
||||
}
|
||||
else
|
||||
{
|
||||
file->filename = strdup(filename);
|
||||
if (!file->filename) goto free_file;
|
||||
}
|
||||
|
||||
file->flag = flag;
|
||||
file->mode = mode;
|
||||
file->shared = shared;
|
||||
switch (flag)
|
||||
{
|
||||
case EINA_FILE_FLAG_READ:
|
||||
oflag = O_RDONLY;
|
||||
break;
|
||||
case EINA_FILE_FLAG_WRITE:
|
||||
oflag = O_WRONLY;
|
||||
break;
|
||||
case EINA_FILE_FLAG_READ_WRITE:
|
||||
oflag = O_RDWR;
|
||||
break;
|
||||
default:
|
||||
oflag = O_RDONLY;
|
||||
break;
|
||||
}
|
||||
|
||||
if (flag & EINA_FILE_FLAG_CREATE) oflag |= O_CREAT;
|
||||
if (flag & EINA_FILE_FLAG_TRUNCATE) oflag |= O_TRUNC;
|
||||
|
||||
if (mode & EINA_FILE_MODE_READ) omode |= S_IRUSR;
|
||||
if (mode & EINA_FILE_MODE_WRITE) omode |= S_IWUSR;
|
||||
|
||||
if (shared)
|
||||
{
|
||||
file->fd = shm_open(file->filename, oflag, omode);
|
||||
if (file->fd == -1)
|
||||
goto free_filename;
|
||||
}
|
||||
else
|
||||
{
|
||||
file->fd = open(file->filename, oflag, omode);
|
||||
if (file->fd == -1)
|
||||
goto free_filename;
|
||||
}
|
||||
|
||||
if (fstat(file->fd, &st) != 0)
|
||||
{
|
||||
ERR("Could not retrieve file size");
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
file->file_size = st.st_size;
|
||||
|
||||
cache = eina_hash_find(_eina_file_files, file->filename);
|
||||
if (cache)
|
||||
{
|
||||
/* faire plus de tests ? */
|
||||
if (cache->file_size != file->file_size)
|
||||
{
|
||||
eina_hash_modify(_eina_file_files, file->filename, file);
|
||||
free(cache->filename);
|
||||
free(cache);
|
||||
}
|
||||
else
|
||||
return cache;
|
||||
}
|
||||
else
|
||||
eina_hash_add(_eina_file_files, file->filename, file);
|
||||
|
||||
return file;
|
||||
|
||||
close_file:
|
||||
if (shared)
|
||||
shm_unlink(file->filename);
|
||||
else
|
||||
close(file->fd);
|
||||
free_filename:
|
||||
free(file->filename);
|
||||
free_file:
|
||||
free(file);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
eina_file_close(Eina_File *file)
|
||||
{
|
||||
if (!file)
|
||||
return;
|
||||
|
||||
if (eina_hash_find(_eina_file_files, file->filename))
|
||||
eina_hash_del(_eina_file_files, file->filename, file);
|
||||
|
||||
if (file->shared)
|
||||
{
|
||||
if (shm_unlink(file->filename) != 0)
|
||||
ERR("Could not unlink %s", file->filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (close(file->fd) != 0)
|
||||
ERR("Could not close %s", file->filename);
|
||||
}
|
||||
|
||||
free(file->filename);
|
||||
free(file);
|
||||
}
|
||||
|
||||
EAPI void *
|
||||
eina_file_map_full(Eina_File *file, Eina_File_Map_Prot prot, Eina_File_Map_Flag flags)
|
||||
{
|
||||
if (!file || !file->shared)
|
||||
return NULL;
|
||||
|
||||
if (!file->map_full)
|
||||
{
|
||||
file->map_size = file->file_size;
|
||||
file->map_full = mmap(NULL, file->map_size, prot, flags, file->fd, 0);
|
||||
}
|
||||
|
||||
return file->map_full;
|
||||
}
|
||||
|
||||
EAPI Eina_Bool
|
||||
eina_file_unmap_full(Eina_File *file)
|
||||
{
|
||||
if (!file || !file->map_full)
|
||||
return EINA_FALSE;
|
||||
|
||||
return (munmap(file->map_full, file->map_size) == 0) ? EINA_TRUE : EINA_FALSE;
|
||||
}
|
||||
|
||||
EAPI void *
|
||||
eina_file_map(Eina_File *file, void *start, size_t length, Eina_File_Map_Prot prot, Eina_File_Map_Flag flags, off_t offset)
|
||||
{
|
||||
if (!file)
|
||||
return NULL;
|
||||
|
||||
if (length > (size_t)file->file_size)
|
||||
{
|
||||
ERR("Wrong length");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
file->map_size = length;
|
||||
|
||||
return mmap(start, file->map_size, prot, flags, file->fd, offset);
|
||||
}
|
||||
|
||||
EAPI Eina_Bool
|
||||
eina_file_unmap(Eina_File *file, void *start)
|
||||
{
|
||||
if (!file)
|
||||
return EINA_FALSE;
|
||||
|
||||
return (munmap(start, file->map_size) == 0) ? EINA_TRUE : EINA_FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue