|
|
- From dc8bb6a53bfdfe42d9ae81d4e78c6155ad4bfd6e Mon Sep 17 00:00:00 2001
- From: Michael Heimpold <mhei@heimpold.de>
- 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 <mhei@heimpold.de>
- ---
- 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
- @@ -11,127 +11,13 @@ if test "$PHP_OPCACHE" != "no"; then
- AC_DEFINE(HAVE_MPROTECT, 1, [Define if you have mprotect() function])
- ])
-
- - AC_MSG_CHECKING(for sysvipc shared memory support)
- - AC_TRY_RUN([
- -#include <sys/types.h>
- -#include <sys/wait.h>
- -#include <sys/ipc.h>
- -#include <sys/shm.h>
- -#include <unistd.h>
- -#include <string.h>
- -
- -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 <sys/types.h>
- -#include <sys/wait.h>
- -#include <sys/mman.h>
- -#include <unistd.h>
- -#include <string.h>
- -
- -#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
-
|