summaryrefslogtreecommitdiff
path: root/navit/file.c
diff options
context:
space:
mode:
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2008-10-12 20:39:00 +0000
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2008-10-12 20:39:00 +0000
commit2779675885f7a3de4d4312dde143fd61fdc7d191 (patch)
treeca30a4967604b4b073d42c6144302210119ea1a2 /navit/file.c
parent1a6398e9ec4eeaf0f521e017f6f24eae2585aae8 (diff)
downloadnavit-2779675885f7a3de4d4312dde143fd61fdc7d191.tar.gz
Add:Core:First try to add a general purpose cache to navit
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@1453 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/file.c')
-rw-r--r--navit/file.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/navit/file.c b/navit/file.c
index e8a88b81d..4289ba6fb 100644
--- a/navit/file.c
+++ b/navit/file.c
@@ -31,6 +31,7 @@
#include <glib.h>
#include <zlib.h>
#include "debug.h"
+#include "cache.h"
#include "file.h"
#include "config.h"
@@ -44,6 +45,17 @@
static struct file *file_list;
+static GHashTable *file_name_hash;
+static int file_name_id;
+static struct cache *file_cache;
+
+struct file_cache_id {
+ long long offset;
+ int size;
+ int file_name_id;
+ int method;
+};
+
struct file *
file_create(char *name)
{
@@ -80,7 +92,7 @@ int file_mkdir(char *name, int pflag)
{
char buffer[strlen(name)+1];
int ret;
- char *curr, *next;
+ char *next;
dbg(1,"enter %s %d\n",name,pflag);
if (!pflag) {
if (file_is_dir(name))
@@ -89,7 +101,7 @@ int file_mkdir(char *name, int pflag)
}
strcpy(buffer, name);
next=buffer;
- while (next=strchr(next, '/')) {
+ while ((next=strchr(next, '/'))) {
*next='\0';
if (*buffer) {
ret=file_mkdir(buffer, 0);
@@ -128,10 +140,14 @@ file_data_read(struct file *file, long long offset, int size)
void *ret;
if (file->begin)
return file->begin+offset;
- ret=g_malloc(size);
+ if (file_cache) {
+ struct file_cache_id id={offset,size,file->name_id,0};
+ ret=cache_lookup_or_insert(file_cache,&id,size);
+ } else
+ ret=g_malloc(size);
lseek(file->fd, offset, SEEK_SET);
if (read(file->fd, ret, size) != size) {
- g_free(ret);
+ file_data_free(file, ret);
ret=NULL;
}
return ret;
@@ -175,7 +191,11 @@ file_data_read_compressed(struct file *file, long long offset, int size, int siz
char buffer[size];
uLongf destLen=size_uncomp;
- ret=g_malloc(size_uncomp);
+ if (file_cache) {
+ struct file_cache_id id={offset,size,file->name_id,1};
+ ret=cache_lookup_or_insert(file_cache,&id,size_uncomp);
+ } else
+ ret=g_malloc(size_uncomp);
lseek(file->fd, offset, SEEK_SET);
if (read(file->fd, buffer, size) != size) {
g_free(ret);
@@ -195,7 +215,10 @@ file_data_free(struct file *file, unsigned char *data)
{
if (file->begin && data >= file->begin && data < file->end)
return;
- g_free(data);
+ if (file_cache) {
+ cache_entry_destroy(file_cache, data);
+ } else
+ g_free(data);
}
int
@@ -375,3 +398,13 @@ file_get_param(struct file *file, struct param_list *param, int count)
param_add_hex("Size", file->size, &param, &count);
return i-count;
}
+
+void
+file_init(void)
+{
+#if 0
+ file_name_hash=g_hash_table_new(g_str_hash, g_str_equal);
+ file_cache=cache_new(sizeof(struct file_cache_id), 2*1024*1024);
+#endif
+}
+