Skip to content

Commit a81358b

Browse files
Update patch to only update longjmp
1 parent 752aa29 commit a81358b

File tree

1 file changed

+38
-35
lines changed

1 file changed

+38
-35
lines changed
Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,59 @@
1-
From af4a44fbb3713b05b521b70e55f83cf6bc7f403b Mon Sep 17 00:00:00 2001
1+
From dbbf373dd41fc9163272c77849eff4b0053cf916 Mon Sep 17 00:00:00 2001
22
From: Yuta Saito <[email protected]>
33
Date: Sun, 4 Sep 2022 14:34:24 +0000
44
Subject: [PATCH] [wasm] Allocate asyncify buffer on heap to save stack usage
55

66
---
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(-)
1010

1111
diff --git a/wasm/setjmp.c b/wasm/setjmp.c
12-
index 90420877a8..841fda22a3 100644
12+
index 90420877a8..c782987454 100644
1313
--- a/wasm/setjmp.c
1414
+++ 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)
3424
asyncify_stop_rewind();
3525
RB_WASM_DEBUG_LOG(" JMP_BUF_STATE_RETURNING");
3626
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);
3928
_rb_wasm_active_jmpbuf = NULL;
4029
return env->payload;
4130
}
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+
4244
diff --git a/wasm/setjmp.h b/wasm/setjmp.h
43-
index 65e35c03b3..ddfc742270 100644
45+
index 65e35c03b3..cc14df33be 100644
4446
--- a/wasm/setjmp.h
4547
+++ 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;
5457
--
5558
2.40.0
5659

0 commit comments

Comments
 (0)