Skip to content

Commit 891eaec

Browse files
committed
bucket active conversion tasks by priority; adjust thread cap for bg conversion processes, don't flood cores with work while target is doing things
1 parent 410837d commit 891eaec

File tree

5 files changed

+475
-225
lines changed

5 files changed

+475
-225
lines changed

src/config/config.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright (c) Epic Games Tools
2+
// Licensed under the MIT license (https://opensource.org/license/mit/)
3+
4+
////////////////////////////////
5+
//~ rjf: ID Functions
6+
7+
internal void cfg_id_list_push(Arena *arena, CFG_IDList *list, CFG_ID id);
8+
internal CFG_IDList cfg_id_list_copy(Arena *arena, CFG_IDList *src);
9+
10+
////////////////////////////////
11+
//~ rjf: Node Pointer Data Structure Functions
12+
13+
internal void cfg_node_ptr_list_push(Arena *arena, CFG_NodePtrList *list, CFG_Node *node);
14+
internal void cfg_node_ptr_list_push_front(Arena *arena, CFG_NodePtrList *list, CFG_Node *node);
15+
#define cfg_node_ptr_list_first(list) ((list)->count ? (list)->first->v : &cfg_nil_node)
16+
#define cfg_node_ptr_list_last(list) ((list)->count ? (list)->last->v : &cfg_nil_node)
17+
internal CFG_NodePtrArray cfg_node_ptr_array_from_list(Arena *arena, CFG_NodePtrList *list);
18+
19+
////////////////////////////////
20+
//~ rjf: Config Reading Functions
21+
22+
//- rjf: context selection
23+
internal void cfg_ctx_select(CFG_Ctx *ctx);
24+
25+
//- rjf: tree navigations
26+
internal CFG_Node *cfg_node_from_id(CFG_ID id);
27+
internal CFG_Node *cfg_node_child_from_string(CFG_Node *parent, String8 string);
28+
internal CFG_Node *cfg_node_child_from_string_or_parent(CFG_Node *parent, String8 string);
29+
internal CFG_NodePtrList cfg_node_child_list_from_string(Arena *arena, CFG_Node *parent, String8 string);
30+
internal CFG_NodePtrList cfg_node_top_level_list_from_string(Arena *arena, String8 string);
31+
internal CFG_NodeRec cfg_node_rec__depth_first(CFG_Node *root, CFG_Node *node);
32+
33+
//- rjf: serialization
34+
internal String8 cfg_string_from_tree(Arena *arena, String8 root_path, CFG_Node *root);
35+
36+
////////////////////////////////
37+
//~ rjf: Config Writing Functions
38+
39+
//- rjf: state creation / destroying
40+
internal CFG_State *cfg_state_alloc(void);
41+
internal void cfg_state_release(CFG_State *state);
42+
43+
//- rjf: state -> ctx
44+
internal CFG_Ctx *cfg_state_ctx(CFG_State *state);
45+
46+
//- rjf: tree building
47+
internal CFG_Node *cfg_node_alloc(CFG_State *state);
48+
internal void cfg_node_release(CFG_State *state, CFG_Node *node);
49+
internal void cfg_node_release_all_children(CFG_State *state, CFG_Node *node);
50+
internal CFG_Node *cfg_node_new(CFG_State *state, CFG_Node *parent, String8 string);
51+
internal CFG_Node *cfg_node_newf(CFG_State *state, CFG_Node *parent, char *fmt, ...);
52+
internal CFG_Node *cfg_node_new_replace(CFG_State *state, CFG_Node *parent, String8 string);
53+
internal CFG_Node *cfg_node_new_replacef(CFG_State *state, CFG_Node *parent, char *fmt, ...);
54+
internal CFG_Node *cfg_node_deep_copy(CFG_State *state, CFG_Node *src_root);
55+
internal void cfg_node_equip_string(CFG_State *state, CFG_Node *node, String8 string);
56+
internal void cfg_node_equip_stringf(CFG_State *state, CFG_Node *node, char *fmt, ...);
57+
internal void cfg_node_insert_child(CFG_State *state, CFG_Node *parent, CFG_Node *prev_child, CFG_Node *new_child);
58+
internal void cfg_node_unhook(CFG_State *state, CFG_Node *parent, CFG_Node *child);
59+
internal CFG_Node *cfg_node_child_from_string_or_alloc(CFG_State *state, CFG_Node *parent, String8 string);
60+
61+
//- rjf: deserialization
62+
internal CFG_NodePtrList cfg_node_ptr_list_from_string(Arena *arena, String8 root_path, String8 string);

