Make sure thread stack is properly aligned on MS-Windows
* src/systhread.c: Include w32term.h instead of windows.h. (w32_beginthread_wrapper): Add ALIGN_STACK attribute, to ensure the thread's stack is correctly aligned. * src/w32term.h (ALIGN_STACK): Update commentary.
This commit is contained in:
parent
d7038020aa
commit
aa0c38f358
2 changed files with 12 additions and 10 deletions
|
@ -187,7 +187,7 @@ sys_thread_yield (void)
|
||||||
|
|
||||||
#elif defined (WINDOWSNT)
|
#elif defined (WINDOWSNT)
|
||||||
|
|
||||||
#include <windows.h>
|
#include <w32term.h>
|
||||||
|
|
||||||
/* Cannot include <process.h> because of the local header by the same
|
/* Cannot include <process.h> because of the local header by the same
|
||||||
name, sigh. */
|
name, sigh. */
|
||||||
|
@ -326,8 +326,9 @@ sys_thread_self (void)
|
||||||
static thread_creation_function *thread_start_address;
|
static thread_creation_function *thread_start_address;
|
||||||
|
|
||||||
/* _beginthread wants a void function, while we are passed a function
|
/* _beginthread wants a void function, while we are passed a function
|
||||||
that returns a pointer. So we use a wrapper. */
|
that returns a pointer. So we use a wrapper. See the command in
|
||||||
static void
|
w32term.h about the need for ALIGN_STACK attribute. */
|
||||||
|
static void ALIGN_STACK
|
||||||
w32_beginthread_wrapper (void *arg)
|
w32_beginthread_wrapper (void *arg)
|
||||||
{
|
{
|
||||||
(void)thread_start_address (arg);
|
(void)thread_start_address (arg);
|
||||||
|
|
|
@ -22,13 +22,14 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "atimer.h"
|
#include "atimer.h"
|
||||||
|
|
||||||
/* Stack alignment stuff. Every CALLBACK function should have the
|
/* Stack alignment stuff. Every CALLBACK and thread function should
|
||||||
ALIGN_STACK attribute if it manipulates Lisp objects, because
|
have the ALIGN_STACK attribute if it manipulates Lisp objects,
|
||||||
Windows x86 32-bit ABI only guarantees 4-byte stack alignment, and
|
because Windows x86 32-bit ABI only guarantees 4-byte stack
|
||||||
that is what we will get when a Windows function calls us. The
|
alignment, and that is what we will get when a Windows function
|
||||||
ALIGN_STACK attribute forces GCC to emit a preamble code to
|
calls us. The ALIGN_STACK attribute forces GCC to emit a preamble
|
||||||
re-align the stack at function entry. Further details about this
|
code to re-align the stack at function entry. Further details
|
||||||
can be found in http://www.peterstock.co.uk/games/mingw_sse/. */
|
about this can be found in
|
||||||
|
http://www.peterstock.co.uk/games/mingw_sse/. */
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
# if USE_STACK_LISP_OBJECTS && !defined _WIN64 && !defined __x86_64__ \
|
# if USE_STACK_LISP_OBJECTS && !defined _WIN64 && !defined __x86_64__ \
|
||||||
&& __GNUC__ + (__GNUC_MINOR__ > 1) >= 5
|
&& __GNUC__ + (__GNUC_MINOR__ > 1) >= 5
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue