X-Git-Url: https://git.hcoop.net/bpt/guile.git/blobdiff_plain/9de87eea47536e25ef99bc25f07afdd759ee3575..587f4edd3947880fb0235f84cc18b62f133a9255:/libguile/stackchk.c diff --git a/libguile/stackchk.c b/libguile/stackchk.c index 4382d871c..6cfb783b1 100644 --- a/libguile/stackchk.c +++ b/libguile/stackchk.c @@ -1,26 +1,32 @@ -/* Copyright (C) 1995,1996,1997, 2000, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997, 2000, 2001, 2006, 2008, 2010 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA */ +#ifdef HAVE_CONFIG_H +# include +#endif #include "libguile/_scm.h" #include "libguile/ports.h" #include "libguile/root.h" +#include "libguile/threads.h" +#include "libguile/dynwind.h" #include "libguile/stackchk.h" @@ -33,15 +39,30 @@ int scm_stack_checking_enabled_p; SCM_SYMBOL (scm_stack_overflow_key, "stack-overflow"); +static void +reset_scm_stack_checking_enabled_p (void *arg) +{ + scm_stack_checking_enabled_p = (int)(scm_t_bits)arg; +} + void scm_report_stack_overflow () { + scm_dynwind_begin (0); /* non-rewindable frame */ + scm_dynwind_unwind_handler (reset_scm_stack_checking_enabled_p, + (void*)(scm_t_bits)scm_stack_checking_enabled_p, + SCM_F_WIND_EXPLICITLY); + scm_stack_checking_enabled_p = 0; + scm_error (scm_stack_overflow_key, NULL, "Stack overflow", SCM_BOOL_F, SCM_BOOL_F); + + /* not reached */ + scm_dynwind_end (); } #endif @@ -75,6 +96,17 @@ scm_stack_report () scm_puts ("\n", port); } + +SCM_DEFINE (scm_sys_get_stack_size, "%get-stack-size", 0, 0, 0, + (), + "Return the current thread's C stack size (in Scheme objects).") +#define FUNC_NAME s_scm_sys_get_stack_size +{ + return scm_from_long (scm_stack_size (SCM_I_CURRENT_THREAD->base)); +} +#undef FUNC_NAME + + void scm_init_stackchk () {