83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
|
|
#ifndef MT_SHADOW_H
|
|
#define MT_SHADOW_H
|
|
|
|
#include <librr/types.h>
|
|
#include <shadow-tag.h>
|
|
|
|
typedef struct MtShadowRegistry MtShadowRegistry;
|
|
typedef struct MtShadow MtShadow;
|
|
typedef struct MtShadowPool MtShadowPool;
|
|
typedef struct MtShadowLookupTree MtShadowLookupTree;
|
|
|
|
/// @brief: An MtShadow contains the actual information which is used
|
|
/// each time when an entity is modified. It contains the tags and
|
|
/// other meta-information as well as data required for optimization.
|
|
struct MtShadow
|
|
{
|
|
void *context;
|
|
MtShadowTag *tag_chain_start;
|
|
u32_t identifier;
|
|
|
|
MtShadowPool *pool;
|
|
MtShadow *pool_next;
|
|
};
|
|
|
|
struct MtShadowPool
|
|
{
|
|
usz_t capacity;
|
|
MtShadow *shadows;
|
|
MtShadow *first_free;
|
|
MtShadowPool *continuation;
|
|
};
|
|
|
|
typedef struct MtShadowLookupLevel3
|
|
{
|
|
MtShadow *next[256];
|
|
} MtShadowLookupLevel3;
|
|
|
|
typedef struct MtShadowLookupLevel2
|
|
{
|
|
MtShadowLookupLevel3 *next[256];
|
|
} MtShadowLookupLevel2;
|
|
|
|
typedef struct MtShadowLookup1
|
|
{
|
|
MtShadowLookupLevel2 *next[256];
|
|
} MtShadowLookupLevel1;
|
|
|
|
struct MtShadowLookupTree
|
|
{
|
|
MtShadowLookupLevel1 *next[256];
|
|
};
|
|
|
|
struct MtShadowRegistry
|
|
{
|
|
// TODO: The IDs must be assigned using a singly linked list of indices
|
|
// to the next free entry, the index representing the ID's value and having
|
|
// stored the next free entry's index. Conceptually similar to the internals
|
|
// of the old File Allocation Table filesystems (FAT12, FAT16, FAT32).
|
|
u32_t id_counter;
|
|
MtShadowPool root_pool;
|
|
MtShadowLookupTree lookup_tree;
|
|
void *context_ptr;
|
|
};
|
|
|
|
MtShadowRegistry mt_create_shadow_registry(void *context_ptr);
|
|
void mt_cleanup_shadow_registry(MtShadowRegistry *registry);
|
|
|
|
MtShadow * mt_create_shadow(MtShadowRegistry *registry);
|
|
MtShadow * mt_lookup_shadow(MtShadowRegistry *registry, u32_t identifier);
|
|
void mt_delete_shadow(MtShadowRegistry *registry, MtShadow *shadow);
|
|
|
|
void mt_cleanup_shadow_pool(MtShadowPool *pool);
|
|
void mt_free_shadow_pool(MtShadowPool *pool);
|
|
MtShadowLookupTree mt_create_shadow_lookup_tree();
|
|
|
|
void mt_init_shadow_pool(MtShadowPool *pool, usz_t capacity);
|
|
MtShadowPool * mt_new_shadow_pool(usz_t capacity);
|
|
MtShadow * mt_pool_shadow(MtShadowPool *pool);
|
|
void mt_unpool_shadow(MtShadow *shadow);
|
|
|
|
#endif // MT_SHADOW_H
|