summaryrefslogtreecommitdiffstats
path: root/apcu-git.patch
blob: b595a48a50fec28f5db95c5e48bad6a2df2f1517 (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
From 286f70d4a921c0cd21f59f8db8efd2fa45e8d559 Mon Sep 17 00:00:00 2001
From: Remi Collet <fedora@famillecollet.com>
Date: Mon, 8 Jul 2013 14:23:05 +0200
Subject: [PATCH 1/4] restore APC hook for register serializer, fix #24

---
 apc.c            |  4 +--
 apc.h            | 19 +++----------
 apc_serializer.h | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 config.m4        |  2 +-
 config.w32       |  2 +-
 php_apc.c        |  7 ++++-
 6 files changed, 98 insertions(+), 20 deletions(-)
 create mode 100644 apc_serializer.h

diff --git a/apc.c b/apc.c
index 86ed21f..7457b53 100644
--- a/apc.c
+++ b/apc.c
@@ -370,8 +370,8 @@ HashTable* apc_flip_hash(HashTable *hash) {
 /* }}} */
 
 /* {{{ apc_register_serializer */
-PHP_APCU_API zend_bool apc_register_serializer(const char* name, 
-                                  apc_serialize_t serialize, 
+PHP_APCU_API int _apc_register_serializer(const char* name,
+                                  apc_serialize_t serialize,
                                   apc_unserialize_t unserialize,
                                   void *config TSRMLS_DC) {
     int i;
diff --git a/apc.h b/apc.h
index cd1cb59..256ab01 100644
--- a/apc.h
+++ b/apc.h
@@ -127,19 +127,8 @@
 
 /*
 * Serializer API
-* Note: This used to live in apc_serializer.h
 */
-#define APC_SERIALIZER_NAME(module) module##_apc_serializer
-#define APC_SERIALIZER_EXTERN(module) extern apc_serialize_t module##_apc_serializer
-#define APC_UNSERIALIZER_NAME(module) module##_apc_unserializer
-#define APC_UNSERIALIZER_EXTERN(module) extern apc_unserialize_t module##_apc_unserializer
-
-#define APC_SERIALIZER_ARGS unsigned char **buf, size_t *buf_len, const zval *value, void *config TSRMLS_DC
-#define APC_UNSERIALIZER_ARGS zval **value, unsigned char *buf, size_t buf_len, void *config TSRMLS_DC
-
-/* {{{ */
-typedef int (*apc_serialize_t)(APC_SERIALIZER_ARGS);
-typedef int (*apc_unserialize_t)(APC_UNSERIALIZER_ARGS); /* }}} */
+#include "apc_serializer.h"
 
 /* {{{ struct definition: apc_serializer_t */
 typedef struct apc_serializer_t {
@@ -150,10 +139,10 @@
 } apc_serializer_t;
 /* }}} */
 
-/* {{{ apc_register_serializer 
+/* {{{ _apc_register_serializer
  registers the serializer using the given name and paramters */
-PHP_APCU_API zend_bool apc_register_serializer(const char* name, 
-                                               apc_serialize_t serialize, 
+PHP_APCU_API int _apc_register_serializer(const char* name,
+                                               apc_serialize_t serialize,
                                                apc_unserialize_t unserialize,
                                                void *config TSRMLS_DC); /* }}} */
 
diff --git a/apc_serializer.h b/apc_serializer.h
new file mode 100644
index 0000000..0bdaa08
--- /dev/null
+++ b/apc_serializer.h
@@ -0,0 +1,84 @@
+/*
+  +----------------------------------------------------------------------+
+  | APC                                                                  |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 2006-2011 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: Gopal Vijayaraghavan <gopalv@php.net>                       |
+  +----------------------------------------------------------------------+
+
+ */
+
+/* $Id: $ */
+
+#ifndef APC_SERIALIZER_H
+#define APC_SERIALIZER_H
+
+/* this is a shipped .h file, do not include any other header in this file */
+#define APC_SERIALIZER_NAME(module) module##_apc_serializer
+#define APC_UNSERIALIZER_NAME(module) module##_apc_unserializer
+
+#define APC_SERIALIZER_ARGS unsigned char **buf, size_t *buf_len, const zval *value, void *config TSRMLS_DC
+#define APC_UNSERIALIZER_ARGS zval **value, unsigned char *buf, size_t buf_len, void *config TSRMLS_DC
+
+typedef int (*apc_serialize_t)(APC_SERIALIZER_ARGS);
+typedef int (*apc_unserialize_t)(APC_UNSERIALIZER_ARGS);
+
+typedef int (*apc_register_serializer_t)(const char* name,
+                                        apc_serialize_t serialize,
+                                        apc_unserialize_t unserialize,
+                                        void *config TSRMLS_DC);
+
+/*
+ * ABI version for constant hooks. Increment this any time you make any changes
+ * to any function in this file.
+ */
+#define APC_SERIALIZER_ABI "0"
+#define APC_SERIALIZER_CONSTANT "\000apc_register_serializer-" APC_SERIALIZER_ABI
+
+#if !defined(APC_UNUSED)
+# if defined(__GNUC__)
+#  define APC_UNUSED __attribute__((unused))
+# else
+# define APC_UNUSED
+# endif
+#endif
+
+static APC_UNUSED int apc_register_serializer(const char* name,
+                                    apc_serialize_t serialize,
+                                    apc_unserialize_t unserialize,
+                                    void *config TSRMLS_DC)
+{
+    zval apc_magic_constant;
+    int retval = 0;
+
+    /* zend_get_constant will return 1 on success, otherwise apc_magic_constant wouldn't be touched at all */
+    if (zend_get_constant(APC_SERIALIZER_CONSTANT, sizeof(APC_SERIALIZER_CONSTANT)-1, &apc_magic_constant TSRMLS_CC)) {
+        apc_register_serializer_t register_func = (apc_register_serializer_t)(Z_LVAL(apc_magic_constant));
+        if(register_func) {
+            retval = register_func(name, serialize, unserialize, NULL TSRMLS_CC);
+        }
+        zval_dtor(&apc_magic_constant);
+    }
+
+    return retval;
+}
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
+ * vim<600: expandtab sw=4 ts=4 sts=4
+ */
diff --git a/config.m4 b/config.m4
index 8b73ba3..d4fb2fd 100644
--- a/config.m4
+++ b/config.m4
@@ -129,7 +129,7 @@ if test "$PHP_APCU" != "no"; then
   PHP_NEW_EXTENSION(apcu, $apc_sources, $ext_shared,, \\$(APCU_CFLAGS))
   PHP_SUBST(APCU_SHARED_LIBADD)
   PHP_SUBST(APCU_CFLAGS)
-  PHP_INSTALL_HEADERS(ext/apcu, [apc.h apc_api.h apc_cache_api.h apc_lock_api.h apc_pool_api.h apc_sma_api.h apc_bin_api.h])
+  PHP_INSTALL_HEADERS(ext/apcu, [apc.h apc_api.h apc_cache_api.h apc_lock_api.h apc_pool_api.h apc_sma_api.h apc_bin_api.h apc_serializer.h])
   AC_DEFINE(HAVE_APCU, 1, [ ])
 fi
 
diff --git a/php_apc.c b/php_apc.c
index afa69cd..ec1b57b 100644
--- a/php_apc.c
+++ b/php_apc.c
@@ -281,6 +281,8 @@ static PHP_MINIT_FUNCTION(apcu)
 			apc_sma.init(APCG(shm_segments), APCG(shm_size), NULL TSRMLS_CC);
 #endif
 
+			REGISTER_LONG_CONSTANT(APC_SERIALIZER_CONSTANT, (long)&_apc_register_serializer, CONST_PERSISTENT | CONST_CS);
+
 			/* register default serializer */
 			apc_register_serializer(
 				"php", APC_SERIALIZER_NAME(php), APC_UNSERIALIZER_NAME(php), NULL TSRMLS_CC);
@@ -288,7 +290,10 @@ static PHP_MINIT_FUNCTION(apcu)
 			/* register eval serializer */
 			apc_register_serializer(
 				"eval", APC_SERIALIZER_NAME(eval), APC_UNSERIALIZER_NAME(eval), NULL TSRMLS_CC);
-			
+
+			/* test out the constant function pointer */
+			assert(apc_serializers[0].name != NULL);
+
 			/* create user cache */
 			apc_user_cache = apc_cache_create(
 				&apc_sma,
-- 
1.8.1.6


From 07afc5b8cf67c71903f71f1dd6c768112e5798eb Mon Sep 17 00:00:00 2001
From: Remi Collet <fedora@famillecollet.com>
Date: Mon, 8 Jul 2013 14:25:48 +0200
Subject: [PATCH 2/4] php_apc.c:1124:16: warning: variable 'h_files' set but
 not used [-Wunused-but-set-variable]

---
 php_apc.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/php_apc.c b/php_apc.c
index ec1b57b..10a5df3 100644
--- a/php_apc.c
+++ b/php_apc.c
@@ -1121,7 +1121,7 @@ void *apc_erealloc_wrapper(void *ptr, size_t size) {
 PHP_FUNCTION(apc_bin_dumpfile) {
 
     zval *z_files = NULL, *z_user_vars = NULL;
-    HashTable *h_files, *h_user_vars;
+    HashTable *h_user_vars;
     char *filename = NULL;
     int filename_len;
     long flags=0;
@@ -1146,7 +1146,6 @@ void *apc_erealloc_wrapper(void *ptr, size_t size) {
         RETURN_FALSE;
     }
 
-    h_files = z_files ? Z_ARRVAL_P(z_files) : NULL;
     h_user_vars = z_user_vars ? Z_ARRVAL_P(z_user_vars) : NULL;
     bd = apc_bin_dump(apc_user_cache, h_user_vars TSRMLS_CC);
     if(!bd) {
-- 
1.8.1.6


From 0c1d7d3af957f4d06c1265bd1b2752007c56ef53 Mon Sep 17 00:00:00 2001
From: Remi Collet <fedora@famillecollet.com>
Date: Mon, 8 Jul 2013 14:29:43 +0200
Subject: [PATCH 3/4] apc_cache.c:300:5: warning: pointer targets in passing
 argument 1 of 'php_stream_open_for_zend_ex' differ in signedness
 [-Wpointer-sign]

---
 apc_cache.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apc_cache.c b/apc_cache.c
index c7a1b7b..23c761b 100644
--- a/apc_cache.c
+++ b/apc_cache.c
@@ -297,7 +297,7 @@ PHP_APCU_API int APC_UNSERIALIZER_NAME(eval) (APC_UNSERIALIZER_ARGS)
 {
     zend_file_handle zhandle;
     
-    if (php_stream_open_for_zend_ex(buf, &zhandle, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) {
+    if (php_stream_open_for_zend_ex((const char *)buf, &zhandle, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) {
        zend_op_array *op_array = zend_compile_file(&zhandle, ZEND_INCLUDE TSRMLS_CC);
        zend_op_array *active_op_array = EG(active_op_array);
        zval **return_value_ptr_ptr = EG(return_value_ptr_ptr);
-- 
1.8.1.6


From 38ef422d01422e7ce1059a60e87e5f10a6da7294 Mon Sep 17 00:00:00 2001
From: Remi Collet <fedora@famillecollet.com>
Date: Sat, 27 Jul 2013 08:10:26 +0200
Subject: [PATCH 4/4] fix apc_serializers undefined

---
 php_apc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/php_apc.c b/php_apc.c
index 10a5df3..dccdd37 100644
--- a/php_apc.c
+++ b/php_apc.c
@@ -292,7 +292,7 @@ static PHP_MINIT_FUNCTION(apcu)
 				"eval", APC_SERIALIZER_NAME(eval), APC_UNSERIALIZER_NAME(eval), NULL TSRMLS_CC);
 
 			/* test out the constant function pointer */
-			assert(apc_serializers[0].name != NULL);
+			assert(apc_get_serializers()->name != NULL);
 
 			/* create user cache */
 			apc_user_cache = apc_cache_create(
-- 
1.8.1.6