|
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 < [email protected]>
|
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