first pass at asynchronous file streaming -> hash store layer; fix non-windowed memory access in watch window when doing change visualization, causing major performance regression with large arrays; fix some extra jank with truncated-string-hover & help labels

This commit is contained in:
Ryan Fleury
2024-01-26 11:47:25 -08:00
parent 0974337450
commit 455dac958c
9 changed files with 298 additions and 44 deletions
+84
View File
@@ -0,0 +1,84 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef FILE_STREAM_H
#define FILE_STREAM_H
////////////////////////////////
//~ rjf: Per-Path Info Cache Types
typedef struct FS_Node FS_Node;
struct FS_Node
{
FS_Node *next;
String8 path;
U64 timestamp;
U64 last_time_requested_us;
};
typedef struct FS_Slot FS_Slot;
struct FS_Slot
{
FS_Node *first;
FS_Node *last;
};
typedef struct FS_Stripe FS_Stripe;
struct FS_Stripe
{
Arena *arena;
OS_Handle cv;
OS_Handle rw_mutex;
};
////////////////////////////////
//~ rjf: Shared State Bundle
typedef struct FS_Shared FS_Shared;
struct FS_Shared
{
Arena *arena;
// rjf: path info cache
U64 slots_count;
U64 stripes_count;
FS_Slot *slots;
FS_Stripe *stripes;
// rjf: user -> streamer ring buffer
U64 u2s_ring_size;
U8 *u2s_ring_base;
U64 u2s_ring_write_pos;
U64 u2s_ring_read_pos;
OS_Handle u2s_ring_cv;
OS_Handle u2s_ring_mutex;
// rjf: streamer threads
U64 streamer_count;
OS_Handle *streamers;
};
////////////////////////////////
//~ rjf: Globals
global FS_Shared *fs_shared = 0;
////////////////////////////////
//~ rjf: Top-Level API
internal void fs_init(void);
////////////////////////////////
//~ rjf: Cache Interaction
internal U128 fs_hash_from_path(String8 path, U64 rewind_count, U64 endt_us);
////////////////////////////////
//~ rjf: Streamer Threads
internal B32 fs_u2s_enqueue_path(String8 path, U64 endt_us);
internal String8 fs_u2s_dequeue_path(Arena *arena);
internal void fs_streamer_thread__entry_point(void *p);
#endif // FILE_STREAM_H