Skip to content

Commit 7cd949b

Browse files
committed
fix up page size estimation code. Add planning doc for simplification.
1 parent 10f05c3 commit 7cd949b

1 file changed

Lines changed: 37 additions & 71 deletions

File tree

src/yafl.c

Lines changed: 37 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,7 @@ extern yafl_transfer_t jump_fcontext(yafl_t const to, void *vp);
5454
#define FCONTEXT_STACK_WATERMARK 0xA5
5555
#define FCONTEXT_STACK_ALIGNMENT 16
5656

57-
typedef enum {
58-
FCONTEXT_ALLOC_MALLOC,
59-
FCONTEXT_ALLOC_VMEM
60-
} yafl_alloc_type_t;
57+
typedef enum { FCONTEXT_ALLOC_MALLOC, FCONTEXT_ALLOC_VMEM } yafl_alloc_type_t;
6158

6259
/* Internal fiber structure */
6360
struct yafl_fiber {
@@ -73,13 +70,13 @@ struct yafl_fiber {
7370
bool watermark_filled;
7471

7572
/* Context tracking */
76-
yafl_t context; /* Fiber's saved context */
77-
yafl_t resumer_context; /* Context to return to */
73+
yafl_t context; /* Fiber's saved context */
74+
yafl_t resumer_context; /* Context to return to */
7875

7976
/* User entry and result */
8077
yafl_fiber_fn user_entry;
8178
void *cached_result;
82-
void *pending_arg; /* Argument for next resume */
79+
void *pending_arg; /* Argument for next resume */
8380
};
8481

8582
/* Typedef for internal use */
@@ -99,16 +96,14 @@ static size_t get_page_size(void) {
9996
return (size_t)si.dwPageSize;
10097
#else
10198
long page_size = sysconf(_SC_PAGE_SIZE);
102-
if (page_size <= 0) {
103-
return 4096;
104-
}
99+
if(page_size <= 0) { return 4096; }
105100
return (size_t)page_size;
106101
#endif
107102
}
108103

109104
static void *align_stack_pointer(void *ptr) {
110105
uintptr_t addr = (uintptr_t)ptr;
111-
return (void *)(addr & ~(FCONTEXT_STACK_ALIGNMENT - 1));
106+
return (void *)(addr & ~((uintptr_t)FCONTEXT_STACK_ALIGNMENT - 1));
112107
}
113108

114109
/* ========================================================================
@@ -147,27 +142,20 @@ static void fiber_entry_trampoline(yafl_transfer_t t) {
147142
* Fiber Creation
148143
* ======================================================================== */
149144

150-
extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size,
151-
yafl_stack_flags_t flags) {
145+
extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size, yafl_stack_flags_t flags) {
152146
/* Validate fiber function is not NULL */
153-
if (fiber_fn == NULL) {
154-
return NULL;
155-
}
147+
if(fiber_fn == NULL) { return NULL; }
156148

157149
/* Validate exactly one allocation type is set */
158150
int alloc_flags = flags & (YAFL_STACK_FLAGS_MALLOC | YAFL_STACK_FLAGS_VMEM);
159-
if (alloc_flags != YAFL_STACK_FLAGS_MALLOC && alloc_flags != YAFL_STACK_FLAGS_VMEM) {
160-
return NULL;
161-
}
151+
if(alloc_flags != YAFL_STACK_FLAGS_MALLOC && alloc_flags != YAFL_STACK_FLAGS_VMEM) { return NULL; }
162152

163153
bool use_vmem = (flags & YAFL_STACK_FLAGS_VMEM) != 0;
164154
bool use_watermark = (flags & YAFL_STACK_FLAGS_WATERMARK) != 0;
165155

166156
/* Allocate fiber structure */
167157
yafl_fiber_t *fiber = malloc(sizeof(yafl_fiber_t));
168-
if (fiber == NULL) {
169-
return NULL;
170-
}
158+
if(fiber == NULL) { return NULL; }
171159

172160
/* Initialize fiber structure */
173161
fiber->magic = FCONTEXT_FIBER_MAGIC;
@@ -181,12 +169,10 @@ extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size
181169
fiber->resumer_context = NULL;
182170

183171
/* Use default stack size if not specified */
184-
if (stack_size == 0) {
185-
stack_size = FCONTEXT_DEFAULT_STACK_SIZE;
186-
}
172+
if(stack_size == 0) { stack_size = FCONTEXT_DEFAULT_STACK_SIZE; }
187173

188174
/* Allocate stack based on allocation type */
189-
if (use_vmem) {
175+
if(use_vmem) {
190176
size_t page_size = get_page_size();
191177
size_t stack_with_overhead = stack_size + 256;
192178
size_t aligned_stack_size = ((stack_with_overhead + page_size - 1) / page_size) * page_size;
@@ -196,28 +182,28 @@ extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size
196182
void *region = NULL;
197183
#ifdef _WIN32
198184
region = VirtualAlloc(NULL, total_size, MEM_RESERVE, PAGE_NOACCESS);
199-
if (region == NULL) {
185+
if(region == NULL) {
200186
free(fiber);
201187
return NULL;
202188
}
203189
void *stack_base = (char *)region + guard_size;
204-
if (!VirtualAlloc(stack_base, aligned_stack_size, MEM_COMMIT, PAGE_READWRITE)) {
190+
if(!VirtualAlloc(stack_base, aligned_stack_size, MEM_COMMIT, PAGE_READWRITE)) {
205191
VirtualFree(region, 0, MEM_RELEASE);
206192
free(fiber);
207193
return NULL;
208194
}
209195
#else
210196
region = mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
211-
if (region == MAP_FAILED) {
197+
if(region == MAP_FAILED) {
212198
free(fiber);
213199
return NULL;
214200
}
215-
if (mprotect(region, guard_size, PROT_NONE) == -1) {
201+
if(mprotect(region, guard_size, PROT_NONE) == -1) {
216202
munmap(region, total_size);
217203
free(fiber);
218204
return NULL;
219205
}
220-
if (mprotect((char *)region + guard_size + aligned_stack_size, guard_size, PROT_NONE) == -1) {
206+
if(mprotect((char *)region + guard_size + aligned_stack_size, guard_size, PROT_NONE) == -1) {
221207
munmap(region, total_size);
222208
free(fiber);
223209
return NULL;
@@ -228,7 +214,7 @@ extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size
228214
void *stack_region_end = (char *)stack_base + aligned_stack_size;
229215
void *stack_top = (char *)stack_region_end - 256;
230216
stack_top = align_stack_pointer(stack_top);
231-
size_t actual_stack_size = (char *)stack_top - (char *)stack_base;
217+
size_t actual_stack_size = (uintptr_t)(intptr_t)((char *)stack_top - (char *)stack_base);
232218

233219
fiber->stack_region = region;
234220
fiber->stack_total_size = total_size;
@@ -238,7 +224,7 @@ extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size
238224
/* malloc allocation */
239225
size_t allocated_size = stack_size + 256;
240226
void *block = malloc(allocated_size);
241-
if (block == NULL) {
227+
if(block == NULL) {
242228
free(fiber);
243229
return NULL;
244230
}
@@ -247,7 +233,7 @@ extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size
247233
void *stack_top = (char *)block_end - 256;
248234
stack_top = align_stack_pointer(stack_top);
249235

250-
size_t actual_stack_size = (char *)stack_top - (char *)block;
236+
size_t actual_stack_size = (uintptr_t)(intptr_t)((char *)stack_top - (char *)block);
251237

252238
fiber->stack_region = block;
253239
fiber->stack_total_size = allocated_size;
@@ -257,8 +243,8 @@ extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size
257243

258244
/* Initialize the low-level context with trampoline as entry */
259245
fiber->context = make_fcontext(fiber->stack_top, fiber->stack_size, fiber_entry_trampoline);
260-
if (fiber->context == NULL) {
261-
if (use_vmem) {
246+
if(fiber->context == NULL) {
247+
if(use_vmem) {
262248
#ifdef _WIN32
263249
VirtualFree(fiber->stack_region, 0, MEM_RELEASE);
264250
#else
@@ -272,12 +258,12 @@ extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size
272258
}
273259

274260
/* Apply watermark if requested */
275-
if (use_watermark) {
261+
if(use_watermark) {
276262
memset((char *)fiber->stack_top - fiber->stack_size, FCONTEXT_STACK_WATERMARK, fiber->stack_size);
277263
/* Reinitialize context after watermark (overwrites filled area) */
278264
fiber->context = make_fcontext(fiber->stack_top, fiber->stack_size, fiber_entry_trampoline);
279-
if (fiber->context == NULL) {
280-
if (use_vmem) {
265+
if(fiber->context == NULL) {
266+
if(use_vmem) {
281267
#ifdef _WIN32
282268
VirtualFree(fiber->stack_region, 0, MEM_RELEASE);
283269
#else
@@ -300,19 +286,13 @@ extern yafl_fiber_t *yafl_fiber_create(yafl_fiber_fn fiber_fn, size_t stack_size
300286

301287
extern void *yafl_fiber_resume(yafl_fiber_t *fiber, void *arg) {
302288
/* Validation */
303-
if (fiber == NULL || fiber->magic != FCONTEXT_FIBER_MAGIC) {
304-
return NULL;
305-
}
289+
if(fiber == NULL || fiber->magic != FCONTEXT_FIBER_MAGIC) { return NULL; }
306290

307291
/* If complete, return cached result (idempotent) */
308-
if (fiber->status == YAFL_FIBER_STATUS_COMPLETE) {
309-
return fiber->cached_result;
310-
}
292+
if(fiber->status == YAFL_FIBER_STATUS_COMPLETE) { return fiber->cached_result; }
311293

312294
/* Cannot resume running fiber */
313-
if (fiber->status == YAFL_FIBER_STATUS_RUNNING) {
314-
return NULL;
315-
}
295+
if(fiber->status == YAFL_FIBER_STATUS_RUNNING) { return NULL; }
316296

317297
/* Store argument for delivery */
318298
fiber->pending_arg = arg;
@@ -338,9 +318,7 @@ extern void *yafl_fiber_suspend(void *result) {
338318
yafl_fiber_t *current = tls_current_fiber;
339319

340320
/* Must be in a fiber */
341-
if (current == NULL) {
342-
return NULL;
343-
}
321+
if(current == NULL) { return NULL; }
344322

345323
/* Update status */
346324
current->status = YAFL_FIBER_STATUS_SUSPENDED;
@@ -362,24 +340,18 @@ extern void *yafl_fiber_suspend(void *result) {
362340
* ======================================================================== */
363341

364342
extern yafl_fiber_status_t yafl_fiber_status(yafl_fiber_t *fiber) {
365-
if (fiber == NULL || fiber->magic != FCONTEXT_FIBER_MAGIC) {
366-
return YAFL_FIBER_STATUS_ERR;
367-
}
343+
if(fiber == NULL || fiber->magic != FCONTEXT_FIBER_MAGIC) { return YAFL_FIBER_STATUS_ERR; }
368344
return fiber->status;
369345
}
370346

371347
extern size_t yafl_fiber_stack_high_watermark(yafl_fiber_t *fiber) {
372-
if (fiber == NULL || fiber->magic != FCONTEXT_FIBER_MAGIC || !fiber->watermark_filled) {
373-
return 0;
374-
}
348+
if(fiber == NULL || fiber->magic != FCONTEXT_FIBER_MAGIC || !fiber->watermark_filled) { return 0; }
375349

376350
/* Scan from stack base for watermark bytes */
377351
unsigned char *stack_base = (unsigned char *)fiber->stack_top - fiber->stack_size;
378352
size_t unused = 0;
379353

380-
while (unused < fiber->stack_size && stack_base[unused] == FCONTEXT_STACK_WATERMARK) {
381-
unused++;
382-
}
354+
while(unused < fiber->stack_size && stack_base[unused] == FCONTEXT_STACK_WATERMARK) { unused++; }
383355

384356
return fiber->stack_size - unused;
385357
}
@@ -389,19 +361,15 @@ extern size_t yafl_fiber_stack_high_watermark(yafl_fiber_t *fiber) {
389361
* ======================================================================== */
390362

391363
extern void yafl_fiber_destroy(yafl_fiber_t *fiber) {
392-
if (fiber == NULL || fiber->magic != FCONTEXT_FIBER_MAGIC) {
393-
return;
394-
}
364+
if(fiber == NULL || fiber->magic != FCONTEXT_FIBER_MAGIC) { return; }
395365

396366
/* Cannot destroy running fiber */
397-
if (fiber->status == YAFL_FIBER_STATUS_RUNNING) {
398-
return;
399-
}
367+
if(fiber->status == YAFL_FIBER_STATUS_RUNNING) { return; }
400368

401369
/* Free stack based on allocation type */
402-
if (fiber->alloc_type == FCONTEXT_ALLOC_MALLOC) {
370+
if(fiber->alloc_type == FCONTEXT_ALLOC_MALLOC) {
403371
free(fiber->stack_region);
404-
} else if (fiber->alloc_type == FCONTEXT_ALLOC_VMEM) {
372+
} else if(fiber->alloc_type == FCONTEXT_ALLOC_VMEM) {
405373
#ifdef _WIN32
406374
VirtualFree(fiber->stack_region, 0, MEM_RELEASE);
407375
#else
@@ -418,6 +386,4 @@ extern void yafl_fiber_destroy(yafl_fiber_t *fiber) {
418386
* Utilities
419387
* ======================================================================== */
420388

421-
extern size_t yafl_get_page_size(void) {
422-
return get_page_size();
423-
}
389+
extern size_t yafl_get_page_size(void) { return get_page_size(); }

0 commit comments

Comments
 (0)