Reimplement AVL trees
[monolithium.git] / kernel / include / cache.h
1 /*
2  * cache.h
3  *
4  * Copyright (C) 2013 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef _CACHE_H_
21 #define _CACHE_H_
22
23 #include <common.h>
24 #include <sync.h>
25 #include <device.h>
26 #include <sdk/avltree.h>
27
28 #define CACHE_WRITE_THROUGH (1 << 0)
29
30 typedef dword_t (*read_write_buffer_proc_t)(void *context, void *buffer, qword_t offset, size_t length, size_t *bytes_read_or_written);
31
32 typedef struct
33 {
34     avl_node_t node;
35     qword_t address;
36     bool_t dirty;
37     byte_t data[VARIABLE_SIZE];
38 } cache_entry_t;
39
40 #ifndef DEVICE_TYPEDEF
41 #define DEVICE_TYPEDEF
42 typedef struct device device_t;
43 #endif
44
45 typedef struct
46 {
47     bool_t enabled;
48     resource_t resource;
49     dword_t flags;
50     dword_t block_size;
51     read_write_buffer_proc_t read_proc, write_proc;
52     avl_tree_t entries;
53 } cache_descriptor_t;
54
55 void init_cache(cache_descriptor_t *cache,
56                 dword_t flags,
57                 dword_t block_size,
58                 read_write_buffer_proc_t read_proc,
59                 read_write_buffer_proc_t write_proc);
60 void cleanup_cache(cache_descriptor_t *cache);
61 dword_t read_cache(cache_descriptor_t *cache, void *context, byte_t *buffer, qword_t offset, dword_t length, dword_t *bytes_read);
62 dword_t write_cache(cache_descriptor_t *cache, void *context, const byte_t *buffer, qword_t offset, dword_t length, dword_t *bytes_written);
63 dword_t flush_cache(cache_descriptor_t *cache, void *context);
64
65 #endif