diff options
Diffstat (limited to 'unix/tclUnixThrd.c')
-rw-r--r-- | unix/tclUnixThrd.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c index 297fc3b..ef06dee 100644 --- a/unix/tclUnixThrd.c +++ b/unix/tclUnixThrd.c @@ -199,6 +199,55 @@ TclpThreadExit(status) } #endif /* TCL_THREADS */ +#ifdef TCL_THREADS +/* + *---------------------------------------------------------------------- + * + * TclpThreadGetStackSize -- + * + * This procedure returns the size of the current thread's stack. + * + * Results: + * Stack size (in bytes?) or -1 for error or 0 for undeterminable. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +int +TclpThreadGetStackSize() +{ +#if defined(HAVE_PTHREAD_SETSTACKSIZE) && defined(TclpPthreadGetAttrs) + pthread_attr_t threadAttr; /* This will hold the thread attributes for + * the current thread. */ + size_t stackSize; + + if (pthread_attr_init(&threadAttr) != 0) { + return -1; + } + if (TclpPthreadGetAttrs(pthread_self(), &threadAttr) != 0) { + pthread_attr_destroy(&threadAttr); + return -1; + } + if (pthread_attr_getstacksize(&threadAttr, &stackSize) != 0) { + pthread_attr_destroy(&threadAttr); + return -1; + } + pthread_attr_destroy(&threadAttr); + return (int) stackSize; +#else + /* + * Cannot determine the real stack size of this thread. The + * caller might want to try looking at the process accounting + * limits instead. + */ + return 0; +#endif +} +#endif /* TCL_THREADS */ + /* *---------------------------------------------------------------------- * |