|
1 | | -From af4a44fbb3713b05b521b70e55f83cf6bc7f403b Mon Sep 17 00:00:00 2001 |
| 1 | +From dbbf373dd41fc9163272c77849eff4b0053cf916 Mon Sep 17 00:00:00 2001 |
2 | 2 | From: Yuta Saito <kateinoigakukun@gmail.com> |
3 | 3 | Date: Sun, 4 Sep 2022 14:34:24 +0000 |
4 | 4 | Subject: [PATCH] [wasm] Allocate asyncify buffer on heap to save stack usage |
5 | 5 |
|
6 | 6 | --- |
7 | | - wasm/setjmp.c | 13 +++++++++++-- |
8 | | - wasm/setjmp.h | 1 - |
9 | | - 2 files changed, 11 insertions(+), 3 deletions(-) |
| 7 | + wasm/setjmp.c | 7 +++++-- |
| 8 | + wasm/setjmp.h | 2 +- |
| 9 | + 2 files changed, 6 insertions(+), 3 deletions(-) |
10 | 10 |
|
11 | 11 | diff --git a/wasm/setjmp.c b/wasm/setjmp.c |
12 | | -index 90420877a8..841fda22a3 100644 |
| 12 | +index 90420877a8..c782987454 100644 |
13 | 13 | --- a/wasm/setjmp.c |
14 | 14 | +++ b/wasm/setjmp.c |
15 | | -@@ -66,8 +66,15 @@ enum rb_wasm_jmp_buf_state { |
16 | | - void |
17 | | - async_buf_init(struct __rb_wasm_asyncify_jmp_buf* buf) |
18 | | - { |
19 | | -- buf->top = &buf->buffer[0]; |
20 | | -- buf->end = &buf->buffer[WASM_SETJMP_STACK_BUFFER_SIZE]; |
21 | | -+ char *buffer = malloc(WASM_SETJMP_STACK_BUFFER_SIZE); |
22 | | -+ buf->top = buffer; |
23 | | -+ buf->end = buffer + WASM_SETJMP_STACK_BUFFER_SIZE; |
24 | | -+} |
25 | | -+ |
26 | | -+inline static void |
27 | | -+async_buf_deinit(struct __rb_wasm_asyncify_jmp_buf* buf) |
28 | | -+{ |
29 | | -+ free(buf->top); |
30 | | - } |
31 | | - |
32 | | - // Global unwinding/rewinding jmpbuf state |
33 | | -@@ -100,6 +107,8 @@ _rb_wasm_setjmp_internal(rb_wasm_jmp_buf *env) |
| 15 | +@@ -84,6 +84,7 @@ _rb_wasm_setjmp_internal(rb_wasm_jmp_buf *env) |
| 16 | + RB_WASM_DEBUG_LOG(" JMP_BUF_STATE_INITIALIZED"); |
| 17 | + env->state = JMP_BUF_STATE_CAPTURING; |
| 18 | + env->payload = 0; |
| 19 | ++ env->longjmp_buf_ptr = NULL; |
| 20 | + _rb_wasm_active_jmpbuf = env; |
| 21 | + async_buf_init(&env->setjmp_buf); |
| 22 | + asyncify_start_unwind(&env->setjmp_buf); |
| 23 | +@@ -100,6 +101,7 @@ _rb_wasm_setjmp_internal(rb_wasm_jmp_buf *env) |
34 | 24 | asyncify_stop_rewind(); |
35 | 25 | RB_WASM_DEBUG_LOG(" JMP_BUF_STATE_RETURNING"); |
36 | 26 | env->state = JMP_BUF_STATE_CAPTURED; |
37 | | -+ async_buf_deinit(&env->longjmp_buf); |
38 | | -+ async_buf_deinit(&env->setjmp_buf); |
| 27 | ++ free(env->longjmp_buf_ptr); |
39 | 28 | _rb_wasm_active_jmpbuf = NULL; |
40 | 29 | return env->payload; |
41 | 30 | } |
| 31 | +@@ -117,9 +119,10 @@ _rb_wasm_longjmp(rb_wasm_jmp_buf* env, int value) |
| 32 | + assert(value != 0); |
| 33 | + env->state = JMP_BUF_STATE_RETURNING; |
| 34 | + env->payload = value; |
| 35 | ++ env->longjmp_buf_ptr = malloc(sizeof(struct __rb_wasm_asyncify_jmp_buf)); |
| 36 | + _rb_wasm_active_jmpbuf = env; |
| 37 | +- async_buf_init(&env->longjmp_buf); |
| 38 | +- asyncify_start_unwind(&env->longjmp_buf); |
| 39 | ++ async_buf_init(env->longjmp_buf_ptr); |
| 40 | ++ asyncify_start_unwind(env->longjmp_buf_ptr); |
| 41 | + } |
| 42 | + |
| 43 | + |
42 | 44 | diff --git a/wasm/setjmp.h b/wasm/setjmp.h |
43 | | -index 65e35c03b3..ddfc742270 100644 |
| 45 | +index 65e35c03b3..cc14df33be 100644 |
44 | 46 | --- a/wasm/setjmp.h |
45 | 47 | +++ b/wasm/setjmp.h |
46 | | -@@ -11,7 +11,6 @@ |
47 | | - struct __rb_wasm_asyncify_jmp_buf { |
48 | | - void* top; |
49 | | - void* end; |
50 | | -- char buffer[WASM_SETJMP_STACK_BUFFER_SIZE]; |
51 | | - }; |
52 | | - |
53 | | - typedef struct { |
| 48 | +@@ -19,7 +19,7 @@ typedef struct { |
| 49 | + struct __rb_wasm_asyncify_jmp_buf setjmp_buf; |
| 50 | + // Internal Asyncify buffer space used while unwinding from longjmp |
| 51 | + // but never used for rewinding. |
| 52 | +- struct __rb_wasm_asyncify_jmp_buf longjmp_buf; |
| 53 | ++ struct __rb_wasm_asyncify_jmp_buf *longjmp_buf_ptr; |
| 54 | + // Used to save top address of Asyncify stack `setjmp_buf`, which is |
| 55 | + // overwritten during first rewind. |
| 56 | + void *dst_buf_top; |
54 | 57 | -- |
55 | 58 | 2.40.0 |
56 | 59 |
|
0 commit comments