#elif defined (WINDOWSNT)
-#include <windows.h>
+#include <w32term.h>
/* Cannot include <process.h> because of the local header by the same
name, sigh. */
static thread_creation_function *thread_start_address;
/* _beginthread wants a void function, while we are passed a function
- that returns a pointer. So we use a wrapper. */
-static void
+ that returns a pointer. So we use a wrapper. See the command in
+ w32term.h about the need for ALIGN_STACK attribute. */
+static void ALIGN_STACK
w32_beginthread_wrapper (void *arg)
{
(void)thread_start_address (arg);
#include "frame.h"
#include "atimer.h"
-/* Stack alignment stuff. Every CALLBACK function should have the
- ALIGN_STACK attribute if it manipulates Lisp objects, because
- Windows x86 32-bit ABI only guarantees 4-byte stack alignment, and
- that is what we will get when a Windows function calls us. The
- ALIGN_STACK attribute forces GCC to emit a preamble code to
- re-align the stack at function entry. Further details about this
- can be found in http://www.peterstock.co.uk/games/mingw_sse/. */
+/* Stack alignment stuff. Every CALLBACK and thread function should
+ have the ALIGN_STACK attribute if it manipulates Lisp objects,
+ because Windows x86 32-bit ABI only guarantees 4-byte stack
+ alignment, and that is what we will get when a Windows function
+ calls us. The ALIGN_STACK attribute forces GCC to emit a preamble
+ code to re-align the stack at function entry. Further details
+ about this can be found in
+ http://www.peterstock.co.uk/games/mingw_sse/. */
#ifdef __GNUC__
# if USE_STACK_LISP_OBJECTS && !defined _WIN64 && !defined __x86_64__ \
&& __GNUC__ + (__GNUC_MINOR__ > 1) >= 5