From 2abda04743ae2b5f207f8b7cf4221d09a029a35c Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 22 Aug 2010 19:30:54 -0700 Subject: [PATCH] cpu.x86.32: commit 05ba77262afe897bc67e1b26084d7c8b36a0e847 only fixed the start-context-and-delete callframe leak on x86-64. Fix it on x86-32 and add a regression test --- basis/cpu/x86/32/bootstrap.factor | 10 ++++++---- basis/threads/threads-tests.factor | 22 ++++++++++++++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/basis/cpu/x86/32/bootstrap.factor b/basis/cpu/x86/32/bootstrap.factor index d6f1618f70..5eb25fc033 100644 --- a/basis/cpu/x86/32/bootstrap.factor +++ b/basis/cpu/x86/32/bootstrap.factor @@ -253,10 +253,6 @@ IN: bootstrap.x86 : jit-switch-context ( reg -- ) -4 jit-scrub-return - ! Save ds, rs registers - jit-load-vm - jit-save-context - ! Make the new context the current one ctx-reg swap MOV vm-reg vm-context-offset [+] ctx-reg MOV @@ -277,6 +273,10 @@ IN: bootstrap.x86 EDX ds-reg -4 [+] MOV ds-reg 8 SUB + ! Save ds, rs registers + jit-load-vm + jit-save-context + ! Make the new context active EAX jit-switch-context @@ -311,6 +311,8 @@ IN: bootstrap.x86 jit-save-quot-and-param ! Make the new context active + jit-load-vm + jit-save-context EAX jit-switch-context jit-push-param diff --git a/basis/threads/threads-tests.factor b/basis/threads/threads-tests.factor index 01578d4e64..d5e2f806b6 100644 --- a/basis/threads/threads-tests.factor +++ b/basis/threads/threads-tests.factor @@ -1,6 +1,6 @@ -USING: namespaces io tools.test threads kernel +USING: namespaces io tools.test threads threads.private kernel concurrency.combinators concurrency.promises locals math -words calendar sequences ; +words calendar sequences fry ; IN: threads.tests 3 "x" set @@ -59,3 +59,21 @@ yield ! Test system traps inside threads [ ] [ [ dup ] in-thread yield ] unit-test + +! The start-context-and-delete primitive wasn't rewinding the +! callstack properly. + +! This got fixed for x86-64 but the problem remained on x86-32. + +! The unit test asserts that the callstack is empty from the +! quotation passed to start-context-and-delete. + +[ { } ] [ + [ + '[ + _ [ + callstack swap fulfill stop + ] start-context-and-delete + ] in-thread + ] [ ?promise callstack>array ] bi +] unit-test