From dc8bb6a53bfdfe42d9ae81d4e78c6155ad4bfd6e Mon Sep 17 00:00:00 2001 From: Michael Heimpold Date: Sun, 17 May 2015 16:50:50 +0200 Subject: [PATCH] ext/opcache: fix detection of shm/mmap The detection of sysvipc and mmap doesn't work well when cross-compiling, so I decided to only check for the availability of the functions involved. This is not a clean solution, but works for now(tm) :-) It should be discussed with upstream to find a better solution. This solves the issue reported at https://github.com/openwrt/packages/issues/1010 and makes opcache usable on OpenWrt. Signed-off-by: Michael Heimpold --- ext/opcache/config.m4 | 122 ++----------------------------------------------- 1 file changed, 4 insertions(+), 118 deletions(-) diff --git a/ext/opcache/config.m4 b/ext/opcache/config.m4 index b7e4835..7b6c0aa 100644 --- a/ext/opcache/config.m4 +++ b/ext/opcache/config.m4 @@ -28,127 +28,13 @@ if test "$PHP_OPCACHE" != "no"; then AC_CHECK_HEADERS([unistd.h sys/uio.h]) - AC_MSG_CHECKING(for sysvipc shared memory support) - AC_TRY_RUN([ -#include -#include -#include -#include -#include -#include - -int main() { - pid_t pid; - int status; - int ipc_id; - char *shm; - struct shmid_ds shmbuf; - - ipc_id = shmget(IPC_PRIVATE, 4096, (IPC_CREAT | SHM_R | SHM_W)); - if (ipc_id == -1) { - return 1; - } - - shm = shmat(ipc_id, NULL, 0); - if (shm == (void *)-1) { - shmctl(ipc_id, IPC_RMID, NULL); - return 2; - } - - if (shmctl(ipc_id, IPC_STAT, &shmbuf) != 0) { - shmdt(shm); - shmctl(ipc_id, IPC_RMID, NULL); - return 3; - } - - shmbuf.shm_perm.uid = getuid(); - shmbuf.shm_perm.gid = getgid(); - shmbuf.shm_perm.mode = 0600; - - if (shmctl(ipc_id, IPC_SET, &shmbuf) != 0) { - shmdt(shm); - shmctl(ipc_id, IPC_RMID, NULL); - return 4; - } - - shmctl(ipc_id, IPC_RMID, NULL); - - strcpy(shm, "hello"); - - pid = fork(); - if (pid < 0) { - return 5; - } else if (pid == 0) { - strcpy(shm, "bye"); - return 6; - } - if (wait(&status) != pid) { - return 7; - } - if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) { - return 8; - } - if (strcmp(shm, "bye") != 0) { - return 9; - } - return 0; -} -],dnl + AC_CHECK_FUNC(shmget,[ AC_DEFINE(HAVE_SHM_IPC, 1, [Define if you have SysV IPC SHM support]) - msg=yes,msg=no,msg=no) - AC_MSG_RESULT([$msg]) - - AC_MSG_CHECKING(for mmap() using MAP_ANON shared memory support) - AC_TRY_RUN([ -#include -#include -#include -#include -#include - -#ifndef MAP_ANON -# ifdef MAP_ANONYMOUS -# define MAP_ANON MAP_ANONYMOUS -# endif -#endif -#ifndef MAP_FAILED -# define MAP_FAILED ((void*)-1) -#endif - -int main() { - pid_t pid; - int status; - char *shm; - - shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); - if (shm == MAP_FAILED) { - return 1; - } - - strcpy(shm, "hello"); + ]) - pid = fork(); - if (pid < 0) { - return 5; - } else if (pid == 0) { - strcpy(shm, "bye"); - return 6; - } - if (wait(&status) != pid) { - return 7; - } - if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) { - return 8; - } - if (strcmp(shm, "bye") != 0) { - return 9; - } - return 0; -} -],dnl + AC_CHECK_FUNC(mmap,[ AC_DEFINE(HAVE_SHM_MMAP_ANON, 1, [Define if you have mmap(MAP_ANON) SHM support]) - msg=yes,msg=no,msg=no) - AC_MSG_RESULT([$msg]) + ]) AC_MSG_CHECKING(for mmap() using /dev/zero shared memory support) AC_TRY_RUN([ -- 1.7.10.4