src/config/config.h

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
// Copyright (c) Epic Games Tools
2+
// Licensed under the MIT license (https://opensource.org/license/mit/)
3+
4+
#ifndef CONFIG_H
5+
#define CONFIG_H
6+
7+
////////////////////////////////
8+
//~ rjf: IDs
9+
10+
typedef U64 CFG_ID;
11+
12+
typedef struct CFG_IDNode CFG_IDNode;
13+
struct CFG_IDNode
14+
{
15+
CFG_IDNode *next;
16+
CFG_ID v;
17+
};
18+
19+
typedef struct CFG_IDList CFG_IDList;
20+
struct CFG_IDList
21+
{
22+
CFG_IDNode *first;
23+
CFG_IDNode *last;
24+
U64 count;
25+
};
26+
27+
////////////////////////////////
28+
//~ rjf: Tree Types
29+
30+
typedef struct CFG_Node CFG_Node;
31+
struct CFG_Node
32+
{
33+
CFG_Node *first;
34+
CFG_Node *last;
35+
CFG_Node *next;
36+
CFG_Node *prev;
37+
CFG_Node *parent;
38+
CFG_ID id;
39+
String8 string;
40+
};
41+
42+
typedef struct CFG_NodePtrNode CFG_NodePtrNode;
43+
struct CFG_NodePtrNode
44+
{
45+
CFG_NodePtrNode *next;
46+
CFG_NodePtrNode *prev;
47+
CFG_Node *v;
48+
};
49+
50+
typedef struct CFG_NodePtrSlot CFG_NodePtrSlot;
51+
struct CFG_NodePtrSlot
52+
{
53+
CFG_NodePtrNode *first;
54+
CFG_NodePtrNode *last;
55+
};
56+
57+
typedef struct CFG_NodePtrList CFG_NodePtrList;
58+
struct CFG_NodePtrList
59+
{
60+
CFG_NodePtrNode *first;
61+
CFG_NodePtrNode *last;
62+
U64 count;
63+
};
64+
65+
typedef struct CFG_NodePtrArray CFG_NodePtrArray;
66+
struct CFG_NodePtrArray
67+
{
68+
CFG_Node **v;
69+
U64 count;
70+
};
71+
72+
typedef struct CFG_NodeRec CFG_NodeRec;
73+
struct CFG_NodeRec
74+
{
75+
CFG_Node *next;
76+
S32 push_count;
77+
S32 pop_count;
78+
};
79+
80+
////////////////////////////////
81+
//~ rjf: Config State Bundles
82+
83+
typedef struct CFG_Ctx CFG_Ctx;
84+
struct CFG_Ctx
85+
{
86+
CFG_Node *root;
87+
U64 id_slots_count;
88+
CFG_NodePtrSlot *id_slots;
89+
U64 change_gen;
90+
CFG_ID last_accessed_id;
91+
CFG_Node *last_accessed;
92+
};
93+
94+
typedef struct CFG_State CFG_State;
95+
struct CFG_State
96+
{
97+
Arena *arena;
98+
CFG_Node *free;
99+
CFG_NodePtrNode *free_id_node;
100+
U64 id_gen;
101+
CFG_Ctx ctx;
102+
};
103+
104+
////////////////////////////////
105+
//~ rjf: Globals
106+
107+
read_only global CFG_Node cfg_nil_node =
108+
{
109+
&cfg_nil_node,
110+
&cfg_nil_node,
111+
&cfg_nil_node,
112+
&cfg_nil_node,
113+
&cfg_nil_node,
114+
};
115+
116+
thread_static CFG_Ctx *cfg_ctx = 0;
117+
118+
////////////////////////////////
119+
//~ rjf: ID Functions
120+
121+
internal void cfg_id_list_push(Arena *arena, CFG_IDList *list, CFG_ID id);
122+
internal CFG_IDList cfg_id_list_copy(Arena *arena, CFG_IDList *src);
123+
124+
////////////////////////////////
125+
//~ rjf: Node Pointer Data Structure Functions
126+
127+
internal void cfg_node_ptr_list_push(Arena *arena, CFG_NodePtrList *list, CFG_Node *node);
128+
internal void cfg_node_ptr_list_push_front(Arena *arena, CFG_NodePtrList *list, CFG_Node *node);
129+
#define cfg_node_ptr_list_first(list) ((list)->count ? (list)->first->v : &cfg_nil_node)
130+
#define cfg_node_ptr_list_last(list) ((list)->count ? (list)->last->v : &cfg_nil_node)
131+
internal CFG_NodePtrArray cfg_node_ptr_array_from_list(Arena *arena, CFG_NodePtrList *list);
132+
133+
////////////////////////////////
134+
//~ rjf: Config Reading Functions
135+
136+
//- rjf: context selection
137+
internal void cfg_ctx_select(CFG_Ctx *ctx);
138+
139+
//- rjf: tree navigations
140+
internal CFG_Node *cfg_node_from_id(CFG_ID id);
141+
internal CFG_Node *cfg_node_child_from_string(CFG_Node *parent, String8 string);
142+
internal CFG_Node *cfg_node_child_from_string_or_parent(CFG_Node *parent, String8 string);
143+
internal CFG_NodePtrList cfg_node_child_list_from_string(Arena *arena, CFG_Node *parent, String8 string);
144+
internal CFG_NodePtrList cfg_node_top_level_list_from_string(Arena *arena, String8 string);
145+
internal CFG_NodeRec cfg_node_rec__depth_first(CFG_Node *root, CFG_Node *node);
146+
147+
//- rjf: serialization
148+
internal String8 cfg_string_from_tree(Arena *arena, String8 root_path, CFG_Node *root);
149+
150+
////////////////////////////////
151+
//~ rjf: Config Writing Functions
152+
153+
//- rjf: state creation / destroying
154+
internal CFG_State *cfg_state_alloc(void);
155+
internal void cfg_state_release(CFG_State *state);
156+
157+
//- rjf: state -> ctx
158+
internal CFG_Ctx *cfg_state_ctx(CFG_State *state);
159+
160+
//- rjf: tree building
161+
internal CFG_Node *cfg_node_alloc(CFG_State *state);
162+
internal void cfg_node_release(CFG_State *state, CFG_Node *node);
163+
internal void cfg_node_release_all_children(CFG_State *state, CFG_Node *node);
164+
internal CFG_Node *cfg_node_new(CFG_State *state, CFG_Node *parent, String8 string);
165+
internal CFG_Node *cfg_node_newf(CFG_State *state, CFG_Node *parent, char *fmt, ...);
166+
internal CFG_Node *cfg_node_new_replace(CFG_State *state, CFG_Node *parent, String8 string);
167+
internal CFG_Node *cfg_node_new_replacef(CFG_State *state, CFG_Node *parent, char *fmt, ...);
168+
internal CFG_Node *cfg_node_deep_copy(CFG_State *state, CFG_Node *src_root);
169+
internal void cfg_node_equip_string(CFG_State *state, CFG_Node *node, String8 string);
170+
internal void cfg_node_equip_stringf(CFG_State *state, CFG_Node *node, char *fmt, ...);
171+
internal void cfg_node_insert_child(CFG_State *state, CFG_Node *parent, CFG_Node *prev_child, CFG_Node *new_child);
172+
internal void cfg_node_unhook(CFG_State *state, CFG_Node *parent, CFG_Node *child);
173+
internal CFG_Node *cfg_node_child_from_string_or_alloc(CFG_State *state, CFG_Node *parent, String8 string);
174+
175+
//- rjf: deserialization
176+
internal CFG_NodePtrList cfg_node_ptr_list_from_string(Arena *arena, String8 root_path, String8 string);
177+
178+
#endif // CONFIG_H

0 commit comments

Comments
 (0)