The integrated cross-platform development tool for ANSI Common Lisp LispWorks logo

Lisp Knowledgebase



Title: Stack extension

ID: 10017


Product: LispWorks for Linux, LispWorks for Windows
Version: 4.1, 4.2, 4.3, 4.4
OS: Linux & Windows

Description:
Automatic stack extension is not currently supported in the PC implementation of LispWorks
In other words, hcl:extend-current-stack is not implemented.

First, keep in mind that one cause of unnecessary stack overflow is when tail
call optimization is off. To avoid this, please make sure that you
turn source debugging off with (hcl:toggle-source-debugging nil) and
set the debug optimization level to 0.

Workaround:
Should you really need a larger stack, a workaround is to create it initially by binding system:*sg-default-size* when creating the process, or using the :size option to
mp:process-run-function. Note that this only helps when you run multiprocessing.

If you are getting the stack overflow in a CAPI process, then binding system:*sg-default-size*is the only way because the process is created by the CAPI when you call capi:display.

Otherwise, here's an example using the :size option to mp:process-run-function :


CL-USER 1 > (defvar *count*)
*COUNT*


CL-USER 2 > (defun recurse-to-overflow ()
              (setq *count* 0)
              (let ((count 0))
                (labels ((recurse ()
                                  (incf count)
                                  (recurse)
                                  nil))
                  (handler-case (recurse)
                    (serious-condition ())) ; expect stack-overflow
                  (setq *count* count))))
RECURSE-TO-OVERFLOW


CL-USER 3 > (mp:process-run-function "normal stack" '()
                                     'recurse-to-overflow)
#<MP:PROCESS Name "normal stack" Priority 850000 State "Running">


CL-USER 4 > *count*
193


CL-USER 5 > (mp:process-run-function "larger stack" '(:size 30000)
                                     'recurse-to-overflow)
#<MP:PROCESS Name "larger stack" Priority 850000 State "Running">


CL-USER 6 > *count*
426



In LispWorks 4.2 and later, when using the IDE, you can conveniently set the stack size for the execution process in subsequently created Listener tools, using
Listener > Preferences... > Listener > Initial Stack Size
This setting is persistant across LispWorks sessions, and is user-specific.

See Also:
Workaround:
Patch:

Hardware:N/A
Summary:Extending the stack
Bug#:
Patch Enhancement#:
Reported:5488

Top | Back