Files
raddebugger/src/mutable_text/mutable_text.h
T

97 lines
1.9 KiB
C

// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef MUTABLE_TEXT_H
#define MUTABLE_TEXT_H
////////////////////////////////
//~ rjf: Cache Types
typedef struct MTX_Node MTX_Node;
struct MTX_Node
{
MTX_Node *next;
MTX_Node *prev;
U128 key;
};
typedef struct MTX_Slot MTX_Slot;
struct MTX_Slot
{
MTX_Node *first;
MTX_Node *last;
};
typedef struct MTX_Stripe MTX_Stripe;
struct MTX_Stripe
{
Arena *arena;
MTX_Node *free_node;
RWMutex rw_mutex;
};
////////////////////////////////
//~ rjf: Mutation Thread Types
typedef struct MTX_Op MTX_Op;
struct MTX_Op
{
Rng1U64 range;
String8 replace;
};
typedef struct MTX_MutThread MTX_MutThread;
struct MTX_MutThread
{
U64 ring_size;
U8 *ring_base;
U64 ring_read_pos;
U64 ring_write_pos;
CondVar cv;
Mutex mutex;
OS_Handle thread;
};
////////////////////////////////
//~ rjf: Shared State
typedef struct MTX_Shared MTX_Shared;
struct MTX_Shared
{
Arena *arena;
// rjf: buffer cache
U64 slots_count;
U64 stripes_count;
MTX_Slot *slots;
MTX_Stripe *stripes;
// rjf: mut threads
U64 mut_threads_count;
MTX_MutThread *mut_threads;
};
////////////////////////////////
//~ rjf: Globals
global MTX_Shared *mtx_shared = 0;
////////////////////////////////
//~ rjf: Main Layer Initialization
internal void mtx_init(void);
////////////////////////////////
//~ rjf: Buffer Operations
internal void mtx_push_op(HS_Key buffer_key, MTX_Op op);
////////////////////////////////
//~ rjf: Mutation Threads
internal void mtx_enqueue_op(MTX_MutThread *thread, HS_Key buffer_key, MTX_Op op);
internal void mtx_dequeue_op(Arena *arena, MTX_MutThread *thread, HS_Key *buffer_key_out, MTX_Op *op_out);
internal void mtx_mut_thread__entry_point(void *p);
#endif // MUTABLE_TEXT_H