summaryrefslogtreecommitdiffstats
path: root/config/user-nptl_guard_within_stack.m4
blob: d094da7332ca7b07622bd6a59a5777a2895be921 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
dnl #
dnl # Check if the glibc NPTL threading implementation includes the guard area
dnl # within the stack size allocation, rather than allocating extra space at
dnl # the end of the stack, as POSIX.1 requires.
dnl #
AC_DEFUN([ZFS_AC_CONFIG_USER_STACK_GUARD], [

	AC_MSG_CHECKING([whether pthread stack includes guard])

	saved_CFLAGS="$CFLAGS"
	CFLAGS="-fstack-check"
	saved_LDFLAGS="$LDFLAGS"
	LDFLAGS="-lpthread"

	AC_RUN_IFELSE(AC_LANG_PROGRAM(
	[
		#include <pthread.h>
		#include <sys/resource.h>
		#include <unistd.h>
		#include <bits/local_lim.h>

		#define PAGESIZE (sysconf(_SC_PAGESIZE))
		#define STACK_SIZE 8192
		#define BUFSIZE 4096

		void * func(void *arg)
		{
			char buf[[[BUFSIZE]]];
		}
	],
	[
		pthread_t tid;
		pthread_attr_t attr;
		struct rlimit l;

		l.rlim_cur = 0;
		l.rlim_max = 0;
		setrlimit(RLIMIT_CORE, &l);
		pthread_attr_init(&attr);
		pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + STACK_SIZE);
		pthread_attr_setguardsize(&attr, PAGESIZE);
		pthread_create(&tid, &attr, func, NULL);
		pthread_join(tid, NULL);
	]),
	[
		AC_MSG_RESULT([no])
	],
	[
		AC_DEFINE([NPTL_GUARD_WITHIN_STACK], 1,
			[Define to 1 if NPTL threading implementation includes
			guard area in stack allocation])
		AC_MSG_RESULT([yes])
	])
	CFLAGS="$saved_CFLAGS"
	LDFLAGS="$saved_LDFLAGS"
])