New PHP5 APC - version 3.0.18, using PHP5 5.2.0-8+etch10,
[php5-apc.git] / apc_shm.c
diff --git a/apc_shm.c b/apc_shm.c
new file mode 100644 (file)
index 0000000..c94eb1e
--- /dev/null
+++ b/apc_shm.c
@@ -0,0 +1,110 @@
+/*
+  +----------------------------------------------------------------------+
+  | APC                                                                  |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 2006 The PHP Group                                     |
+  +----------------------------------------------------------------------+
+  | This source file is subject to version 3.01 of the PHP license,      |
+  | that is bundled with this package in the file LICENSE, and is        |
+  | available through the world-wide-web at the following url:           |
+  | http://www.php.net/license/3_01.txt                                  |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@php.net so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Authors: Daniel Cowgill <dcowgill@communityconnect.com>              |
+  |          Rasmus Lerdorf <rasmus@php.net>                             |
+  +----------------------------------------------------------------------+
+
+   This software was contributed to PHP by Community Connect Inc. in 2002
+   and revised in 2005 by Yahoo! Inc. to add support for PHP 5.1.
+   Future revisions and derivatives of this source code must acknowledge
+   Community Connect Inc. as the original contributor of this module by
+   leaving this note intact in the source code.
+
+   All other licensing and usage conditions are those of the PHP Group.
+
+ */
+
+/* $Id: apc_shm.c,v 3.11.2.1 2008/03/25 21:00:22 rasmus Exp $ */
+
+#include "apc_shm.h"
+#include "apc.h"
+#ifdef PHP_WIN32
+/* shm functions are available in TSRM */
+#include <tsrm/tsrm_win32.h>
+#define key_t long
+#else
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/stat.h>
+#endif
+
+#ifndef SHM_R
+# define SHM_R 0444 /* read permission */
+#endif
+#ifndef SHM_A
+# define SHM_A 0222 /* write permission */
+#endif
+
+int apc_shm_create(const char* pathname, int proj, size_t size)
+{
+    int shmid;  /* shared memory id */
+    int oflag;  /* permissions on shm */
+    key_t key;  /* shm key returned by ftok */
+
+    key = IPC_PRIVATE;
+#ifndef PHP_WIN32
+       /* no ftok yet for win32 */
+    if (pathname != NULL) {
+        if ((key = ftok(pathname, proj)) < 0) {
+            apc_eprint("apc_shm_create: ftok failed:");
+        }
+    }
+#endif
+
+    oflag = IPC_CREAT | SHM_R | SHM_A;
+    if ((shmid = shmget(key, size, oflag)) < 0) {
+        apc_eprint("apc_shm_create: shmget(%d, %d, %d) failed: %s. It is possible that the chosen SHM segment size is higher than the operation system allows. Linux has usually a default limit of 32MB per segment.", key, size, oflag, strerror(errno));
+    }
+
+    return shmid;
+}
+
+void apc_shm_destroy(int shmid)
+{
+    /* we expect this call to fail often, so we do not check */
+    shmctl(shmid, IPC_RMID, 0);
+}
+
+void* apc_shm_attach(int shmid)
+{
+    void* shmaddr;  /* the shared memory address */
+
+    if ((long)(shmaddr = shmat(shmid, 0, 0)) == -1) {
+        apc_eprint("apc_shm_attach: shmat failed:");
+    }
+
+    /*
+     * We set the shmid for removal immediately after attaching to it. The
+     * segment won't disappear until all processes have detached from it.
+     */
+    apc_shm_destroy(shmid);
+    return shmaddr;
+}
+
+void apc_shm_detach(void* shmaddr)
+{
+    if (shmdt(shmaddr) < 0) {
+        apc_eprint("apc_shm_detach: shmdt failed:");
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: expandtab sw=4 ts=4 sts=4 fdm=marker
+ * vim<600: expandtab sw=4 ts=4 sts=4
+ */