| .TH NEEDSTACK 3 |
| .SH NAME |
| needstack \- check for execution stack overflow |
| .SH SYNOPSIS |
| .B |
| #include <u.h> |
| .PP |
| .B |
| #include <libc.h> |
| .PP |
| .B |
| int needstack(int n) |
| .SH DESCRIPTION |
| Stack overflow in the thread library leads to bugs that are |
| difficult to diagnose. |
| The Plan 9 libraries are careful about not allocating |
| large structures on the stack, so typically four or eight kilobytes is plenty of stack |
| for a thread. |
| Other libraries are not always as careful. |
| Calling |
| .I needstack |
| indicates to the thread library that an external routine is about |
| to be called that will require |
| .I n |
| bytes of stack space. |
| If there is not enough space left on the stack, |
| the thread library prints an error and terminates |
| the program. |
| The call |
| .B needstack(0) |
| can be used to check whether the stack is |
| currently overflowed. |
| .PP |
| .I Needstack |
| is defined in |
| .B libc.h |
| so that library functions used in threaded and non-threaded contexts |
| can call it. |
| The implementation of |
| .I needstack |
| in |
| .B lib9 |
| is a no-op. |
| .PP |
| .I Needstack |
| should be thought of as a comment checked at run time, |
| like |
| .IR assert (3). |
| .SH EXAMPLE |
| The X Window library implementation of |
| .I XLookupString |
| allocates some very large buffers on the stack, so |
| .B \*9/src/libdraw/x11-itrans.c |
| calls |
| .B needstack(20*1024) |
| before making calls to |
| .IR XLookupString . |
| If a thread (in this case, the keyboard-reading thread used |
| inside the |
| .IR draw (3) |
| library) |
| does not allocate a large enough stack, the problem is diagnosed |
| immediately rather than left to corrupt memory. |
| .SH SOURCE |
| .B \*9/src/lib9/needstack.c |
| .br |
| .B \*9/src/libthread |
| .SH SEE ALSO |
| .IR thread (3) |