summaryrefslogtreecommitdiff
path: root/unix/main.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-01-29 01:05:53 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-01-29 02:13:42 +0200
commitd3b1f0b627ccc6705d9fe958549badb87a74ded1 (patch)
treeccc7d03e2f5cd00bb022f70093ca99915715ba42 /unix/main.c
parent850212203a97754bdaf1844b71c8fe8ee905236f (diff)
py/runtime: mp_stack_ctrl_init() should be called immediately on startup.
Calling it from mp_init() is too late for some ports (like Unix), and leads to incomplete stack frame being captured, with following GC issues. So, now each port should call mp_stack_ctrl_init() on its own, ASAP after startup, and taking special precautions so it really was called before stack variables get allocated (because if such variable with a pointer is missed, it may lead to over-collecting (typical symptom is segfaulting)).
Diffstat (limited to 'unix/main.c')
-rw-r--r--unix/main.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/unix/main.c b/unix/main.c
index 03902a3e9..4ba68dcb9 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -376,7 +376,19 @@ STATIC void set_sys_argv(char *argv[], int argc, int start_arg) {
#define PATHLIST_SEP_CHAR ':'
#endif
+MP_NOINLINE int main_(int argc, char **argv);
+
int main(int argc, char **argv) {
+ // We should capture stack top ASAP after start, and it should be
+ // captured guaranteedly before any other stack variables are allocated.
+ // For this, actual main (renamed main_) should not be inlined into
+ // this function. main_() itself may have other functions inlined (with
+ // their own stack variables), that's why we need this main/main_ split.
+ mp_stack_ctrl_init();
+ return main_(argc, argv);
+}
+
+MP_NOINLINE int main_(int argc, char **argv) {
mp_stack_set_limit(40000 * (BYTES_PER_WORD / 4));
pre_process_options(argc, argv);