php5: update version to 5.3.4
authorHauke Mehrtens <hauke@hauke-m.de>
Wed, 22 Dec 2010 01:54:35 +0000 (01:54 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Wed, 22 Dec 2010 01:54:35 +0000 (01:54 +0000)
* fix build with libiconv
* update apc extension

SVN-Revision: 24774

lang/php5/Makefile
lang/php5/patches/001-configure_cross.patch [deleted file]
lang/php5/patches/005-APC.patch

index 538f5d7..4ffc3e8 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=php
-PKG_VERSION:=5.3.1
-PKG_RELEASE:=4
+PKG_VERSION:=5.3.4
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://www.php.net/distributions/
-PKG_MD5SUM:=63e97ad450f0f7259e785100b634c797
+PKG_MD5SUM:=2c069d8f690933e3bf6a8741ed818150
 
 PKG_FIXUP:=libtool no-autoreconf
 PKG_BUILD_PARALLEL:=1 
@@ -390,7 +390,7 @@ PKG_CONFIGURE_OPTS:= \
        --disable-phar
 
 ifneq ($(SDK),)
-  PKG_BUILD_DEPENDS:=libopenssl zlib libcurl libgd libgmp libopenldap libmysqlclient libpq libsqlite2 libpthread libsqlite3 libpcre libxml2
+  PKG_BUILD_DEPENDS+=libopenssl zlib libcurl libgd libgmp libopenldap libmysqlclient libpq libsqlite2 libpthread libsqlite3 libpcre libxml2 libiconv
 # force PKG_CONFIGURE_{LIBS,OPTS} below when built in the SDK
   CONFIG_PACKAGE_php5-cli:=m
   CONFIG_PACKAGE_php5-cgi:=m
@@ -469,7 +469,7 @@ else
 endif
 
 ifneq ($(CONFIG_PACKAGE_php5-mod-iconv),)
-  PKG_CONFIGURE_OPTS+= --with-iconv=shared,"$(STAGING_DIR)/usr/lib/libiconv"
+  PKG_CONFIGURE_OPTS+= --with-iconv=shared,"$(STAGING_DIR)/usr"
 else
   PKG_CONFIGURE_OPTS+= --without-iconv
 endif
diff --git a/lang/php5/patches/001-configure_cross.patch b/lang/php5/patches/001-configure_cross.patch
deleted file mode 100644 (file)
index 7265676..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-diff -Naur php-5.3.1.orig/configure php-5.3.1/configure
---- php-5.3.1.orig/configure   2009-11-18 21:11:57.000000000 +0100
-+++ php-5.3.1/configure        2010-01-15 23:43:10.000000000 +0100
-@@ -14712,7 +14712,7 @@
-     ac_libs=$LIBS
-     LIBS="$LIBS -ldl"
-     if test "$cross_compiling" = yes; then
--  found=no
-+  found=yes
- else
-   cat > conftest.$ac_ext <<EOF
- #line 14719 "configure"
-@@ -54494,7 +54494,7 @@
-     _SAVE_CPPFLAGS=$CPPFLAGS
-   _SAVE_LIBS=$LIBS
-   CPPFLAGS="$CPPFLAGS -I$LDAP_INCDIR"
--  LIBS="$LIBS $LDAP_SHARED_LIBADD"
-+  LIBS="$LIBS $LDAP_SHARED_LIBADD -lsasl2"
-     echo $ac_n "checking for 3 arg ldap_set_rebind_proc""... $ac_c" 1>&6
- echo "configure:54501: checking for 3 arg ldap_set_rebind_proc" >&5
index d11859e..a529774 100644 (file)
@@ -1,12 +1,11 @@
-diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
---- php-5.3.1.orig/ext/apc/apc_bin.c   1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_bin.c        1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,946 @@
+--- /dev/null
++++ b/ext/apc/apc_bin.c
+@@ -0,0 +1,987 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2009 The PHP Group                                     |
++  | Copyright (c) 2006-2010 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        |
@@ -21,7 +20,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +
 + */
 +
-+/* $Id: apc_bin.c 284580 2009-07-22 06:05:31Z kalle $ */
++/* $Id: apc_bin.c 303383 2010-09-15 08:15:58Z dmitry $ */
 +
 +/* Creates a binary architecture specific output to a string or file containing
 + * the current cache contents for both fies and user variables.  This is accomplished
@@ -54,7 +53,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +            ptr = (void*)((long)(ptr) - (long)(bd)); \
 +            printf("%x in %s on line %d", ptr, __FILE__, __LINE__); \
 +        } else if((long)ptr > bd->size) { /* not swizzled */ \
-+            apc_eprint("pointer to be swizzled is not within allowed memory range! (%x < %x < %x) in %s on %d", (long)bd, ptr, ((long)bd + bd->size), __FILE__, __LINE__); \
++            apc_error("pointer to be swizzled is not within allowed memory range! (%x < %x < %x) in %s on %d" TSRMLS_CC, (long)bd, ptr, ((long)bd + bd->size), __FILE__, __LINE__); \
 +        } \
 +        printf("\n"); \
 +    } while(0);
@@ -73,7 +72,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +        if((long)bd < (long)ptr && (ulong)ptr < ((long)bd + bd->size)) { \
 +            ptr = (void*)((long)(ptr) - (long)(bd)); \
 +        } else if((ulong)ptr > bd->size) { /* not swizzled */ \
-+            apc_eprint("pointer to be swizzled is not within allowed memory range! (%x < %x < %x) in %s on %d", (long)bd, ptr, ((long)bd + bd->size), __FILE__, __LINE__); \
++            apc_error("pointer to be swizzled is not within allowed memory range! (%x < %x < %x) in %s on %d" TSRMLS_CC, (long)bd, ptr, ((long)bd + bd->size), __FILE__, __LINE__); \
 +        } \
 +    } while(0);
 +
@@ -85,9 +84,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +#endif
 +
 +
-+static void *apc_bd_alloc(size_t size);
-+static void apc_bd_free(void *ptr);
-+static void *apc_bd_alloc_ex(void *ptr_new, size_t size);
++static void *apc_bd_alloc(size_t size TSRMLS_DC);
++static void apc_bd_free(void *ptr TSRMLS_DC);
++static void *apc_bd_alloc_ex(void *ptr_new, size_t size TSRMLS_DC);
 +
 +typedef void (*apc_swizzle_cb_t)(apc_bd_t *bd, zend_llist *ll, void *ptr TSRMLS_DC);
 +
@@ -113,18 +112,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +
 +/* {{{ apc_bd_alloc
 + *  callback for copy_* functions */
-+static void *apc_bd_alloc(size_t size) {
-+    return apc_bd_alloc_ex(NULL, size);
++static void *apc_bd_alloc(size_t size TSRMLS_DC) {
++    return apc_bd_alloc_ex(NULL, size TSRMLS_CC);
 +} /* }}} */
 +
 +
 +/* {{{ apc_bd_free
 + *  callback for copy_* functions */
-+static void apc_bd_free(void *ptr) {
++static void apc_bd_free(void *ptr TSRMLS_DC) {
 +    size_t *size;
-+    TSRMLS_FETCH();
 +    if(zend_hash_index_find(&APCG(apc_bd_alloc_list), (ulong)ptr, (void**)&size) == FAILURE) {
-+        apc_eprint("apc_bd_free could not free pointer (not found in list: %x)", ptr);
++        apc_error("apc_bd_free could not free pointer (not found in list: %x)" TSRMLS_CC, ptr);
 +    }
 +    APCG(apc_bd_alloc_ptr) = (void*)((size_t)APCG(apc_bd_alloc_ptr) - *size);
 +    zend_hash_index_del(&APCG(apc_bd_alloc_list), (ulong)ptr);
@@ -137,9 +135,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 + *  with a range of size.  If ptr_new is NULL, returns the next available
 + *  block of given size.
 + */
-+static void *apc_bd_alloc_ex(void *ptr_new, size_t size) {
++static void *apc_bd_alloc_ex(void *ptr_new, size_t size TSRMLS_DC) {
 +    void *rval;
-+    TSRMLS_FETCH();
 +
 +    rval = APCG(apc_bd_alloc_ptr);
 +    if(ptr_new != NULL) {  /* reset ptrs */
@@ -148,10 +145,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +    } else {  /* alloc block */
 +      APCG(apc_bd_alloc_ptr) = (void*)((size_t)APCG(apc_bd_alloc_ptr) + size);
 +#if APC_BINDUMP_DEBUG
-+      apc_nprint("apc_bd_alloc: rval: 0x%x  ptr: 0x%x  ubptr: 0x%x  size: %d", rval, APCG(apc_bd_alloc_ptr), APCG(apc_bd_alloc_ubptr), size);
++      apc_notice("apc_bd_alloc: rval: 0x%x  ptr: 0x%x  ubptr: 0x%x  size: %d" TSRMLS_CC, rval, APCG(apc_bd_alloc_ptr), APCG(apc_bd_alloc_ubptr), size);
 +#endif
 +      if(APCG(apc_bd_alloc_ptr) > APCG(apc_bd_alloc_ubptr)) {
-+          apc_eprint("Exceeded bounds check in apc_bd_alloc_ex by %d bytes.", (unsigned char *) APCG(apc_bd_alloc_ptr) - (unsigned char *) APCG(apc_bd_alloc_ubptr));
++          apc_error("Exceeded bounds check in apc_bd_alloc_ex by %d bytes." TSRMLS_CC, (unsigned char *) APCG(apc_bd_alloc_ptr) - (unsigned char *) APCG(apc_bd_alloc_ubptr));
 +      }
 +      zend_hash_index_update(&APCG(apc_bd_alloc_list), (ulong)rval, &size, sizeof(size_t), NULL);
 +    }
@@ -170,7 +167,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +            printf(" in %s on line %d \n", file, line);
 +#endif
 +        } else if((ulong)ptr > bd->size) {
-+            apc_eprint("pointer to be swizzled is not within allowed memory range! (%x < %x < %x) in %s on %d", (long)bd, *ptr, ((long)bd + bd->size), file, line); \
++            apc_error("pointer to be swizzled is not within allowed memory range! (%x < %x < %x) in %s on %d" TSRMLS_CC, (long)bd, *ptr, ((long)bd + bd->size), file, line); \
 +        }
 +    }
 +} /* }}} */
@@ -195,6 +192,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +
 +    /* swizzle op_array */
 +    for(i=0; i < op_array->last; i++) {
++#ifndef ZEND_ENGINE_2_4
 +        if(op_array->opcodes[i].result.op_type == IS_CONST) {
 +            apc_swizzle_zval(bd, ll, &op_array->opcodes[i].result.u.constant TSRMLS_CC);
 +        }
@@ -204,14 +202,23 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +        if(op_array->opcodes[i].op2.op_type == IS_CONST) {
 +            apc_swizzle_zval(bd, ll, &op_array->opcodes[i].op2.u.constant TSRMLS_CC);
 +        }
++#endif
 +        switch (op_array->opcodes[i].opcode) {
 +            case ZEND_JMP:
++#ifdef ZEND_ENGINE_2_4
++                apc_swizzle_ptr(bd, ll, &op_array->opcodes[i].op1.jmp_addr);
++#else
 +                apc_swizzle_ptr(bd, ll, &op_array->opcodes[i].op1.u.jmp_addr);
++#endif
 +            case ZEND_JMPZ:
 +            case ZEND_JMPNZ:
 +            case ZEND_JMPZ_EX:
 +            case ZEND_JMPNZ_EX:
++#ifdef ZEND_ENGINE_2_4
++                apc_swizzle_ptr(bd, ll, &op_array->opcodes[i].op2.jmp_addr);
++#else
 +                apc_swizzle_ptr(bd, ll, &op_array->opcodes[i].op2.u.jmp_addr);
++#endif
 +        }
 +    }
 +    apc_swizzle_ptr(bd, ll, &op_array->opcodes);
@@ -274,8 +281,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +        apc_swizzle_ptr(bd, ll, &ce->name);
 +    }
 +
-+    if(ce->doc_comment) {
-+        apc_swizzle_ptr(bd, ll, &ce->doc_comment);
++    if (ce->type == ZEND_USER_CLASS && ZEND_CE_DOC_COMMENT(ce)) {
++        apc_swizzle_ptr(bd, ll, &ZEND_CE_DOC_COMMENT(ce));
 +    }
 +
 +#ifndef ZEND_ENGINE_2
@@ -283,12 +290,38 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +#endif
 +
 +    apc_swizzle_hashtable(bd, ll, &ce->function_table, (apc_swizzle_cb_t)apc_swizzle_function, 0 TSRMLS_CC);
++#ifdef ZEND_ENGINE_2_4
++    if (ce->default_properties_table) {
++        int i;
++
++        for (i = 0; i < ce->default_properties_count; i++) {
++            if (ce->default_properties_table[i]) {
++                apc_swizzle_ptr(bd, ll, &ce->default_properties_table[i]);
++                apc_swizzle_zval(bd, ll, ce->default_properties_table[i] TSRMLS_CC);
++            }
++        }
++    }
++#else
 +    apc_swizzle_hashtable(bd, ll, &ce->default_properties, (apc_swizzle_cb_t)apc_swizzle_zval, 1 TSRMLS_CC);
++#endif
 +
 +#ifdef ZEND_ENGINE_2
 +    apc_swizzle_hashtable(bd, ll, &ce->properties_info, (apc_swizzle_cb_t)apc_swizzle_property_info, 0 TSRMLS_CC);
 +#endif
 +
++#ifdef ZEND_ENGINE_2_4
++    if (ce->default_static_members_table) {
++        int i;
++
++        for (i = 0; i < ce->default_static_members_count; i++) {
++            if (ce->default_static_members_table[i]) {
++                apc_swizzle_ptr(bd, ll, &ce->default_static_members_table[i]);
++                apc_swizzle_zval(bd, ll, ce->default_static_members_table[i] TSRMLS_CC);
++            }
++        }
++    }
++    ce->static_members_table = ce->default_static_members_table;
++#else
 +    apc_swizzle_hashtable(bd, ll, &ce->default_static_members, (apc_swizzle_cb_t)apc_swizzle_zval, 1 TSRMLS_CC);
 +
 +    if(ce->static_members != &ce->default_static_members) {
@@ -296,12 +329,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +    } else {
 +        apc_swizzle_ptr(bd, ll, &ce->static_members);
 +    }
++#endif
 +
 +    apc_swizzle_hashtable(bd, ll, &ce->constants_table, (apc_swizzle_cb_t)apc_swizzle_zval, 1 TSRMLS_CC);
 +
-+    if(ce->builtin_functions) {
-+        for(i=0; ce->builtin_functions[i].fname; i++) {
-+            apc_swizzle_function_entry(bd, ll, &ce->builtin_functions[i] TSRMLS_CC);
++    if(ce->type == ZEND_INTERNAL_CLASS &&  ZEND_CE_BUILTIN_FUNCTIONS(ce)) {
++        for(i=0; ZEND_CE_BUILTIN_FUNCTIONS(ce)[i].fname; i++) {
++            apc_swizzle_function_entry(bd, ll, &ZEND_CE_BUILTIN_FUNCTIONS(ce)[i] TSRMLS_CC);
 +        }
 +    }
 +
@@ -320,7 +354,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +    apc_swizzle_ptr(bd, ll, &ce->__tostring);
 +#endif
 +
-+    apc_swizzle_ptr(bd, ll, &ce->filename);
++    if (ce->type == ZEND_USER_CLASS) {
++        apc_swizzle_ptr(bd, ll, &ZEND_CE_FILENAME(ce));
++    }
 +} /* }}} */
 +
 +
@@ -517,7 +553,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +        PHP_MD5Update(&context, (const unsigned char*)bd, bd->size);
 +        PHP_MD5Final(digest, &context);
 +        if(memcmp(md5_orig, digest, 16)) {
-+            apc_eprint("MD5 checksum of binary dump failed.");
++            apc_error("MD5 checksum of binary dump failed." TSRMLS_CC);
 +            memcpy(bd->md5, md5_orig, 16); /* add back md5 checksum */
 +            return -1;
 +        }
@@ -529,7 +565,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +          crc = ((crc >> 8) & 0x00FFFFFF) ^ crc32tab[(crc ^ (*crc_p)) & 0xFF ];
 +        }
 +        if(crc_orig != crc) {
-+            apc_eprint("CRC32 checksum of binary dump failed.");
++            apc_error("CRC32 checksum of binary dump failed." TSRMLS_CC);
 +            bd->crc = crc_orig;
 +            return -1;
 +        }
@@ -597,12 +633,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +
 +    /* fixup hashtable destructor pointers */
 +    ce->function_table.pDestructor = (dtor_func_t)zend_function_dtor;
++#ifndef ZEND_ENGINE_2_4
 +    ce->default_properties.pDestructor = (dtor_func_t)zval_ptr_dtor_wrapper;
++#endif
 +    ce->properties_info.pDestructor = (dtor_func_t)zval_ptr_dtor_wrapper;
++#ifndef ZEND_ENGINE_2_4
 +    ce->default_static_members.pDestructor = (dtor_func_t)zval_ptr_dtor_wrapper;
 +    if (ce->static_members) {
 +        ce->static_members->pDestructor = (dtor_func_t)zval_ptr_dtor_wrapper;
 +    }
++#endif
 +    ce->constants_table.pDestructor = (dtor_func_t)zval_ptr_dtor_wrapper;
 +}
 +/* }}} */
@@ -633,7 +673,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +    for(i=0; i < apc_user_cache->num_slots; i++) {
 +        sp = apc_user_cache->slots[i];
 +        for(; sp != NULL; sp = sp->next) {
-+            if(apc_bin_checkfilter(user_vars, sp->key.data.user.identifier, sp->key.data.user.identifier_len+1)) {
++            if(apc_bin_checkfilter(user_vars, sp->key.data.user.identifier, sp->key.data.user.identifier_len)) {
 +                size += sizeof(apc_bd_entry_t*) + sizeof(apc_bd_entry_t);
 +                size += sp->value->mem_size - (sizeof(apc_cache_entry_t) - sizeof(apc_cache_entry_value_t));
 +                count++;
@@ -651,7 +691,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +                }
 +            } else {
 +                /* TODO: Currently we don't support APC_CACHE_KEY_FILE type.  We need to store the path and re-stat on load */
-+                apc_wprint("Excluding some files from apc_bin_dump[file].  Cached files must be included using full path with apc.stat=0.");
++                apc_warning("Excluding some files from apc_bin_dump[file].  Cached files must be included using full path with apc.stat=0." TSRMLS_CC);
 +            }
 +        }
 +    }
@@ -660,16 +700,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +    bd = emalloc(size);
 +    bd->size = size;
 +    pool_ptr = emalloc(sizeof(apc_pool));
-+    apc_bd_alloc_ex(pool_ptr, sizeof(apc_pool));
-+    ctxt.pool = apc_pool_create(APC_UNPOOL, apc_bd_alloc, apc_bd_free, NULL, NULL);  /* ideally the pool wouldn't be alloc'd as part of this */
++    apc_bd_alloc_ex(pool_ptr, sizeof(apc_pool) TSRMLS_CC);
++    ctxt.pool = apc_pool_create(APC_UNPOOL, apc_bd_alloc, apc_bd_free, NULL, NULL TSRMLS_CC);  /* ideally the pool wouldn't be alloc'd as part of this */
 +    if (!ctxt.pool) { /* TODO need to cleanup */
-+        apc_wprint("Unable to allocate memory for pool.");
++        apc_warning("Unable to allocate memory for pool." TSRMLS_CC);
 +        return NULL;
 +    }
 +    ctxt.copy = APC_COPY_IN_USER;  /* avoid stupid ALLOC_ZVAL calls here, hack */
-+    apc_bd_alloc_ex( (void*)((long)bd + sizeof(apc_bd_t)), bd->size - sizeof(apc_bd_t) -1);
++    apc_bd_alloc_ex((void*)((long)bd + sizeof(apc_bd_t)), bd->size - sizeof(apc_bd_t) -1 TSRMLS_CC);
 +    bd->num_entries = count;
-+    bd->entries = apc_bd_alloc_ex(NULL, sizeof(apc_bd_entry_t) * count);
++    bd->entries = apc_bd_alloc_ex(NULL, sizeof(apc_bd_entry_t) * count TSRMLS_CC);
 +
 +    /* User entries */
 +    zend_hash_init(&APCG(copied_zvals), 0, NULL, NULL, 0);
@@ -677,13 +717,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +    for(i=0; i < apc_user_cache->num_slots; i++) {
 +        sp = apc_user_cache->slots[i];
 +        for(; sp != NULL; sp = sp->next) {
-+            if(apc_bin_checkfilter(user_vars, sp->key.data.user.identifier, sp->key.data.user.identifier_len+1)) {
++            if(apc_bin_checkfilter(user_vars, sp->key.data.user.identifier, sp->key.data.user.identifier_len)) {
 +                ep = &bd->entries[count];
 +                ep->type = sp->value->type;
-+                ep->val.user.info = apc_bd_alloc(sp->value->data.user.info_len+1);
-+                memcpy(ep->val.user.info, sp->value->data.user.info, sp->value->data.user.info_len+1);
++                ep->val.user.info = apc_bd_alloc(sp->value->data.user.info_len TSRMLS_CC);
++                memcpy(ep->val.user.info, sp->value->data.user.info, sp->value->data.user.info_len);
 +                ep->val.user.info_len = sp->value->data.user.info_len;
-+                ep->val.user.val = apc_copy_zval(NULL, sp->value->data.user.val, &ctxt);
++                ep->val.user.val = apc_copy_zval(NULL, sp->value->data.user.val, &ctxt TSRMLS_CC);
 +                ep->val.user.ttl = sp->value->data.user.ttl;
 +
 +                /* swizzle pointers */
@@ -706,17 +746,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +                if(apc_bin_checkfilter(files, sp->key.data.fpfile.fullpath, sp->key.data.fpfile.fullpath_len+1)) {
 +                    ep = &bd->entries[count];
 +                    ep->type = sp->key.type;
-+                    ep->val.file.filename = apc_bd_alloc(strlen(sp->value->data.file.filename)+1);
++                    ep->val.file.filename = apc_bd_alloc(strlen(sp->value->data.file.filename) + 1 TSRMLS_CC);
 +                    strcpy(ep->val.file.filename, sp->value->data.file.filename);
 +                    ep->val.file.op_array = apc_copy_op_array(NULL, sp->value->data.file.op_array, &ctxt TSRMLS_CC);
 +
 +                    for(ep->num_functions=0; sp->value->data.file.functions[ep->num_functions].function != NULL;) { ep->num_functions++; }
-+                    ep->val.file.functions = apc_bd_alloc(sizeof(apc_function_t) * ep->num_functions);
++                    ep->val.file.functions = apc_bd_alloc(sizeof(apc_function_t) * ep->num_functions TSRMLS_CC);
 +                    for(fcount=0; fcount < ep->num_functions; fcount++) {
 +                        memcpy(&ep->val.file.functions[fcount], &sp->value->data.file.functions[fcount], sizeof(apc_function_t));
-+                        ep->val.file.functions[fcount].name = apc_xmemcpy(sp->value->data.file.functions[fcount].name, sp->value->data.file.functions[fcount].name_len+1, apc_bd_alloc);
++                        ep->val.file.functions[fcount].name = apc_xmemcpy(sp->value->data.file.functions[fcount].name, sp->value->data.file.functions[fcount].name_len+1, apc_bd_alloc TSRMLS_CC);
 +                        ep->val.file.functions[fcount].name_len = sp->value->data.file.functions[fcount].name_len;
-+                        ep->val.file.functions[fcount].function = apc_bd_alloc(sizeof(zend_function));
++                        ep->val.file.functions[fcount].function = apc_bd_alloc(sizeof(zend_function) TSRMLS_CC);
 +                        efp = ep->val.file.functions[fcount].function;
 +                        sfp = sp->value->data.file.functions[fcount].function;
 +                        switch(sfp->type) {
@@ -742,12 +782,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +
 +
 +                    for(ep->num_classes=0; sp->value->data.file.classes[ep->num_classes].class_entry != NULL;) { ep->num_classes++; }
-+                    ep->val.file.classes = apc_bd_alloc(sizeof(apc_class_t) * ep->num_classes);
++                    ep->val.file.classes = apc_bd_alloc(sizeof(apc_class_t) * ep->num_classes TSRMLS_CC);
 +                    for(fcount=0; fcount < ep->num_classes; fcount++) {
-+                        ep->val.file.classes[fcount].name = apc_xmemcpy(sp->value->data.file.classes[fcount].name, sp->value->data.file.classes[fcount].name_len+1, apc_bd_alloc);
++                        ep->val.file.classes[fcount].name = apc_xmemcpy(sp->value->data.file.classes[fcount].name, sp->value->data.file.classes[fcount].name_len + 1, apc_bd_alloc TSRMLS_CC);
 +                        ep->val.file.classes[fcount].name_len = sp->value->data.file.classes[fcount].name_len;
-+                        ep->val.file.classes[fcount].class_entry = apc_copy_class_entry(NULL, sp->value->data.file.classes[fcount].class_entry, &ctxt);
-+                        ep->val.file.classes[fcount].parent_name = apc_xstrdup(sp->value->data.file.classes[fcount].parent_name, apc_bd_alloc);
++                        ep->val.file.classes[fcount].class_entry = apc_copy_class_entry(NULL, sp->value->data.file.classes[fcount].class_entry, &ctxt TSRMLS_CC);
++                        ep->val.file.classes[fcount].parent_name = apc_xstrdup(sp->value->data.file.classes[fcount].parent_name, apc_bd_alloc TSRMLS_CC);
 +
 +                        apc_swizzle_ptr(bd, &ll, &ep->val.file.classes[fcount].name);
 +                        apc_swizzle_ptr(bd, &ll, &ep->val.file.classes[fcount].parent_name);
@@ -812,9 +852,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +    t = apc_time();
 +
 +    for(i = 0; i < bd->num_entries; i++) {
-+        ctxt.pool = apc_pool_create(APC_SMALL_POOL, apc_sma_malloc, apc_sma_free, apc_sma_protect, apc_sma_unprotect);
++        ctxt.pool = apc_pool_create(APC_SMALL_POOL, apc_sma_malloc, apc_sma_free, apc_sma_protect, apc_sma_unprotect TSRMLS_CC);
 +        if (!ctxt.pool) { /* TODO need to cleanup previous pools */
-+            apc_wprint("Unable to allocate memory for pool.");
++            apc_warning("Unable to allocate memory for pool." TSRMLS_CC);
 +            goto failure;
 +        }
 +        ep = &bd->entries[i];
@@ -828,7 +868,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +                HANDLE_BLOCK_INTERRUPTIONS();
 +#if NONBLOCKING_LOCK_AVAILABLE
 +                if(APCG(write_lock)) {
-+                    if(!apc_cache_write_lock(apc_cache)) {
++                    if(!apc_cache_write_lock(apc_cache TSRMLS_CC)) {
 +                        HANDLE_UNBLOCK_INTERRUPTIONS();
 +                        return -1;
 +                    }
@@ -839,15 +879,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +                }
 +                apc_bin_fixup_op_array(alloc_op_array);
 +
-+                if(! (alloc_functions = apc_sma_malloc(sizeof(apc_function_t) * (ep->num_functions + 1)))) {
++                if(! (alloc_functions = apc_sma_malloc(sizeof(apc_function_t) * (ep->num_functions + 1) TSRMLS_CC))) {
 +                    goto failure;
 +                }
 +                for(i2=0; i2 < ep->num_functions; i2++) {
-+                    if(! (alloc_functions[i2].name = apc_xmemcpy(ep->val.file.functions[i2].name, ep->val.file.functions[i2].name_len+1, apc_sma_malloc))) {
++                    if(! (alloc_functions[i2].name = apc_xmemcpy(ep->val.file.functions[i2].name, ep->val.file.functions[i2].name_len + 1, apc_sma_malloc TSRMLS_CC))) {
 +                        goto failure;
 +                    }
 +                    alloc_functions[i2].name_len = ep->val.file.functions[i2].name_len;
-+                    if(! (alloc_functions[i2].function = apc_sma_malloc(sizeof(zend_function)))) {
++                    if(! (alloc_functions[i2].function = apc_sma_malloc(sizeof(zend_function) TSRMLS_CC))) {
 +                        goto failure;
 +                    }
 +                    switch(ep->val.file.functions[i2].function->type) {
@@ -873,19 +913,19 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +                alloc_functions[i2].name = NULL;
 +                alloc_functions[i2].function = NULL;
 +
-+                if(! (alloc_classes = apc_sma_malloc(sizeof(apc_class_t) * (ep->num_classes + 1)))) {
++                if(! (alloc_classes = apc_sma_malloc(sizeof(apc_class_t) * (ep->num_classes + 1) TSRMLS_CC))) {
 +                    goto failure;
 +                }
 +                for(i2=0; i2 < ep->num_classes; i2++) {
-+                    if(! (alloc_classes[i2].name = apc_xmemcpy(ep->val.file.classes[i2].name, ep->val.file.classes[i2].name_len+1, apc_sma_malloc))) {
++                    if(! (alloc_classes[i2].name = apc_xmemcpy(ep->val.file.classes[i2].name, ep->val.file.classes[i2].name_len+1, apc_sma_malloc TSRMLS_CC))) {
 +                        goto failure;
 +                    }
 +                    alloc_classes[i2].name_len = ep->val.file.classes[i2].name_len;
-+                    if(! (alloc_classes[i2].class_entry = apc_copy_class_entry(NULL, ep->val.file.classes[i2].class_entry, &ctxt))) {
++                    if(! (alloc_classes[i2].class_entry = apc_copy_class_entry(NULL, ep->val.file.classes[i2].class_entry, &ctxt TSRMLS_CC))) {
 +                        goto failure;
 +                    }
 +                    apc_bin_fixup_class_entry(alloc_classes[i2].class_entry);
-+                    if(! (alloc_classes[i2].parent_name = apc_xstrdup(ep->val.file.classes[i2].parent_name, apc_sma_malloc))) {
++                    if(! (alloc_classes[i2].parent_name = apc_xstrdup(ep->val.file.classes[i2].parent_name, apc_sma_malloc TSRMLS_CC))) {
 +                        if(ep->val.file.classes[i2].parent_name != NULL) {
 +                            goto failure;
 +                        }
@@ -894,7 +934,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +                alloc_classes[i2].name = NULL;
 +                alloc_classes[i2].class_entry = NULL;
 +
-+                if(!(cache_entry = apc_cache_make_file_entry(ep->val.file.filename, alloc_op_array, alloc_functions, alloc_classes, &ctxt))) {
++                if(!(cache_entry = apc_cache_make_file_entry(ep->val.file.filename, alloc_op_array, alloc_functions, alloc_classes, &ctxt TSRMLS_CC))) {
 +                    goto failure;
 +                }
 +
@@ -902,7 +942,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +                    goto failure;
 +                }
 +
-+                if ((ret = apc_cache_insert(apc_cache, cache_key, cache_entry, &ctxt, t)) != 1) {
++                if ((ret = apc_cache_insert(apc_cache, cache_key, cache_entry, &ctxt, t TSRMLS_CC)) != 1) {
 +                    if(ret==-1) {
 +                        goto failure;
 +                    }
@@ -910,7 +950,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +
 +#if NONBLOCKING_LOCK_AVAILABLE
 +                if(APCG(write_lock)) {
-+                    apc_cache_write_unlock(apc_cache);
++                    apc_cache_write_unlock(apc_cache TSRMLS_CC);
 +                }
 +#endif
 +                HANDLE_UNBLOCK_INTERRUPTIONS();
@@ -928,11 +968,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 +    return 0;
 +
 +failure:
-+    apc_pool_destroy(ctxt.pool);
-+    apc_wprint("Unable to allocate memory for apc binary load/dump functionality.");
++    apc_pool_destroy(ctxt.pool TSRMLS_CC);
++    apc_warning("Unable to allocate memory for apc binary load/dump functionality." TSRMLS_CC);
 +#if NONBLOCKING_LOCK_AVAILABLE
 +    if(APCG(write_lock)) {
-+        apc_cache_write_unlock(apc_cache);
++        apc_cache_write_unlock(apc_cache TSRMLS_CC);
 +    }
 +#endif
 +    HANDLE_UNBLOCK_INTERRUPTIONS();
@@ -948,15 +988,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.c php-5.3.1/ext/apc/apc_bin.c
 + * vim600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_bin.h php-5.3.1/ext/apc/apc_bin.h
---- php-5.3.1.orig/ext/apc/apc_bin.h   1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_bin.h        1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_bin.h
 @@ -0,0 +1,63 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2009 The PHP Group                                     |
++  | Copyright (c) 2006-2010 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        |
@@ -971,7 +1010,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.h php-5.3.1/ext/apc/apc_bin.h
 +
 + */
 +
-+/* $Id: apc_bin.h 274613 2009-01-26 06:57:57Z shire $ */
++/* $Id: apc_bin.h 300979 2010-07-04 10:15:05Z kalle $ */
 +
 +#ifndef APC_BINDUMP_H
 +#define APC_BINDUMP_H
@@ -1015,15 +1054,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_bin.h php-5.3.1/ext/apc/apc_bin.h
 + * vim600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
---- php-5.3.1.orig/ext/apc/apc.c       1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc.c    1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,635 @@
+--- /dev/null
++++ b/ext/apc/apc.c
+@@ -0,0 +1,636 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -1050,10 +1088,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +
 + */
 +
-+/* $Id: apc.c 277132 2009-03-14 01:50:57Z shire $ */
++/* $Id: apc.c 305003 2010-10-31 19:45:10Z gopalv $ */
 +
 +#include "apc.h"
 +#include "apc_zend.h"
++#include "apc_cache.h"
 +#include "php.h"
 +
 +#if HAVE_PCRE || HAVE_BUNDLED_PCRE
@@ -1070,33 +1109,33 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +
 +/* {{{ memory allocation wrappers */
 +
-+void* apc_emalloc(size_t n)
++void* apc_emalloc(size_t n TSRMLS_DC)
 +{
 +    void* p = malloc(n);
 +    if (p == NULL) {
-+        apc_eprint("apc_emalloc: malloc failed to allocate %u bytes:", n);
++        apc_error("apc_emalloc: malloc failed to allocate %u bytes:" TSRMLS_CC, n);
 +    }
 +    return p;
 +}
 +
-+void* apc_erealloc(void* p, size_t n)
++void* apc_erealloc(void* p, size_t n TSRMLS_DC)
 +{
 +    p = realloc(p, n);
 +    if (p == NULL) {
-+        apc_eprint("apc_erealloc: realloc failed to allocate %u bytes:", n);
++        apc_error("apc_erealloc: realloc failed to allocate %u bytes:" TSRMLS_CC, n);
 +    }
 +    return p;
 +}
 +
-+void apc_efree(void* p)
++void apc_efree(void* p TSRMLS_DC)
 +{
 +    if (p == NULL) {
-+        apc_eprint("apc_efree: attempt to free null pointer");
++        apc_error("apc_efree: attempt to free null pointer" TSRMLS_CC);
 +    }
 +    free(p);
 +}
 +
-+char* apc_estrdup(const char* s)
++char* apc_estrdup(const char* s TSRMLS_DC)
 +{
 +    int len;
 +    char* dup;
@@ -1107,23 +1146,23 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +    len = strlen(s);
 +    dup = (char*) malloc(len+1);
 +    if (dup == NULL) {
-+        apc_eprint("apc_estrdup: malloc failed to allocate %u bytes:", len+1);
++        apc_error("apc_estrdup: malloc failed to allocate %u bytes:" TSRMLS_CC, len+1);
 +    }
 +    memcpy(dup, s, len);
 +    dup[len] = '\0';
 +    return dup;
 +}
 +
-+void* apc_xstrdup(const char* s, apc_malloc_t f)
++void* apc_xstrdup(const char* s, apc_malloc_t f TSRMLS_DC)
 +{
-+    return s != NULL ? apc_xmemcpy(s, strlen(s)+1, f) : NULL;
++    return s != NULL ? apc_xmemcpy(s, strlen(s)+1, f TSRMLS_CC) : NULL;
 +}
 +
-+void* apc_xmemcpy(const void* p, size_t n, apc_malloc_t f)
++void* apc_xmemcpy(const void* p, size_t n, apc_malloc_t f TSRMLS_DC)
 +{
 +    void* q;
 +
-+    if (p != NULL && (q = f(n)) != NULL) {
++    if (p != NULL && (q = f(n TSRMLS_CC)) != NULL) {
 +        memcpy(q, p, n);
 +        return q;
 +    }
@@ -1133,91 +1172,36 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +/* }}} */
 +
 +/* {{{ console display functions */
++#ifdef ZTS
++# define APC_PRINT_FUNCTION_PARAMETER TSRMLS_C
++#else
++# define APC_PRINT_FUNCTION_PARAMETER format
++#endif
 +
-+static void my_log(int level, const char* fmt, va_list args)
-+{
-+    static const char* level_strings[] = {
-+        "apc-debug",
-+        "apc-notice",
-+        "apc-warning",
-+        "apc-error"
-+    };
-+    static const int num_levels = NELEMS(level_strings);
-+
-+    time_t now;
-+    char* buf;          /* for ctime */
-+
-+      TSRMLS_FETCH();
-+
-+    fflush(stdout);
-+
-+    if (level < 0)
-+        level = 0;
-+    else if (level >= num_levels)
-+        level = num_levels-1;
-+
-+    now = time(0);
-+    buf = ctime(&now);  /* TODO: replace with reentrant impl */
-+    buf[24] = '\0';
-+
-+    fprintf(stderr, "[%s] [%s] ", buf, level_strings[level]);
-+    vfprintf(stderr, fmt, args);
-+
-+    if (fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') {
-+        fprintf(stderr, " %s", strerror(errno));
-+    }
-+
-+    if (zend_is_compiling(TSRMLS_C)) {
-+        fprintf(stderr, " in %s on line %d.", zend_get_compiled_filename(TSRMLS_C), zend_get_compiled_lineno(TSRMLS_C)); 
-+    } else if (zend_is_executing(TSRMLS_C)) {
-+        fprintf(stderr, " in %s on line %d.", zend_get_executed_filename(TSRMLS_C), zend_get_executed_lineno(TSRMLS_C)); 
-+    }
-+    fprintf(stderr, "\n"); 
-+
-+    if (level == APC_ERROR) {
-+        exit(2);
-+    }
-+}
-+
-+void apc_eprint(const char* fmt, ...)
-+{
-+    va_list args;
-+    va_start(args, fmt);
-+    my_log(APC_ERROR, fmt, args);
-+    va_end(args);
-+}
-+
-+void apc_wprint(const char* fmt, ...)
-+{
-+    va_list args;
-+    va_start(args, fmt);
-+    my_log(APC_WARNING, fmt, args);
-+    va_end(args);
-+}
++#define APC_PRINT_FUNCTION(name, verbosity)                                   \
++      void apc_##name(const char *format TSRMLS_DC, ...)                      \
++      {                                                                       \
++              va_list args;                                                   \
++                                                                              \
++              va_start(args, APC_PRINT_FUNCTION_PARAMETER);                   \
++              php_verror(NULL, "", verbosity, format, args TSRMLS_CC);        \
++              va_end(args);                                                   \
++      }
 +
-+void apc_nprint(const char* fmt, ...)
-+{
-+    va_list args;
-+    va_start(args, fmt);
-+    my_log(APC_NOTICE, fmt, args);
-+    va_end(args);
-+}
++APC_PRINT_FUNCTION(error, E_ERROR)
++APC_PRINT_FUNCTION(warning, E_WARNING)
++APC_PRINT_FUNCTION(notice, E_NOTICE)
 +
-+void apc_dprint(const char* fmt, ...)
-+{
-+#ifdef APC_DEBUG
-+    va_list args;
-+    va_start(args, fmt);
-+    my_log(APC_DBG, fmt, args);
-+    va_end(args);
++#ifdef __DEBUG_APC__
++APC_PRINT_FUNCTION(debug, E_NOTICE)
++#else
++void apc_debug(const char *format TSRMLS_DC, ...) {}
 +#endif
-+}
-+
 +/* }}} */
 +
 +/* {{{ string and text manipulation */
 +
-+char* apc_append(const char* s, const char* t)
++char* apc_append(const char* s, const char* t TSRMLS_DC)
 +{
 +    int slen;
 +    int tlen;
@@ -1226,14 +1210,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +    slen = strlen(s);
 +    tlen = strlen(t);
 +
-+    p = (char*) apc_emalloc((slen + tlen + 1) * sizeof(char));
++    p = (char*) apc_emalloc((slen + tlen + 1) * sizeof(char) TSRMLS_CC);
 +    memcpy(p, s, slen);
 +    memcpy(p + slen, t, tlen + 1);
 +
 +    return p;
 +}
 +
-+char* apc_substr(const char* s, int start, int length)
++char* apc_substr(const char* s, int start, int length TSRMLS_DC)
 +{
 +    char* substr;
 +    int src_len = strlen(s);
@@ -1252,12 +1236,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +    }
 +
 +    /* create the substring */
-+    substr = apc_xmemcpy(s + start, length + 1, apc_emalloc);
++    substr = apc_xmemcpy(s + start, length + 1, apc_emalloc TSRMLS_CC);
 +    substr[length] = '\0';
 +    return substr;
 +}
 +
-+char** apc_tokenize(const char* s, char delim)
++char** apc_tokenize(const char* s, char delim TSRMLS_DC)
 +{
 +    char** tokens;      /* array of tokens, NULL terminated */
 +    int size;           /* size of tokens array */
@@ -1275,7 +1259,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +    cur  = 0;
 +    end  = strlen(s) - 1;
 +
-+    tokens = (char**) apc_emalloc(size * sizeof(char*));
++    tokens = (char**) apc_emalloc(size * sizeof(char*) TSRMLS_CC);
 +    tokens[n] = NULL;
 +
 +    while (cur <= end) {
@@ -1286,11 +1270,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +        /* resize token array if necessary */
 +        if (n == size-1) {
 +            size *= 2;
-+            tokens = (char**) apc_erealloc(tokens, size * sizeof(char*));
++            tokens = (char**) apc_erealloc(tokens, size * sizeof(char*) TSRMLS_CC);
 +        }
 +
 +        /* save the current token */
-+        tokens[n] = apc_substr(s, cur, next-cur);
++        tokens[n] = apc_substr(s, cur, next-cur TSRMLS_CC);
 +
 +        tokens[++n] = NULL;
 +        cur = next + 1;
@@ -1301,13 +1285,64 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +
 +/* }}} */
 +
-+/* {{{ apc stat */
++
++/* {{{ apc_win32_restat */
++#ifdef PHP_WIN32
++static int apc_restat(apc_fileinfo_t *fileinfo TSRMLS_DC)
++{
++    HANDLE hFile;
++    BY_HANDLE_FILE_INFORMATION hInfo;
++
++    hFile = CreateFile(fileinfo->fullpath, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_FLAG_BACKUP_SEMANTICS, NULL);
++
++    if (!hFile) {
++        apc_debug("Cannot create a file HANDLE for %s\n" TSRMLS_CC, fileinfo->fullpath);
++        return -1;
++    }
++
++    if (!GetFileInformationByHandle(hFile, &hInfo)) {
++        apc_debug("Cannot get file information from handle\n" TSRMLS_CC);
++        CloseHandle(hFile);
++        return -1;
++    }
++
++    CloseHandle(hFile);
++
++    fileinfo->st_buf.sb.st_dev = hInfo.dwVolumeSerialNumber;
++    fileinfo->st_buf.sb.st_ino = (((apc_ino_t)(hInfo.nFileIndexHigh) << 32) | (apc_ino_t) hInfo.nFileIndexLow);
++
++    return 0;
++}
++#else
++static int apc_restat(apc_fileinfo_t *fileinfo TSRMLS_DC)
++{
++      return 0;
++}
++#endif
++/* }}} */
++
++/* {{{ apc_search_paths */
 +/* similar to php_stream_stat_path */
 +#define APC_URL_STAT(wrapper, filename, pstatbuf) \
 +    ((wrapper)->wops->url_stat((wrapper), (filename), PHP_STREAM_URL_STAT_QUIET, (pstatbuf), NULL TSRMLS_CC))
-+int apc_search_paths(const char* filename, const char* path, apc_fileinfo_t* fileinfo)
++
++/* copy out to path_buf if path_for_open isn't the same as filename */
++#define COPY_IF_CHANGED(p) \
++    (char*) (((p) == filename) ? filename : \
++            (strlcpy((char*)fileinfo->path_buf, (p), sizeof(fileinfo->path_buf))) \
++                    ? (fileinfo->path_buf) : NULL)
++
++/* len checks can be skipped here because filename is NUL terminated */
++#define IS_RELATIVE_PATH(filename, len) \
++        ((filename) && (filename[0] == '.' && \
++            (IS_SLASH(filename[1]) || \
++                (filename[1] == '.' && \
++                    IS_SLASH(filename[2])))))
++    
++
++int apc_search_paths(const char* filename, const char* path, apc_fileinfo_t* fileinfo TSRMLS_DC)
 +{
-+    char** paths;
++    char** paths = NULL;
 +    char *exec_fname;
 +    int exec_fname_length;
 +    int found = 0;
@@ -1315,8 +1350,6 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +    php_stream_wrapper *wrapper = NULL;
 +    char *path_for_open = NULL;
 +
-+    TSRMLS_FETCH();
-+
 +    assert(filename && fileinfo);
 +
 +
@@ -1328,28 +1361,31 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +
 +    if(wrapper != &php_plain_files_wrapper) {
 +        if(APC_URL_STAT(wrapper, path_for_open, &fileinfo->st_buf) == 0) {
-+            strncpy(fileinfo->fullpath, path_for_open, MAXPATHLEN);
-+            return 0;
++            fileinfo->fullpath = COPY_IF_CHANGED(path_for_open);
++            return apc_restat(fileinfo TSRMLS_CC);
 +        }
 +        return -1; /* cannot stat */
 +    }
 +
 +    if (IS_ABSOLUTE_PATH(path_for_open, strlen(path_for_open)) && 
 +            APC_URL_STAT(wrapper, path_for_open, &fileinfo->st_buf) == 0) {
-+        strncpy(fileinfo->fullpath, path_for_open, MAXPATHLEN);
-+        return 0;
++        fileinfo->fullpath = COPY_IF_CHANGED(path_for_open);
++        return apc_restat(fileinfo TSRMLS_CC);
 +    }
 +
-+    paths = apc_tokenize(path, DEFAULT_DIR_SEPARATOR);
-+    if (!paths)
-+        return -1;
++    if (!IS_RELATIVE_PATH(path_for_open, strlen(path_for_open))) {
++        paths = apc_tokenize(path, DEFAULT_DIR_SEPARATOR TSRMLS_CC);
++        if (!paths)
++            return -1;
 +
-+    /* for each directory in paths, look for filename inside */
-+    for (i = 0; paths[i]; i++) {
-+        snprintf(fileinfo->fullpath, sizeof(fileinfo->fullpath), "%s%c%s", paths[i], DEFAULT_SLASH, path_for_open);
-+        if (APC_URL_STAT(wrapper, fileinfo->fullpath, &fileinfo->st_buf) == 0) {
-+            found = 1;
-+            break;
++        /* for each directory in paths, look for filename inside */
++        for (i = 0; paths[i]; i++) {
++            snprintf(fileinfo->path_buf, sizeof(fileinfo->path_buf), "%s%c%s", paths[i], DEFAULT_SLASH, path_for_open);
++            if (APC_URL_STAT(wrapper, fileinfo->path_buf, &fileinfo->st_buf) == 0) {
++                fileinfo->fullpath = (char*) fileinfo->path_buf;
++                found = 1;
++                break;
++            }
 +        }
 +    }
 +
@@ -1361,23 +1397,26 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +        while((--exec_fname_length >= 0) && !IS_SLASH(exec_fname[exec_fname_length]));
 +        if((exec_fname && exec_fname[0] != '[') && exec_fname_length > 0) {
 +            /* not: [no active file] or no path */
-+            memcpy(fileinfo->fullpath, exec_fname, exec_fname_length);
-+            fileinfo->fullpath[exec_fname_length] = DEFAULT_SLASH;
-+            strlcpy(fileinfo->fullpath +exec_fname_length +1, path_for_open,sizeof(fileinfo->fullpath)-exec_fname_length-1);
-+            /* apc_wprint("filename: %s, exec_fname: %s, fileinfo->fullpath: %s", path_for_open, exec_fname, fileinfo->fullpath); */
-+            if (APC_URL_STAT(wrapper, fileinfo->fullpath, &fileinfo->st_buf) == 0) {
++            memcpy(fileinfo->path_buf, exec_fname, exec_fname_length);
++            fileinfo->path_buf[exec_fname_length] = DEFAULT_SLASH;
++            strlcpy(fileinfo->path_buf +exec_fname_length +1, path_for_open,sizeof(fileinfo->path_buf)-exec_fname_length-1);
++            /* apc_warning("filename: %s, exec_fname: %s, fileinfo->path_buf: %s" TSRMLS_CC, path_for_open, exec_fname, fileinfo->path_buf); */
++            if (APC_URL_STAT(wrapper, fileinfo->path_buf, &fileinfo->st_buf) == 0) {
++                fileinfo->fullpath = (char*) fileinfo->path_buf;
 +                found = 1;
 +            }
 +        }
 +    }
 +
-+    /* free the value returned by apc_tokenize */
-+    for (i = 0; paths[i]; i++) {
-+        apc_efree(paths[i]);
++    if(paths) {
++        /* free the value returned by apc_tokenize */
++        for (i = 0; paths[i]; i++) {
++            apc_efree(paths[i] TSRMLS_CC);
++        }
++        apc_efree(paths TSRMLS_CC);
 +    }
-+    apc_efree(paths);
 +
-+    return found ? 0 : -1;
++    return found ? apc_restat(fileinfo TSRMLS_CC) : -1;
 +}
 +
 +/* }}} */
@@ -1406,7 +1445,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +#define APC_COMPILE_PATTERN(re, match) do {\
 +    if(match.len > 2) { /* more than just "//" */\
 +        if (((re) = pcre_get_compiled_regex(match.c, NULL, NULL TSRMLS_CC)) == NULL) {\
-+            apc_wprint("apc_regex_compile_array: invalid expression '%s'", match.c); \
++            apc_warning("apc_regex_compile_array: invalid expression '%s'" TSRMLS_CC, match.c); \
 +            smart_str_free(&match);\
 +            return NULL;\
 +        }\
@@ -1426,7 +1465,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +    if (!patterns)
 +        return NULL;
 +
-+    regs = (apc_regex*) apc_emalloc(sizeof(apc_regex));
++    regs = (apc_regex*) apc_emalloc(sizeof(apc_regex) TSRMLS_CC);
 +
 +    smart_str_appendc(&pmatch, '/');
 +    smart_str_appendc(&nmatch, '/');
@@ -1456,11 +1495,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +    return (void*) regs;
 +}
 +
-+void apc_regex_destroy_array(void* p)
++void apc_regex_destroy_array(void* p TSRMLS_DC)
 +{
 +    if (p != NULL) {
 +        apc_regex* regs = (apc_regex*) p;
-+        apc_efree(regs);
++        apc_efree(regs TSRMLS_CC);
 +    }
 +}
 +
@@ -1489,7 +1528,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +void* apc_regex_compile_array(char* patterns[] TSRMLS_DC)
 +{
 +    if(patterns && patterns[0] != NULL) {
-+        apc_wprint("pcre missing, disabling filters");
++        apc_warning("pcre missing, disabling filters" TSRMLS_CC);
 +    }
 +    return NULL;
 +}
@@ -1639,7 +1678,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 +        Z_ADDREF_P(data);
 +        zend_hash_move_forward_ex(hash, &pos);
 +    }
-+    efree(data);
++    zval_ptr_dtor(&data);
 +
 +    return new_hash;
 +}
@@ -1654,15 +1693,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.c php-5.3.1/ext/apc/apc.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
---- php-5.3.1.orig/ext/apc/apc_cache.c 1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_cache.c      1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,1183 @@
+--- /dev/null
++++ b/ext/apc/apc_cache.c
+@@ -0,0 +1,1295 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -1688,11 +1726,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +
 + */
 +
-+/* $Id: apc_cache.c 286717 2009-08-03 05:25:32Z gopalv $ */
++/* $Id: apc_cache.c 305771 2010-11-26 12:57:16Z gopalv $ */
 +
 +#include "apc_cache.h"
++#include "apc_zend.h"
 +#include "apc_sma.h"
-+#include "apc_main.h"
 +#include "apc_globals.h"
 +#include "SAPI.h"
 +
@@ -1704,12 +1742,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +#define key_equals(a, b) (a.inode==b.inode && a.device==b.device)
 +/* }}} */
 +
-+static void apc_cache_expunge(apc_cache_t* cache, size_t size);
++static void apc_cache_expunge(apc_cache_t* cache, size_t size TSRMLS_DC);
 +
 +/* {{{ hash */
 +static unsigned int hash(apc_cache_key_t key)
 +{
-+    return key.data.file.device + key.data.file.inode;
++    return (unsigned int)(key.data.file.device + key.data.file.inode);
 +}
 +/* }}} */
 +
@@ -1717,21 +1755,60 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +#define string_nhash_8(s,len) (unsigned int)(zend_inline_hash_func(s, len))
 +/* }}} */
 +
++/* {{{ make_prime */
++static int const primes[] = {
++  257, /*   256 */
++  521, /*   512 */
++ 1031, /*  1024 */
++ 2053, /*  2048 */
++ 3079, /*  3072 */
++ 4099, /*  4096 */
++ 5147, /*  5120 */
++ 6151, /*  6144 */
++ 7177, /*  7168 */
++ 8209, /*  8192 */
++ 9221, /*  9216 */
++10243, /* 10240 */
++#if 0
++11273, /* 11264 */
++12289, /* 12288 */
++13313, /* 13312 */
++14341, /* 14336 */
++15361, /* 15360 */
++16411, /* 16384 */
++17417, /* 17408 */
++18433, /* 18432 */
++19457, /* 19456 */
++#endif
++0      /* sentinel */
++};
++
++static int make_prime(int n)
++{
++    int *k = (int*)primes; 
++    while(*k) {
++        if((*k) > n) return *k;
++        k++;
++    }
++    return *(k-1);
++}
++/* }}} */
++
 +/* {{{ make_slot */
-+slot_t* make_slot(apc_cache_key_t key, apc_cache_entry_t* value, slot_t* next, time_t t)
++slot_t* make_slot(apc_cache_key_t key, apc_cache_entry_t* value, slot_t* next, time_t t TSRMLS_DC)
 +{
 +    slot_t* p = apc_pool_alloc(value->pool, sizeof(slot_t));
 +
 +    if (!p) return NULL;
 +
 +    if(value->type == APC_CACHE_ENTRY_USER) {
-+        char *identifier = (char*) apc_pstrdup(key.data.user.identifier, value->pool);
++        char *identifier = (char*) apc_pmemcpy(key.data.user.identifier, key.data.user.identifier_len, value->pool TSRMLS_CC);
 +        if (!identifier) {
 +            return NULL;
 +        }
 +        key.data.user.identifier = identifier;
 +    } else if(key.type == APC_CACHE_KEY_FPFILE) {
-+        char *fullpath = (char*) apc_pstrdup(key.data.fpfile.fullpath, value->pool);
++        char *fullpath = (char*) apc_pstrdup(key.data.fpfile.fullpath, value->pool TSRMLS_CC);
 +        if (!fullpath) {
 +            return NULL;
 +        }
@@ -1749,14 +1826,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ free_slot */
-+static void free_slot(slot_t* slot)
++static void free_slot(slot_t* slot TSRMLS_DC)
 +{
-+    apc_pool_destroy(slot->value->pool);
++    apc_pool_destroy(slot->value->pool TSRMLS_CC);
 +}
 +/* }}} */
 +
 +/* {{{ remove_slot */
-+static void remove_slot(apc_cache_t* cache, slot_t** slot)
++static void remove_slot(apc_cache_t* cache, slot_t** slot TSRMLS_DC)
 +{
 +    slot_t* dead = *slot;
 +    *slot = (*slot)->next;
@@ -1764,7 +1841,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +    cache->header->mem_size -= dead->value->mem_size;
 +    cache->header->num_entries--;
 +    if (dead->value->ref_count <= 0) {
-+        free_slot(dead);
++        free_slot(dead TSRMLS_CC);
 +    }
 +    else {
 +        dead->next = cache->header->deleted_list;
@@ -1775,7 +1852,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ process_pending_removals */
-+static void process_pending_removals(apc_cache_t* cache)
++static void process_pending_removals(apc_cache_t* cache TSRMLS_DC)
 +{
 +    slot_t** slot;
 +    time_t now;
@@ -1801,16 +1878,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +            if (dead->value->ref_count > 0) {
 +                switch(dead->value->type) {
 +                    case APC_CACHE_ENTRY_FILE:
-+                        apc_wprint("GC cache entry '%s' (dev=%d ino=%d) was on gc-list for %d seconds"
++                        apc_warning("GC cache entry '%s' (dev=%d ino=%d) was on gc-list for %d seconds" TSRMLS_CC
 +                            dead->value->data.file.filename, dead->key.data.file.device, dead->key.data.file.inode, gc_sec);
 +                        break;
 +                    case APC_CACHE_ENTRY_USER:
-+                        apc_wprint("GC cache entry '%s'was on gc-list for %d seconds", dead->value->data.user.info, gc_sec);
++                        apc_warning("GC cache entry '%s'was on gc-list for %d seconds" TSRMLS_CC, dead->value->data.user.info, gc_sec);
 +                        break;
 +                }
 +            }
 +            *slot = dead->next;
-+            free_slot(dead);
++            free_slot(dead TSRMLS_CC);
 +        }
 +        else {
 +            slot = &(*slot)->next;
@@ -1848,21 +1925,20 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_create */
-+apc_cache_t* apc_cache_create(int size_hint, int gc_ttl, int ttl)
++apc_cache_t* apc_cache_create(int size_hint, int gc_ttl, int ttl TSRMLS_DC)
 +{
 +    apc_cache_t* cache;
 +    int cache_size;
 +    int num_slots;
-+    int i;
 +
-+    num_slots = size_hint > 0 ? size_hint*2 : 2000;
++    num_slots = make_prime(size_hint > 0 ? size_hint : 2000);
 +
-+    cache = (apc_cache_t*) apc_emalloc(sizeof(apc_cache_t));
++    cache = (apc_cache_t*) apc_emalloc(sizeof(apc_cache_t) TSRMLS_CC);
 +    cache_size = sizeof(cache_header_t) + num_slots*sizeof(slot_t*);
 +
-+    cache->shmaddr = apc_sma_malloc(cache_size);
++    cache->shmaddr = apc_sma_malloc(cache_size TSRMLS_CC);
 +    if(!cache->shmaddr) {
-+        apc_eprint("Unable to allocate shared memory for cache structures.  (Perhaps your shared memory size isn't large enough?). ");
++        apc_error("Unable to allocate shared memory for cache structures.  (Perhaps your shared memory size isn't large enough?). " TSRMLS_CC);
 +    }
 +    memset(cache->shmaddr, 0, cache_size);
 +
@@ -1882,9 +1958,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +#if NONBLOCKING_LOCK_AVAILABLE
 +    CREATE_LOCK(cache->header->wrlock);
 +#endif
-+    for (i = 0; i < num_slots; i++) {
-+        cache->slots[i] = NULL;
-+    }
++    memset(cache->slots, 0, sizeof(slot_t*)*num_slots);
 +    cache->expunge_cb = apc_cache_expunge;
 +    cache->has_lock = 0;
 +
@@ -1893,18 +1967,18 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_destroy */
-+void apc_cache_destroy(apc_cache_t* cache)
++void apc_cache_destroy(apc_cache_t* cache TSRMLS_DC)
 +{
 +    DESTROY_LOCK(cache->header->lock);
 +#ifdef NONBLOCKING_LOCK_AVAILABLE
 +    DESTROY_LOCK(cache->header->wrlock);
 +#endif
-+    apc_efree(cache);
++    apc_efree(cache TSRMLS_CC);
 +}
 +/* }}} */
 +
 +/* {{{ apc_cache_clear */
-+void apc_cache_clear(apc_cache_t* cache)
++void apc_cache_clear(apc_cache_t* cache TSRMLS_DC)
 +{
 +    int i;
 +
@@ -1920,7 +1994,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +    for (i = 0; i < cache->num_slots; i++) {
 +        slot_t* p = cache->slots[i];
 +        while (p) {
-+            remove_slot(cache, &p);
++            remove_slot(cache, &p TSRMLS_CC);
 +        }
 +        cache->slots[i] = NULL;
 +    }
@@ -1933,11 +2007,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_expunge */
-+static void apc_cache_expunge(apc_cache_t* cache, size_t size)
++static void apc_cache_expunge(apc_cache_t* cache, size_t size TSRMLS_DC)
 +{
 +    int i;
 +    time_t t;
-+    TSRMLS_FETCH();
 +
 +    t = apc_time();
 +
@@ -1949,20 +2022,26 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +         * we run out of space.
 +         */
 +        CACHE_SAFE_LOCK(cache);
++        if (apc_sma_get_avail_mem() > (size_t)(APCG(shm_size)/2)) {
++            /* probably a queued up expunge, we don't need to do this */
++            CACHE_SAFE_UNLOCK(cache);
++            return;
++        }
 +        cache->header->busy = 1;
 +        cache->header->expunges++;
++clear_all:
 +        for (i = 0; i < cache->num_slots; i++) {
 +            slot_t* p = cache->slots[i];
 +            while (p) {
-+                remove_slot(cache, &p);
++                remove_slot(cache, &p TSRMLS_CC);
 +            }
 +            cache->slots[i] = NULL;
 +        }
++        memset(&cache->header->lastkey, 0, sizeof(apc_keyid_t));
 +        cache->header->busy = 0;
 +        CACHE_SAFE_UNLOCK(cache);
 +    } else {
 +        slot_t **p;
-+
 +        /*
 +         * If the ttl for the cache is set we walk through and delete stale 
 +         * entries.  For the user cache that is slightly confusing since
@@ -1973,6 +2052,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +         */
 +
 +        CACHE_SAFE_LOCK(cache);
++        if (apc_sma_get_avail_mem() > (size_t)(APCG(shm_size)/2)) {
++            /* probably a queued up expunge, we don't need to do this */
++            CACHE_SAFE_UNLOCK(cache);
++            return;
++        }
 +        cache->header->busy = 1;
 +        cache->header->expunges++;
 +        for (i = 0; i < cache->num_slots; i++) {
@@ -1985,22 +2069,28 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +                if((*p)->value->type == APC_CACHE_ENTRY_USER) {
 +                    if((*p)->value->data.user.ttl) {
 +                        if((time_t) ((*p)->creation_time + (*p)->value->data.user.ttl) < t) {
-+                            remove_slot(cache, p);
++                            remove_slot(cache, p TSRMLS_CC);
 +                            continue;
 +                        }
 +                    } else if(cache->ttl) {
 +                        if((*p)->creation_time + cache->ttl < t) {
-+                            remove_slot(cache, p);
++                            remove_slot(cache, p TSRMLS_CC);
 +                            continue;
 +                        }
 +                    }
 +                } else if((*p)->access_time < (t - cache->ttl)) {
-+                    remove_slot(cache, p);
++                    remove_slot(cache, p TSRMLS_CC);
 +                    continue;
 +                }
 +                p = &(*p)->next;
 +            }
 +        }
++
++        if (!apc_sma_get_avail_size(size)) {
++            /* TODO: re-do this to remove goto across locked sections */
++            goto clear_all;
++        }
++        memset(&cache->header->lastkey, 0, sizeof(apc_keyid_t));
 +        cache->header->busy = 0;
 +        CACHE_SAFE_UNLOCK(cache);
 +    }
@@ -2012,7 +2102,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +                     apc_cache_key_t key,
 +                     apc_cache_entry_t* value,
 +                     apc_context_t* ctxt,
-+                     time_t t)
++                     time_t t
++                     TSRMLS_DC)
 +{
 +    slot_t** slot;
 +
@@ -2020,11 +2111,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +        return 0;
 +    }
 +
-+#ifdef __DEBUG_APC__
-+    fprintf(stderr,"Inserting [%s]\n", value->data.file.filename);
-+#endif
++    apc_debug("Inserting [%s]\n" TSRMLS_CC, value->data.file.filename);
 +
-+    process_pending_removals(cache);
++    process_pending_removals(cache TSRMLS_CC);
 +
 +    if(key.type == APC_CACHE_KEY_FILE) slot = &cache->slots[hash(key) % cache->num_slots];
 +    else slot = &cache->slots[string_nhash_8(key.data.fpfile.fullpath, key.data.fpfile.fullpath_len) % cache->num_slots];
@@ -2035,21 +2124,21 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +            if(key_equals((*slot)->key.data.file, key.data.file)) {
 +                /* If existing slot for the same device+inode is different, remove it and insert the new version */
 +                if (ctxt->force_update || (*slot)->key.mtime != key.mtime) {
-+                    remove_slot(cache, slot);
++                    remove_slot(cache, slot TSRMLS_CC);
 +                    break;
 +                }
 +                return 0;
 +            } else if(cache->ttl && (*slot)->access_time < (t - cache->ttl)) {
-+                remove_slot(cache, slot);
++                remove_slot(cache, slot TSRMLS_CC);
 +                continue;
 +            }
 +        } else {   /* APC_CACHE_KEY_FPFILE */
 +            if(!memcmp((*slot)->key.data.fpfile.fullpath, key.data.fpfile.fullpath, key.data.fpfile.fullpath_len+1)) {
 +                /* Hrm.. it's already here, remove it and insert new one */
-+                remove_slot(cache, slot);
++                remove_slot(cache, slot TSRMLS_CC);
 +                break;
 +            } else if(cache->ttl && (*slot)->access_time < (t - cache->ttl)) {
-+                remove_slot(cache, slot);
++                remove_slot(cache, slot TSRMLS_CC);
 +                continue;
 +            }
 +        }
@@ -2057,7 +2146,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +      slot = &(*slot)->next;
 +    }
 +
-+    if ((*slot = make_slot(key, value, *slot, t)) == NULL) {
++    if ((*slot = make_slot(key, value, *slot, t TSRMLS_CC)) == NULL) {
 +        return -1;
 +    }
 +
@@ -2071,18 +2160,18 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_insert */
-+int apc_cache_insert(apc_cache_t* cache, apc_cache_key_t key, apc_cache_entry_t* value, apc_context_t *ctxt, time_t t)
++int apc_cache_insert(apc_cache_t* cache, apc_cache_key_t key, apc_cache_entry_t* value, apc_context_t *ctxt, time_t t TSRMLS_DC)
 +{
 +    int rval;
 +    CACHE_LOCK(cache);
-+    rval = _apc_cache_insert(cache, key, value, ctxt, t);
++    rval = _apc_cache_insert(cache, key, value, ctxt, t TSRMLS_CC);
 +    CACHE_UNLOCK(cache);
 +    return rval;
 +}
 +/* }}} */
 +
 +/* {{{ apc_cache_insert */
-+int *apc_cache_insert_mult(apc_cache_t* cache, apc_cache_key_t* keys, apc_cache_entry_t** values, apc_context_t *ctxt, time_t t, int num_entries)
++int *apc_cache_insert_mult(apc_cache_t* cache, apc_cache_key_t* keys, apc_cache_entry_t** values, apc_context_t *ctxt, time_t t, int num_entries TSRMLS_DC)
 +{
 +    int *rval;
 +    int i;
@@ -2092,7 +2181,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +    for (i=0; i < num_entries; i++) {
 +        if (values[i]) {
 +            ctxt->pool = values[i]->pool;
-+            rval[i] = _apc_cache_insert(cache, keys[i], values[i], ctxt, t);
++            rval[i] = _apc_cache_insert(cache, keys[i], values[i], ctxt, t TSRMLS_CC);
 +        }
 +    }
 +    CACHE_UNLOCK(cache);
@@ -2105,7 +2194,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +int apc_cache_user_insert(apc_cache_t* cache, apc_cache_key_t key, apc_cache_entry_t* value, apc_context_t* ctxt, time_t t, int exclusive TSRMLS_DC)
 +{
 +    slot_t** slot;
-+    unsigned int keylen = key.data.user.identifier_len+1;
++    unsigned int keylen = key.data.user.identifier_len;
 +    unsigned int h = string_nhash_8(key.data.user.identifier, keylen);
 +    apc_keyid_t *lastkey = &cache->header->lastkey;
 +    
@@ -2118,8 +2207,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +        return 0;
 +    }
 +
-+    if(apc_cache_is_last_key(cache, &key, t)) {
++    if(apc_cache_is_last_key(cache, &key, h, t TSRMLS_CC)) {
 +        /* potential cache slam */
++        printf("Last key warning for it!");
 +        return 0;
 +    }
 +
@@ -2130,17 +2220,23 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +    lastkey->h = h;
 +    lastkey->keylen = keylen;
 +    lastkey->mtime = t;
++#ifdef ZTS
++    lastkey->tid = tsrm_thread_id();
++#else
++    lastkey->pid = getpid();
++#endif
 +    
 +    /* we do not reset lastkey after the insert. Whether it is inserted 
 +     * or not, another insert in the same second is always a bad idea. 
 +     */
 +
-+    process_pending_removals(cache);
++    process_pending_removals(cache TSRMLS_CC);
 +    
 +    slot = &cache->slots[h % cache->num_slots];
 +
 +    while (*slot) {
-+        if (!memcmp((*slot)->key.data.user.identifier, key.data.user.identifier, keylen)) {
++        if (((*slot)->key.data.user.identifier_len == key.data.user.identifier_len) &&
++            (!memcmp((*slot)->key.data.user.identifier, key.data.user.identifier, keylen))) {
 +            /* 
 +             * At this point we have found the user cache entry.  If we are doing 
 +             * an exclusive insert (apc_add) we are going to bail right away if
@@ -2152,7 +2248,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +                            ) ) {
 +                goto fail;
 +            }
-+            remove_slot(cache, slot);
++            remove_slot(cache, slot TSRMLS_CC);
 +            break;
 +        } else 
 +        /* 
@@ -2164,13 +2260,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +         */
 +        if((cache->ttl && (*slot)->access_time < (t - cache->ttl)) || 
 +           ((*slot)->value->data.user.ttl && (time_t) ((*slot)->creation_time + (*slot)->value->data.user.ttl) < t)) {
-+            remove_slot(cache, slot);
++            remove_slot(cache, slot TSRMLS_CC);
 +            continue;
 +        }
 +        slot = &(*slot)->next;
 +    }
 +
-+    if ((*slot = make_slot(key, value, *slot, t)) == NULL) {
++    if ((*slot = make_slot(key, value, *slot, t TSRMLS_CC)) == NULL) {
 +        goto fail;
 +    } 
 +    
@@ -2192,7 +2288,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_find_slot */
-+slot_t* apc_cache_find_slot(apc_cache_t* cache, apc_cache_key_t key, time_t t)
++slot_t* apc_cache_find_slot(apc_cache_t* cache, apc_cache_key_t key, time_t t TSRMLS_DC)
 +{
 +    slot_t** slot;
 +    volatile slot_t* retval = NULL;
@@ -2206,7 +2302,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +        if(key.type == APC_CACHE_KEY_FILE) {
 +            if(key_equals((*slot)->key.data.file, key.data.file)) {
 +                if((*slot)->key.mtime != key.mtime) {
-+                    remove_slot(cache, slot);
++                    remove_slot(cache, slot TSRMLS_CC);
 +                    cache->header->num_misses++;
 +                    CACHE_UNLOCK(cache);
 +                    return NULL;
@@ -2243,15 +2339,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_find */
-+apc_cache_entry_t* apc_cache_find(apc_cache_t* cache, apc_cache_key_t key, time_t t)
++apc_cache_entry_t* apc_cache_find(apc_cache_t* cache, apc_cache_key_t key, time_t t TSRMLS_DC)
 +{
-+    slot_t * slot = apc_cache_find_slot(cache, key, t);
++    slot_t * slot = apc_cache_find_slot(cache, key, t TSRMLS_CC);
 +    return (slot) ? slot->value : NULL;
 +}
 +/* }}} */
 +
 +/* {{{ apc_cache_user_find */
-+apc_cache_entry_t* apc_cache_user_find(apc_cache_t* cache, char *strkey, int keylen, time_t t)
++apc_cache_entry_t* apc_cache_user_find(apc_cache_t* cache, char *strkey, int keylen, time_t t TSRMLS_DC)
 +{
 +    slot_t** slot;
 +    volatile apc_cache_entry_t* value = NULL;
@@ -2270,7 +2366,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +        if (!memcmp((*slot)->key.data.user.identifier, strkey, keylen)) {
 +            /* Check to make sure this entry isn't expired by a hard TTL */
 +            if((*slot)->value->data.user.ttl && (time_t) ((*slot)->creation_time + (*slot)->value->data.user.ttl) < t) {
-+                remove_slot(cache, slot);
++                remove_slot(cache, slot TSRMLS_CC);
 +                cache->header->num_misses++;
 +                CACHE_UNLOCK(cache);
 +                return NULL;
@@ -2294,6 +2390,41 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +}
 +/* }}} */
 +
++/* {{{ apc_cache_user_exists */
++apc_cache_entry_t* apc_cache_user_exists(apc_cache_t* cache, char *strkey, int keylen, time_t t TSRMLS_DC)
++{
++    slot_t** slot;
++    volatile apc_cache_entry_t* value = NULL;
++
++    if(apc_cache_busy(cache))
++    {
++        /* cache cleanup in progress */ 
++        return NULL;
++    }
++
++    CACHE_LOCK(cache);
++
++    slot = &cache->slots[string_nhash_8(strkey, keylen) % cache->num_slots];
++
++    while (*slot) {
++        if (!memcmp((*slot)->key.data.user.identifier, strkey, keylen)) {
++            /* Check to make sure this entry isn't expired by a hard TTL */
++            if((*slot)->value->data.user.ttl && (time_t) ((*slot)->creation_time + (*slot)->value->data.user.ttl) < t) {
++                CACHE_UNLOCK(cache);
++                return NULL;
++            }
++            /* Return the cache entry ptr */
++            value = (*slot)->value;
++            CACHE_UNLOCK(cache);
++            return (apc_cache_entry_t*)value;
++        }
++        slot = &(*slot)->next;
++    }
++    CACHE_UNLOCK(cache);
++    return NULL;
++}
++/* }}} */
++
 +/* {{{ apc_cache_user_update */
 +int _apc_cache_user_update(apc_cache_t* cache, char *strkey, int keylen, apc_cache_updater_t updater, void* data TSRMLS_DC)
 +{
@@ -2325,7 +2456,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_user_delete */
-+int apc_cache_user_delete(apc_cache_t* cache, char *strkey, int keylen)
++int apc_cache_user_delete(apc_cache_t* cache, char *strkey, int keylen TSRMLS_DC)
 +{
 +    slot_t** slot;
 +
@@ -2335,7 +2466,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +
 +    while (*slot) {
 +        if (!memcmp((*slot)->key.data.user.identifier, strkey, keylen)) {
-+            remove_slot(cache, slot);
++            remove_slot(cache, slot TSRMLS_CC);
 +            CACHE_UNLOCK(cache);
 +            return 1;
 +        }
@@ -2348,19 +2479,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_delete */
-+int apc_cache_delete(apc_cache_t* cache, char *filename, int filename_len)
++int apc_cache_delete(apc_cache_t* cache, char *filename, int filename_len TSRMLS_DC)
 +{
 +    slot_t** slot;
 +    time_t t;
 +    apc_cache_key_t key;
 +
-+    TSRMLS_FETCH();
-+
 +    t = apc_time();
 +
 +    /* try to create a cache key; if we fail, give up on caching */
 +    if (!apc_cache_make_file_key(&key, filename, PG(include_path), t TSRMLS_CC)) {
-+        apc_wprint("Could not stat file %s, unable to delete from cache.", filename);
++        apc_warning("Could not stat file %s, unable to delete from cache." TSRMLS_CC, filename);
 +        return -1;
 +    }
 +
@@ -2373,13 +2502,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +      if(key.type == (*slot)->key.type) {
 +        if(key.type == APC_CACHE_KEY_FILE) {
 +            if(key_equals((*slot)->key.data.file, key.data.file)) {
-+                remove_slot(cache, slot);
++                remove_slot(cache, slot TSRMLS_CC);
 +                CACHE_UNLOCK(cache);
 +                return 1;
 +            }
 +        } else {   /* APC_CACHE_KEY_FPFILE */
-+            if(!memcmp((*slot)->key.data.fpfile.fullpath, key.data.fpfile.fullpath, key.data.fpfile.fullpath_len+1)) {
-+                remove_slot(cache, slot);
++            if(((*slot)->key.data.fpfile.fullpath_len == key.data.fpfile.fullpath_len) &&
++                (!memcmp((*slot)->key.data.fpfile.fullpath, key.data.fpfile.fullpath, key.data.fpfile.fullpath_len+1))) {
++                remove_slot(cache, slot TSRMLS_CC);
 +                CACHE_UNLOCK(cache);
 +                return 1;
 +            }
@@ -2387,7 +2517,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +      }
 +      slot = &(*slot)->next;
 +    }
-+
++    
++    memset(&cache->header->lastkey, 0, sizeof(apc_keyid_t));
++    
 +    CACHE_UNLOCK(cache);
 +    return 0;
 +
@@ -2395,7 +2527,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_release */
-+void apc_cache_release(apc_cache_t* cache, apc_cache_entry_t* entry)
++void apc_cache_release(apc_cache_t* cache, apc_cache_entry_t* entry TSRMLS_DC)
 +{
 +    CACHE_LOCK(cache);
 +    entry->ref_count--;
@@ -2411,16 +2543,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +                       TSRMLS_DC)
 +{
 +    struct stat *tmp_buf=NULL;
-+    struct apc_fileinfo_t fileinfo = { {0}, };
++    struct apc_fileinfo_t *fileinfo = NULL;
 +    int len;
 +
 +    assert(key != NULL);
 +
 +    if (!filename || !SG(request_info).path_translated) {
-+#ifdef __DEBUG_APC__
-+        fprintf(stderr,"No filename and no path_translated - bailing\n");
-+#endif
-+        return 0;
++        apc_debug("No filename and no path_translated - bailing\n" TSRMLS_CC);
++        goto cleanup;
 +    }
 +
 +    len = strlen(filename);
@@ -2430,46 +2560,50 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +            key->data.fpfile.fullpath_len = len;
 +            key->mtime = t;
 +            key->type = APC_CACHE_KEY_FPFILE;
-+            return 1;
++            goto success;
 +        } else if(APCG(canonicalize)) {
-+            if (apc_search_paths(filename, include_path, &fileinfo) != 0) {
-+                apc_wprint("apc failed to locate %s - bailing", filename);
-+                return 0;
++
++            fileinfo = apc_php_malloc(sizeof(apc_fileinfo_t) TSRMLS_CC);
++
++            if (apc_search_paths(filename, include_path, fileinfo TSRMLS_CC) != 0) {
++                apc_warning("apc failed to locate %s - bailing" TSRMLS_CC, filename);
++                goto cleanup;
 +            }
 +
-+            if(!realpath(fileinfo.fullpath, APCG(canon_path))) {
-+                apc_wprint("realpath failed to canonicalize %s - bailing", filename);
-+                return 0;
++            if(!VCWD_REALPATH(fileinfo->fullpath, APCG(canon_path))) {
++                apc_warning("realpath failed to canonicalize %s - bailing" TSRMLS_CC, filename);
++                goto cleanup;
 +            }
 +
 +            key->data.fpfile.fullpath = APCG(canon_path);
 +            key->data.fpfile.fullpath_len = strlen(APCG(canon_path));
 +            key->mtime = t;
 +            key->type = APC_CACHE_KEY_FPFILE;
-+            return 1;
++            goto success;
 +        }
 +        /* fall through to stat mode */
 +    }
 +
++    fileinfo = apc_php_malloc(sizeof(apc_fileinfo_t) TSRMLS_CC);
++
++    assert(fileinfo != NULL);
++
 +    if(!strcmp(SG(request_info).path_translated, filename)) {
 +        tmp_buf = sapi_get_stat(TSRMLS_C);  /* Apache has already done this stat() for us */
 +    }
++
 +    if(tmp_buf) {
-+        fileinfo.st_buf.sb = *tmp_buf;
++        fileinfo->st_buf.sb = *tmp_buf;
 +    } else {
-+        if (apc_search_paths(filename, include_path, &fileinfo) != 0) {
-+#ifdef __DEBUG_APC__
-+            fprintf(stderr,"Stat failed %s - bailing (%s) (%d)\n",filename,SG(request_info).path_translated);
-+#endif
-+            return 0;
++        if (apc_search_paths(filename, include_path, fileinfo TSRMLS_CC) != 0) {
++            apc_debug("Stat failed %s - bailing (%s) (%d)\n" TSRMLS_CC, filename,SG(request_info).path_translated);
++            goto cleanup;
 +        }
 +    }
 +
-+    if(APCG(max_file_size) < fileinfo.st_buf.sb.st_size) {
-+#ifdef __DEBUG_APC__
-+        fprintf(stderr,"File is too big %s (%d - %ld) - bailing\n",filename,t,fileinfo.st_buf.sb.st_size);
-+#endif
-+        return 0;
++    if(APCG(max_file_size) < fileinfo->st_buf.sb.st_size) {
++        apc_debug("File is too big %s (%d - %ld) - bailing\n" TSRMLS_CC, filename,t,fileinfo->st_buf.sb.st_size);
++        goto cleanup;
 +    }
 +
 +    /*
@@ -2484,15 +2618,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +     * tiny safety is easier than educating the world.  This is now
 +     * configurable, but the default is still 2 seconds.
 +     */
-+    if(APCG(file_update_protection) && (t - fileinfo.st_buf.sb.st_mtime < APCG(file_update_protection)) && !APCG(force_file_update)) {
-+#ifdef __DEBUG_APC__
-+        fprintf(stderr,"File is too new %s (%d - %d) - bailing\n",filename,t,fileinfo.st_buf.sb.st_mtime);
-+#endif
-+        return 0;
++    if(APCG(file_update_protection) && (t - fileinfo->st_buf.sb.st_mtime < APCG(file_update_protection)) && !APCG(force_file_update)) {
++        apc_debug("File is too new %s (%d - %d) - bailing\n" TSRMLS_CC,filename,t,fileinfo->st_buf.sb.st_mtime);
++        goto cleanup;
 +    }
 +
-+    key->data.file.device = fileinfo.st_buf.sb.st_dev;
-+    key->data.file.inode  = fileinfo.st_buf.sb.st_ino;
++    key->data.file.device = fileinfo->st_buf.sb.st_dev;
++    key->data.file.inode  = fileinfo->st_buf.sb.st_ino;
++
 +    /*
 +     * If working with content management systems that like to munge the mtime, 
 +     * it might be appropriate to key off of the ctime to be immune to systems
@@ -2505,12 +2638,27 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +     * set the apc.stat_ctime=true to enable this check.
 +     */
 +    if(APCG(stat_ctime)) {
-+        key->mtime  = (fileinfo.st_buf.sb.st_ctime > fileinfo.st_buf.sb.st_mtime) ? fileinfo.st_buf.sb.st_ctime : fileinfo.st_buf.sb.st_mtime; 
++        key->mtime  = (fileinfo->st_buf.sb.st_ctime > fileinfo->st_buf.sb.st_mtime) ? fileinfo->st_buf.sb.st_ctime : fileinfo->st_buf.sb.st_mtime; 
 +    } else {
-+        key->mtime = fileinfo.st_buf.sb.st_mtime;
++        key->mtime = fileinfo->st_buf.sb.st_mtime;
 +    }
 +    key->type = APC_CACHE_KEY_FILE;
++
++success: 
++
++    if(fileinfo != NULL) {
++        apc_php_free(fileinfo TSRMLS_CC);
++    }
++
 +    return 1;
++
++cleanup:
++    
++    if(fileinfo != NULL) {
++        apc_php_free(fileinfo TSRMLS_CC);
++    }
++
++    return 0;
 +}
 +/* }}} */
 +
@@ -2535,7 +2683,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +                                        zend_op_array* op_array,
 +                                        apc_function_t* functions,
 +                                        apc_class_t* classes,
-+                                        apc_context_t* ctxt)
++                                        apc_context_t* ctxt
++                                        TSRMLS_DC)
 +{
 +    apc_cache_entry_t* entry;
 +    apc_pool* pool = ctxt->pool;
@@ -2543,21 +2692,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +    entry = (apc_cache_entry_t*) apc_pool_alloc(pool, sizeof(apc_cache_entry_t));
 +    if (!entry) return NULL;
 +
-+    entry->data.file.filename  = apc_pstrdup(filename, pool);
++    entry->data.file.filename  = apc_pstrdup(filename, pool TSRMLS_CC);
 +    if(!entry->data.file.filename) {
-+#ifdef __DEBUG_APC__
-+        fprintf(stderr,"apc_cache_make_file_entry: entry->data.file.filename is NULL - bailing\n");
-+#endif
++        apc_debug("apc_cache_make_file_entry: entry->data.file.filename is NULL - bailing\n" TSRMLS_CC);
 +        return NULL;
 +    }
-+#ifdef __DEBUG_APC__
-+    fprintf(stderr,"apc_cache_make_file_entry: entry->data.file.filename is [%s]\n",entry->data.file.filename);
-+#endif
++    apc_debug("apc_cache_make_file_entry: entry->data.file.filename is [%s]\n" TSRMLS_CC,entry->data.file.filename);
 +    entry->data.file.op_array  = op_array;
 +    entry->data.file.functions = functions;
 +    entry->data.file.classes   = classes;
 +
-+    entry->data.file.halt_offset = apc_file_halt_offset(filename);
++    entry->data.file.halt_offset = apc_file_halt_offset(filename TSRMLS_CC);
 +
 +    entry->type = APC_CACHE_ENTRY_FILE;
 +    entry->ref_count = 0;
@@ -2568,18 +2713,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_store_zval */
-+zval* apc_cache_store_zval(zval* dst, const zval* src, apc_context_t* ctxt)
++zval* apc_cache_store_zval(zval* dst, const zval* src, apc_context_t* ctxt TSRMLS_DC)
 +{
-+    TSRMLS_FETCH();
-+
 +    if (Z_TYPE_P(src) == IS_ARRAY) {
 +        /* Maintain a list of zvals we've copied to properly handle recursive structures */
 +        zend_hash_init(&APCG(copied_zvals), 0, NULL, NULL, 0);
-+        dst = apc_copy_zval(dst, src, ctxt);
++        dst = apc_copy_zval(dst, src, ctxt TSRMLS_CC);
 +        zend_hash_destroy(&APCG(copied_zvals));
 +        APCG(copied_zvals).nTableSize=0;
 +    } else {
-+        dst = apc_copy_zval(dst, src, ctxt);
++        dst = apc_copy_zval(dst, src, ctxt TSRMLS_CC);
 +    }
 +
 +
@@ -2588,18 +2731,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_fetch_zval */
-+zval* apc_cache_fetch_zval(zval* dst, const zval* src, apc_context_t* ctxt)
++zval* apc_cache_fetch_zval(zval* dst, const zval* src, apc_context_t* ctxt TSRMLS_DC)
 +{
-+    TSRMLS_FETCH();
-+
 +    if (Z_TYPE_P(src) == IS_ARRAY) {
 +        /* Maintain a list of zvals we've copied to properly handle recursive structures */
 +        zend_hash_init(&APCG(copied_zvals), 0, NULL, NULL, 0);
-+        dst = apc_copy_zval(dst, src, ctxt);
++        dst = apc_copy_zval(dst, src, ctxt TSRMLS_CC);
 +        zend_hash_destroy(&APCG(copied_zvals));
 +        APCG(copied_zvals).nTableSize=0;
 +    } else {
-+        dst = apc_copy_zval(dst, src, ctxt);
++        dst = apc_copy_zval(dst, src, ctxt TSRMLS_CC);
 +    }
 +
 +
@@ -2608,7 +2749,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_make_user_entry */
-+apc_cache_entry_t* apc_cache_make_user_entry(const char* info, int info_len, const zval* val, apc_context_t* ctxt, const unsigned int ttl)
++apc_cache_entry_t* apc_cache_make_user_entry(const char* info, int info_len, const zval* val, apc_context_t* ctxt, const unsigned int ttl TSRMLS_DC)
 +{
 +    apc_cache_entry_t* entry;
 +    apc_pool* pool = ctxt->pool;
@@ -2616,12 +2757,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +    entry = (apc_cache_entry_t*) apc_pool_alloc(pool, sizeof(apc_cache_entry_t));
 +    if (!entry) return NULL;
 +
-+    entry->data.user.info = apc_pmemcpy(info, info_len+1, pool);
++    entry->data.user.info = apc_pmemcpy(info, info_len, pool TSRMLS_CC);
 +    entry->data.user.info_len = info_len;
 +    if(!entry->data.user.info) {
 +        return NULL;
 +    }
-+    entry->data.user.val = apc_cache_store_zval(NULL, val, ctxt);
++    entry->data.user.val = apc_cache_store_zval(NULL, val, ctxt TSRMLS_CC);
 +    if(!entry->data.user.val) {
 +        return NULL;
 +    }
@@ -2636,19 +2777,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_info */
-+apc_cache_info_t* apc_cache_info(apc_cache_t* cache, zend_bool limited)
++apc_cache_info_t* apc_cache_info(apc_cache_t* cache, zend_bool limited TSRMLS_DC)
 +{
 +    apc_cache_info_t* info;
 +    slot_t* p;
 +    int i;
 +
-+      TSRMLS_FETCH();
-+
 +    if(!cache) return NULL;
 +
 +    CACHE_LOCK(cache);
 +
-+    info = (apc_cache_info_t*) apc_emalloc(sizeof(apc_cache_info_t));
++    info = (apc_cache_info_t*) apc_php_malloc(sizeof(apc_cache_info_t) TSRMLS_CC);
 +    if(!info) {
 +        CACHE_UNLOCK(cache);
 +        return NULL;
@@ -2670,17 +2809,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +        for (i = 0; i < info->num_slots; i++) {
 +            p = cache->slots[i];
 +            for (; p != NULL; p = p->next) {
-+                apc_cache_link_t* link = (apc_cache_link_t*) apc_emalloc(sizeof(apc_cache_link_t));
++                apc_cache_link_t* link = (apc_cache_link_t*) apc_php_malloc(sizeof(apc_cache_link_t) TSRMLS_CC);
 +
 +                if(p->value->type == APC_CACHE_ENTRY_FILE) {
 +                    if(p->key.type == APC_CACHE_KEY_FILE) {
 +                        link->data.file.device = p->key.data.file.device;
 +                        link->data.file.inode = p->key.data.file.inode;
-+                        link->data.file.filename = apc_xstrdup(p->value->data.file.filename, apc_emalloc);
++                        link->data.file.filename = apc_xstrdup(p->value->data.file.filename, apc_php_malloc TSRMLS_CC);
 +                    } else { /* This is a no-stat fullpath file entry */
 +                        link->data.file.device = 0;
 +                        link->data.file.inode = 0;
-+                        link->data.file.filename = apc_xstrdup(p->key.data.fpfile.fullpath, apc_emalloc);
++                        link->data.file.filename = apc_xstrdup(p->key.data.fpfile.fullpath, apc_php_malloc TSRMLS_CC);
 +                    }
 +                    link->type = APC_CACHE_ENTRY_FILE;
 +                    if (APCG(file_md5)) {
@@ -2690,7 +2829,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +                      link->data.file.md5 = NULL;
 +                    }
 +                } else if(p->value->type == APC_CACHE_ENTRY_USER) {
-+                    link->data.user.info = apc_xmemcpy(p->value->data.user.info, p->value->data.user.info_len+1, apc_emalloc);
++                    link->data.user.info = apc_xmemcpy(p->value->data.user.info, p->value->data.user.info_len+1, apc_php_malloc TSRMLS_CC);
 +                    link->data.user.ttl = p->value->data.user.ttl;
 +                    link->type = APC_CACHE_ENTRY_USER;
 +                }
@@ -2708,17 +2847,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +
 +        /* For each slot pending deletion */
 +        for (p = cache->header->deleted_list; p != NULL; p = p->next) {
-+            apc_cache_link_t* link = (apc_cache_link_t*) apc_emalloc(sizeof(apc_cache_link_t));
++            apc_cache_link_t* link = (apc_cache_link_t*) apc_php_malloc(sizeof(apc_cache_link_t) TSRMLS_CC);
 +
 +            if(p->value->type == APC_CACHE_ENTRY_FILE) {
 +                if(p->key.type == APC_CACHE_KEY_FILE) {
 +                    link->data.file.device = p->key.data.file.device;
 +                    link->data.file.inode = p->key.data.file.inode;
-+                    link->data.file.filename = apc_xstrdup(p->value->data.file.filename, apc_emalloc);
++                    link->data.file.filename = apc_xstrdup(p->value->data.file.filename, apc_php_malloc TSRMLS_CC);
 +                } else { /* This is a no-stat fullpath file entry */
 +                    link->data.file.device = 0;
 +                    link->data.file.inode = 0;
-+                    link->data.file.filename = apc_xstrdup(p->key.data.fpfile.fullpath, apc_emalloc);
++                    link->data.file.filename = apc_xstrdup(p->key.data.fpfile.fullpath, apc_php_malloc TSRMLS_CC);
 +                }
 +                link->type = APC_CACHE_ENTRY_FILE;
 +                if (APCG(file_md5)) {
@@ -2728,7 +2867,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +                  link->data.file.md5 = NULL;
 +                }
 +            } else if(p->value->type == APC_CACHE_ENTRY_USER) {
-+                link->data.user.info = apc_xmemcpy(p->value->data.user.info, p->value->data.user.info_len+1, apc_emalloc);
++                link->data.user.info = apc_xmemcpy(p->value->data.user.info, p->value->data.user.info_len+1, apc_php_malloc TSRMLS_CC);
 +                link->data.user.ttl = p->value->data.user.ttl;
 +                link->type = APC_CACHE_ENTRY_USER;
 +            }
@@ -2750,7 +2889,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_free_info */
-+void apc_cache_free_info(apc_cache_info_t* info)
++void apc_cache_free_info(apc_cache_info_t* info TSRMLS_DC)
 +{
 +    apc_cache_link_t* p = info->list;
 +    apc_cache_link_t* q = NULL;
@@ -2761,10 +2900,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +            if(q->data.file.md5) {
 +                efree(q->data.file.md5);
 +            }
-+            apc_efree(q->data.file.filename);
++            apc_php_free(q->data.file.filename TSRMLS_CC);
 +        }
-+        else if(q->type == APC_CACHE_ENTRY_USER) apc_efree(q->data.user.info);
-+        apc_efree(q);
++        else if(q->type == APC_CACHE_ENTRY_USER) apc_php_free(q->data.user.info TSRMLS_CC);
++        apc_php_free(q TSRMLS_CC);
 +    }
 +    p = info->deleted_list;
 +    while (p != NULL) {
@@ -2774,17 +2913,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +            if(q->data.file.md5) {
 +                efree(q->data.file.md5);
 +            }
-+            apc_efree(q->data.file.filename);
++            apc_php_free(q->data.file.filename TSRMLS_CC);
 +        }
-+        else if(q->type == APC_CACHE_ENTRY_USER) apc_efree(q->data.user.info);
-+        apc_efree(q);
++        else if(q->type == APC_CACHE_ENTRY_USER) apc_php_free(q->data.user.info TSRMLS_CC);
++        apc_php_free(q TSRMLS_CC);
 +    }
-+    apc_efree(info);
++    apc_php_free(info TSRMLS_CC);
 +}
 +/* }}} */
 +
 +/* {{{ apc_cache_unlock */
-+void apc_cache_unlock(apc_cache_t* cache)
++void apc_cache_unlock(apc_cache_t* cache TSRMLS_DC)
 +{
 +    CACHE_UNLOCK(cache);
 +}
@@ -2798,18 +2937,29 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +/* }}} */
 +
 +/* {{{ apc_cache_is_last_key */
-+zend_bool apc_cache_is_last_key(apc_cache_t* cache, apc_cache_key_t* key, time_t t)
++zend_bool apc_cache_is_last_key(apc_cache_t* cache, apc_cache_key_t* key, unsigned int h, time_t t TSRMLS_DC)
 +{
 +    apc_keyid_t *lastkey = &cache->header->lastkey;
-+    unsigned int keylen = key->data.user.identifier_len+1;
-+    unsigned int h = string_nhash_8(key->data.user.identifier, keylen);
++    unsigned int keylen = key->data.user.identifier_len;
++#ifdef ZTS
++    THREAD_T tid = tsrm_thread_id();
++    #define FROM_DIFFERENT_THREAD(k) (memcmp(&((k)->tid), &tid, sizeof(THREAD_T))!=0)
++#else
++    pid_t pid = getpid();
++    #define FROM_DIFFERENT_THREAD(k) (pid != (k)->pid) 
++#endif
++
++
++    if(!h) h = string_nhash_8(key->data.user.identifier, keylen);
 +
 +    /* unlocked reads, but we're not shooting for 100% success with this */
 +    if(lastkey->h == h && keylen == lastkey->keylen) {
-+        if(lastkey->mtime == t) {
++        if(lastkey->mtime == t && FROM_DIFFERENT_THREAD(lastkey)) {
 +            /* potential cache slam */
-+            apc_wprint("Potential cache slam averted for key '%s'", key->data.user.identifier);
-+            return 1;
++            if(APCG(slam_defense)) {
++                apc_warning("Potential cache slam averted for key '%s'" TSRMLS_CC, key->data.user.identifier);
++                return 1;
++            }
 +        }
 +    }
 +
@@ -2819,14 +2969,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 +
 +#if NONBLOCKING_LOCK_AVAILABLE
 +/* {{{ apc_cache_write_lock */
-+zend_bool apc_cache_write_lock(apc_cache_t* cache)
++zend_bool apc_cache_write_lock(apc_cache_t* cache TSRMLS_DC)
 +{
 +    return apc_lck_nb_lock(cache->header->wrlock);
 +}
 +/* }}} */
 +
 +/* {{{ apc_cache_write_unlock */
-+void apc_cache_write_unlock(apc_cache_t* cache)
++void apc_cache_write_unlock(apc_cache_t* cache TSRMLS_DC)
 +{
 +    apc_lck_unlock(cache->header->wrlock);
 +}
@@ -2841,15 +2991,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.c php-5.3.1/ext/apc/apc_cache.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
---- php-5.3.1.orig/ext/apc/apc_cache.h 1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_cache.h      1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,378 @@
+--- /dev/null
++++ b/ext/apc/apc_cache.h
+@@ -0,0 +1,403 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -2873,7 +3022,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +
 + */
 +
-+/* $Id: apc_cache.h 281919 2009-06-10 11:23:55Z gopalv $ */
++/* $Id: apc_cache.h 305258 2010-11-10 19:02:06Z gopalv $ */
 +
 +#ifndef APC_CACHE_H
 +#define APC_CACHE_H
@@ -2888,6 +3037,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +#include "apc_lock.h"
 +#include "apc_pool.h"
 +#include "apc_main.h"
++#include "TSRM.h"
 +
 +#define APC_CACHE_ENTRY_FILE   1
 +#define APC_CACHE_ENTRY_USER   2
@@ -2896,6 +3046,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +#define APC_CACHE_KEY_USER     2
 +#define APC_CACHE_KEY_FPFILE   3
 +
++#ifdef PHP_WIN32
++typedef unsigned __int64 apc_ino_t;
++typedef unsigned __int64 apc_dev_t;
++#else
++typedef ino_t apc_ino_t;
++typedef dev_t apc_dev_t;
++#endif
++
 +/* {{{ cache locking macros */
 +#define CACHE_LOCK(cache)        { LOCK(cache->header->lock);   cache->has_lock = 1; }
 +#define CACHE_UNLOCK(cache)      { UNLOCK(cache->header->lock); cache->has_lock = 0; }
@@ -2909,8 +3067,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +
 +typedef union _apc_cache_key_data_t {
 +    struct {
-+        dev_t device;             /* the filesystem device */
-+        ino_t inode;              /* the filesystem inode */
++        apc_dev_t device;             /* the filesystem device */
++        apc_ino_t inode;              /* the filesystem inode */
 +    } file;
 +    struct {
 +        const char *identifier;
@@ -2937,6 +3095,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +    unsigned int h;
 +    unsigned int keylen;
 +    time_t mtime;
++#ifdef ZTS
++    THREAD_T tid;
++#else
++    pid_t pid;
++#endif
 +};
 +/* }}} */
 +
@@ -2985,20 +3148,20 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 + * is needed.  This helps in cleaning up the cache and ensuring that entries 
 + * hit frequently stay cached and ones not hit very often eventually disappear.
 + */
-+extern T apc_cache_create(int size_hint, int gc_ttl, int ttl);
++extern T apc_cache_create(int size_hint, int gc_ttl, int ttl TSRMLS_DC);
 +
 +/*
 + * apc_cache_destroy releases any OS resources associated with a cache object.
 + * Under apache, this function can be safely called by the child processes
 + * when they exit.
 + */
-+extern void apc_cache_destroy(T cache);
++extern void apc_cache_destroy(T cache TSRMLS_DC);
 +
 +/*
 + * apc_cache_clear empties a cache. This can safely be called at any time,
 + * even while other server processes are executing cached source files.
 + */
-+extern void apc_cache_clear(T cache);
++extern void apc_cache_clear(T cache TSRMLS_DC);
 +
 +/*
 + * apc_cache_insert adds an entry to the cache, using a filename as a key.
@@ -3013,13 +3176,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 + * value is a cache entry returned by apc_cache_make_entry (see below).
 + */
 +extern int apc_cache_insert(T cache, apc_cache_key_t key,
-+                            apc_cache_entry_t* value, apc_context_t* ctxt, time_t t);
++                            apc_cache_entry_t* value, apc_context_t* ctxt, time_t t TSRMLS_DC);
 +
 +extern int apc_cache_user_insert(T cache, apc_cache_key_t key,
 +                            apc_cache_entry_t* value, apc_context_t* ctxt, time_t t, int exclusive TSRMLS_DC);
 +
 +extern int *apc_cache_insert_mult(apc_cache_t* cache, apc_cache_key_t* keys,
-+                            apc_cache_entry_t** values, apc_context_t *ctxt, time_t t, int num_entries);
++                            apc_cache_entry_t** values, apc_context_t *ctxt, time_t t, int num_entries TSRMLS_DC);
 +
 +/*
 + * apc_cache_find searches for a cache entry by filename, and returns a
@@ -3027,26 +3190,35 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 + *
 + * key is a value created by apc_cache_make_file_key for file keys.
 + */
-+extern apc_cache_entry_t* apc_cache_find(T cache, apc_cache_key_t key, time_t t);
++extern apc_cache_entry_t* apc_cache_find(T cache, apc_cache_key_t key, time_t t TSRMLS_DC);
 +
 +/*
 + * apc_cache_user_find searches for a cache entry by its hashed identifier,
 + * and returns a pointer to the entry if found, NULL otherwise.
 + *
 + */
-+extern apc_cache_entry_t* apc_cache_user_find(T cache, char* strkey, int keylen, time_t t);
++extern apc_cache_entry_t* apc_cache_user_find(T cache, char* strkey, int keylen, time_t t TSRMLS_DC);
++
++/*
++ * apc_cache_user_exists searches for a cache entry by its hashed identifier,
++ * and returns a pointer to the entry if found, NULL otherwise.  This is a
++ * quick non-locking version of apc_cache_user_find that does not modify the
++ * shared memory segment in any way.
++ *
++ */
++extern apc_cache_entry_t* apc_cache_user_exists(T cache, char* strkey, int keylen, time_t t TSRMLS_DC);
 +
 +/*
 + * apc_cache_delete and apc_cache_user_delete finds an entry in the cache and deletes it.
 + */
-+extern int apc_cache_delete(apc_cache_t* cache, char *filename, int filename_len);
-+extern int apc_cache_user_delete(apc_cache_t* cache, char *strkey, int keylen);
++extern int apc_cache_delete(apc_cache_t* cache, char *filename, int filename_len TSRMLS_DC);
++extern int apc_cache_user_delete(apc_cache_t* cache, char *strkey, int keylen TSRMLS_DC);
 +
 +/* apc_cach_fetch_zval takes a zval in the cache and reconstructs a runtime
 + * zval from it.
 + *
 + */
-+zval* apc_cache_fetch_zval(zval* dst, const zval* src, apc_context_t* ctxt);
++zval* apc_cache_fetch_zval(zval* dst, const zval* src, apc_context_t* ctxt TSRMLS_DC);
 +
 +/*
 + * apc_cache_release decrements the reference count associated with a cache
@@ -3057,7 +3229,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 + *
 + * entry is the cache entry whose ref count you want to decrement.
 + */
-+extern void apc_cache_release(T cache, apc_cache_entry_t* entry);
++extern void apc_cache_release(T cache, apc_cache_entry_t* entry TSRMLS_DC);
 +
 +/*
 + * apc_cache_make_file_key creates a key object given a relative or absolute
@@ -3089,7 +3261,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +                                                    zend_op_array* op_array,
 +                                                    apc_function_t* functions,
 +                                                    apc_class_t* classes,
-+                                                    apc_context_t* ctxt);
++                                                    apc_context_t* ctxt
++                                                  TSRMLS_DC);
 +
 +
 +zend_bool apc_compile_cache_entry(apc_cache_key_t key, zend_file_handle* h, int type, time_t t, zend_op_array** op_array_pp, apc_cache_entry_t** cache_entry_pp TSRMLS_DC);
@@ -3098,7 +3271,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 + * apc_cache_make_user_entry creates an apc_cache_entry_t object given an info string
 + * and the zval to be stored.
 + */
-+extern apc_cache_entry_t* apc_cache_make_user_entry(const char* info, int info_len, const zval *val, apc_context_t* ctxt, const unsigned int ttl);
++extern apc_cache_entry_t* apc_cache_make_user_entry(const char* info, int info_len, const zval *val, apc_context_t* ctxt, const unsigned int ttl TSRMLS_DC);
 +
 +extern int apc_cache_make_user_key(apc_cache_key_t* key, char* identifier, int identifier_len, const time_t t);
 +
@@ -3106,8 +3279,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +typedef union _apc_cache_link_data_t {
 +    struct {
 +        char *filename;
-+        dev_t device;
-+        ino_t inode;
++        apc_ino_t device;
++        apc_dev_t inode;
 +        unsigned char *md5;
 +    } file;
 +    struct {
@@ -3133,6 +3306,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +};
 +/* }}} */
 +
++
 +/* {{{ struct definition: apc_cache_info_t */
 +typedef struct apc_cache_info_t apc_cache_info_t;
 +struct apc_cache_info_t {
@@ -3182,7 +3356,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +};
 +/* }}} */
 +
-+typedef void (*apc_expunge_cb_t)(T cache, size_t n); 
++typedef void (*apc_expunge_cb_t)(T cache, size_t n TSRMLS_DC); 
 +
 +/* {{{ struct definition: apc_cache_t */
 +struct apc_cache_t {
@@ -3197,13 +3371,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 +};
 +/* }}} */
 +
-+extern apc_cache_info_t* apc_cache_info(T cache, zend_bool limited);
-+extern void apc_cache_free_info(apc_cache_info_t* info);
-+extern void apc_cache_unlock(apc_cache_t* cache);
++extern apc_cache_info_t* apc_cache_info(T cache, zend_bool limited TSRMLS_DC);
++extern void apc_cache_free_info(apc_cache_info_t* info TSRMLS_DC);
++extern void apc_cache_unlock(apc_cache_t* cache TSRMLS_DC);
 +extern zend_bool apc_cache_busy(apc_cache_t* cache);
-+extern zend_bool apc_cache_write_lock(apc_cache_t* cache);
-+extern void apc_cache_write_unlock(apc_cache_t* cache);
-+extern zend_bool apc_cache_is_last_key(apc_cache_t* cache, apc_cache_key_t* key, time_t t);
++extern zend_bool apc_cache_write_lock(apc_cache_t* cache TSRMLS_DC);
++extern void apc_cache_write_unlock(apc_cache_t* cache TSRMLS_DC);
++extern zend_bool apc_cache_is_last_key(apc_cache_t* cache, apc_cache_key_t* key, unsigned int h, time_t t TSRMLS_DC);
 +
 +/* used by apc_rfc1867 to update data in-place - not to be used elsewhere */
 +
@@ -3223,15 +3397,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_cache.h php-5.3.1/ext/apc/apc_cache.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
---- php-5.3.1.orig/ext/apc/apc_compile.c       1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_compile.c    1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,1775 @@
+--- /dev/null
++++ b/ext/apc/apc_compile.c
+@@ -0,0 +1,2102 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -3257,11 +3430,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +
 + */
 +
-+/* $Id: apc_compile.c 284580 2009-07-22 06:05:31Z kalle $ */
++/* $Id: apc_compile.c 303796 2010-09-27 17:14:18Z gopalv $ */
 +
 +#include "apc_compile.h"
 +#include "apc_globals.h"
 +#include "apc_zend.h"
++#include "apc_string.h"
 +#include "ext/standard/php_var.h"
 +#include "ext/standard/php_smart_str.h"
 +
@@ -3269,7 +3443,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +#define IS_CONSTANT_TYPE_MASK (~IS_CONSTANT_INDEX)
 +#endif
 +
-+typedef void* (*ht_copy_fun_t)(void*, void*, apc_context_t*);
++typedef void* (*ht_copy_fun_t)(void*, void*, apc_context_t* TSRMLS_DC);
 +//typedef void  (*ht_free_fun_t)(void*, apc_context_t*);
 +typedef int (*ht_check_copy_fun_t)(Bucket*, va_list);
 +
@@ -3279,27 +3453,27 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +
 +/* {{{ internal function declarations */
 +
-+static zend_function* my_bitwise_copy_function(zend_function*, zend_function*, apc_context_t*);
++static zend_function* my_bitwise_copy_function(zend_function*, zend_function*, apc_context_t* TSRMLS_DC);
 +
 +/*
 + * The "copy" functions perform deep-copies on a particular data structure
 + * (passed as the second argument). They also optionally allocate space for
 + * the destination data structure if the first argument is null.
 + */
-+static zval** my_copy_zval_ptr(zval**, const zval**, apc_context_t*);
-+static zval* my_copy_zval(zval*, const zval*, apc_context_t*);
-+static znode* my_copy_znode(znode*, znode*, apc_context_t*);
-+static zend_op* my_copy_zend_op(zend_op*, zend_op*, apc_context_t*);
-+static zend_function* my_copy_function(zend_function*, zend_function*, apc_context_t*);
-+static zend_function_entry* my_copy_function_entry(zend_function_entry*, const zend_function_entry*, apc_context_t*);
-+static zend_class_entry* my_copy_class_entry(zend_class_entry*, zend_class_entry*, apc_context_t*);
-+static HashTable* my_copy_hashtable_ex(HashTable*, HashTable*, ht_copy_fun_t, int, apc_context_t*, ht_check_copy_fun_t, ...);
++static zval** my_copy_zval_ptr(zval**, const zval**, apc_context_t* TSRMLS_DC);
++static zval* my_copy_zval(zval*, const zval*, apc_context_t* TSRMLS_DC);
++static znode* my_copy_znode(znode*, znode*, apc_context_t* TSRMLS_DC);
++static zend_op* my_copy_zend_op(zend_op*, zend_op*, apc_context_t* TSRMLS_DC);
++static zend_function* my_copy_function(zend_function*, zend_function*, apc_context_t* TSRMLS_DC);
++static zend_function_entry* my_copy_function_entry(zend_function_entry*, const zend_function_entry*, apc_context_t* TSRMLS_DC);
++static zend_class_entry* my_copy_class_entry(zend_class_entry*, zend_class_entry*, apc_context_t* TSRMLS_DC);
++static HashTable* my_copy_hashtable_ex(HashTable*, HashTable* TSRMLS_DC, ht_copy_fun_t, int, apc_context_t*, ht_check_copy_fun_t, ...);
 +#define my_copy_hashtable( dst, src, copy_fn, holds_ptr, ctxt) \
-+    my_copy_hashtable_ex(dst, src, copy_fn, holds_ptr, ctxt, NULL)
-+static HashTable* my_copy_static_variables(zend_op_array* src, apc_context_t*);
-+static zend_property_info* my_copy_property_info(zend_property_info* dst, zend_property_info* src, apc_context_t*);
-+static zend_arg_info* my_copy_arg_info_array(zend_arg_info*, const zend_arg_info*, uint, apc_context_t*);
-+static zend_arg_info* my_copy_arg_info(zend_arg_info*, const zend_arg_info*, apc_context_t*);
++    my_copy_hashtable_ex(dst, src TSRMLS_CC, copy_fn, holds_ptr, ctxt, NULL)
++static HashTable* my_copy_static_variables(zend_op_array* src, apc_context_t* TSRMLS_DC);
++static zend_property_info* my_copy_property_info(zend_property_info* dst, zend_property_info* src, apc_context_t* TSRMLS_DC);
++static zend_arg_info* my_copy_arg_info_array(zend_arg_info*, const zend_arg_info*, uint, apc_context_t* TSRMLS_DC);
++static zend_arg_info* my_copy_arg_info(zend_arg_info*, const zend_arg_info*, apc_context_t* TSRMLS_DC);
 +
 +/*
 + * The "fixup" functions need for ZEND_ENGINE_2
@@ -3324,6 +3498,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +static int my_check_copy_default_property(Bucket* p, va_list args);
 +static int my_check_copy_property_info(Bucket* src, va_list args);
 +static int my_check_copy_static_member(Bucket* src, va_list args);
++static int my_check_copy_constant(Bucket* src, va_list args);
 +
 +/* }}} */
 +
@@ -3371,7 +3546,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_bitwise_copy_function */
-+static zend_function* my_bitwise_copy_function(zend_function* dst, zend_function* src, apc_context_t* ctxt)
++static zend_function* my_bitwise_copy_function(zend_function* dst, zend_function* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    apc_pool* pool = ctxt->pool;
 +
@@ -3389,7 +3564,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_copy_zval_ptr */
-+static zval** my_copy_zval_ptr(zval** dst, const zval** src, apc_context_t* ctxt)
++static zval** my_copy_zval_ptr(zval** dst, const zval** src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    zval* dst_new;
 +    apc_pool* pool = ctxt->pool;
@@ -3408,11 +3583,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +        CHECK((dst[0] = (zval*) apc_pool_alloc(pool, sizeof(zval))));
 +    }
 +
-+    CHECK((dst_new = my_copy_zval(*dst, *src, ctxt)));
++    CHECK((dst_new = my_copy_zval(*dst, *src, ctxt TSRMLS_CC)));
 +
 +    if(dst_new != *dst) {
 +        if(usegc) {
-+            TSRMLS_FETCH();
 +            FREE_ZVAL(dst[0]);
 +        }
 +        *dst = dst_new;
@@ -3423,14 +3597,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_serialize_object */
-+static zval* my_serialize_object(zval* dst, const zval* src, apc_context_t* ctxt)
++static zval* my_serialize_object(zval* dst, const zval* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    smart_str buf = {0};
 +    php_serialize_data_t var_hash;
 +    apc_pool* pool = ctxt->pool;
 +
-+    TSRMLS_FETCH();
-+
 +    PHP_VAR_SERIALIZE_INIT(var_hash);
 +    php_var_serialize(&buf, (zval**)&src, &var_hash TSRMLS_CC);
 +    PHP_VAR_SERIALIZE_DESTROY(var_hash);
@@ -3438,7 +3610,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    if(buf.c) {
 +        dst->type = src->type & ~IS_CONSTANT_INDEX;
 +        dst->value.str.len = buf.len;
-+        CHECK(dst->value.str.val = apc_pmemcpy(buf.c, buf.len+1, pool));
++        CHECK(dst->value.str.val = apc_pmemcpy(buf.c, (buf.len + 1), pool TSRMLS_CC));
 +        dst->type = src->type;
 +        smart_str_free(&buf);
 +    }
@@ -3448,13 +3620,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_unserialize_object */
-+static zval* my_unserialize_object(zval* dst, const zval* src, apc_context_t* ctxt)
++static zval* my_unserialize_object(zval* dst, const zval* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    php_unserialize_data_t var_hash;
 +    const unsigned char *p = (unsigned char*)Z_STRVAL_P(src);
 +
-+    TSRMLS_FETCH();
-+
 +    PHP_VAR_UNSERIALIZE_INIT(var_hash);
 +    if(!php_var_unserialize(&dst, &p, p + Z_STRLEN_P(src), &var_hash TSRMLS_CC)) {
 +        PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
@@ -3467,12 +3637,24 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +}
 +/* }}} */
 +
++static char *apc_string_pmemcpy(char *str, size_t len, apc_pool* pool TSRMLS_DC)
++{     
++#ifdef ZEND_ENGINE_2_4
++    if (pool->type != APC_UNPOOL) {
++        char * ret = apc_new_interned_string(str, len TSRMLS_CC);
++        if (ret) {
++            return ret;
++        }
++    }
++#endif
++    return apc_pmemcpy(str, len, pool TSRMLS_CC);
++}
++
 +/* {{{ my_copy_zval */
-+static zval* my_copy_zval(zval* dst, const zval* src, apc_context_t* ctxt)
++static zval* my_copy_zval(zval* dst, const zval* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    zval **tmp;
 +    apc_pool* pool = ctxt->pool;
-+    TSRMLS_FETCH();
 +
 +    assert(dst != NULL);
 +    assert(src != NULL);
@@ -3514,9 +3696,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    case IS_CONSTANT:
 +    case IS_STRING:
 +        if (src->value.str.val) {
-+            CHECK(dst->value.str.val = apc_pmemcpy(src->value.str.val,
++            CHECK(dst->value.str.val = apc_string_pmemcpy(src->value.str.val,
 +                                                   src->value.str.len+1,
-+                                                   pool));
++                                                   pool TSRMLS_CC));
 +        }
 +        break;
 +
@@ -3535,9 +3717,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    
 +        dst->type = IS_NULL;
 +        if(ctxt->copy == APC_COPY_IN_USER) {
-+            dst = my_serialize_object(dst, src, ctxt);
++            dst = my_serialize_object(dst, src, ctxt TSRMLS_CC);
 +        } else if(ctxt->copy == APC_COPY_OUT_USER) {
-+            dst = my_unserialize_object(dst, src, ctxt);
++            dst = my_unserialize_object(dst, src, ctxt TSRMLS_CC);
 +        }
 +        break;
 +
@@ -3549,8 +3731,36 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +}
 +/* }}} */
 +
++#ifdef ZEND_ENGINE_2_4
++/* {{{ my_copy_znode */
++static void my_check_znode(zend_uchar op_type, apc_context_t* ctxt TSRMLS_DC)
++{
++    assert(op_type == IS_CONST ||
++           op_type == IS_VAR ||
++           op_type == IS_CV ||
++           op_type == IS_TMP_VAR ||
++           op_type == IS_UNUSED);
++}
++/* }}} */
++
++/* {{{ my_copy_zend_op */
++static zend_op* my_copy_zend_op(zend_op* dst, zend_op* src, apc_context_t* ctxt TSRMLS_DC)
++{
++    assert(dst != NULL);
++    assert(src != NULL);
++
++    memcpy(dst, src, sizeof(src[0]));
++
++    my_check_znode(dst->result_type & ~EXT_TYPE_UNUSED, ctxt TSRMLS_CC);
++    my_check_znode(dst->op1_type, ctxt TSRMLS_CC);
++    my_check_znode(dst->op2_type, ctxt TSRMLS_CC);
++
++    return dst;
++}
++/* }}} */
++#else
 +/* {{{ my_copy_znode */
-+static znode* my_copy_znode(znode* dst, znode* src, apc_context_t* ctxt)
++static znode* my_copy_znode(znode* dst, znode* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    assert(dst != NULL);
 +    assert(src != NULL);
@@ -3571,7 +3781,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +#endif
 +
 +    if (src->op_type == IS_CONST) {
-+        if(!my_copy_zval(&dst->u.constant, &src->u.constant, ctxt)) {
++        if(!my_copy_zval(&dst->u.constant, &src->u.constant, ctxt TSRMLS_CC)) {
 +            return NULL;
 +        }
 +    }
@@ -3581,29 +3791,28 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_copy_zend_op */
-+static zend_op* my_copy_zend_op(zend_op* dst, zend_op* src, apc_context_t* ctxt)
++static zend_op* my_copy_zend_op(zend_op* dst, zend_op* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    assert(dst != NULL);
 +    assert(src != NULL);
 +
 +    memcpy(dst, src, sizeof(src[0]));
 +
-+    CHECK(my_copy_znode(&dst->result, &src->result, ctxt));
-+    CHECK(my_copy_znode(&dst->op1, &src->op1, ctxt));
-+    CHECK(my_copy_znode(&dst->op2, &src->op2, ctxt));
++    CHECK(my_copy_znode(&dst->result, &src->result, ctxt TSRMLS_CC));
++    CHECK(my_copy_znode(&dst->op1, &src->op1, ctxt TSRMLS_CC));
++    CHECK(my_copy_znode(&dst->op2, &src->op2, ctxt TSRMLS_CC));
 +
 +    return dst;
 +}
 +/* }}} */
++#endif
 +
 +/* {{{ my_copy_function */
-+static zend_function* my_copy_function(zend_function* dst, zend_function* src, apc_context_t* ctxt)
++static zend_function* my_copy_function(zend_function* dst, zend_function* src, apc_context_t* ctxt TSRMLS_DC)
 +{
-+    TSRMLS_FETCH();
-+
 +    assert(src != NULL);
 +
-+    CHECK(dst = my_bitwise_copy_function(dst, src, ctxt));
++    CHECK(dst = my_bitwise_copy_function(dst, src, ctxt TSRMLS_CC));
 +
 +    switch (src->type) {
 +    case ZEND_INTERNAL_FUNCTION:
@@ -3646,7 +3855,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_copy_function_entry */
-+static zend_function_entry* my_copy_function_entry(zend_function_entry* dst, const zend_function_entry* src, apc_context_t* ctxt)
++static zend_function_entry* my_copy_function_entry(zend_function_entry* dst, const zend_function_entry* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    assert(src != NULL);
 +
@@ -3661,14 +3870,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    dst->arg_info = NULL;
 +
 +    if (src->fname) {
-+        CHECK((dst->fname = apc_pstrdup(src->fname, ctxt->pool)));
++        CHECK((dst->fname = apc_pstrdup(src->fname, ctxt->pool TSRMLS_CC)));
 +    }
 +
 +    if (src->arg_info) {
 +        CHECK((dst->arg_info = my_copy_arg_info_array(NULL,
 +                                                src->arg_info,
 +                                                src->num_args,
-+                                                ctxt)));
++                                                ctxt TSRMLS_CC)));
 +    }
 +
 +    return dst;
@@ -3676,7 +3885,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_copy_property_info */
-+static zend_property_info* my_copy_property_info(zend_property_info* dst, zend_property_info* src, apc_context_t* ctxt)
++static zend_property_info* my_copy_property_info(zend_property_info* dst, zend_property_info* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    apc_pool* pool = ctxt->pool;
 +
@@ -3699,12 +3908,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +         * string of the form:
 +         *      \0<classname>\0<membername>\0
 +         */
-+        CHECK((dst->name = apc_pmemcpy(src->name, src->name_length+1, pool)));
++        CHECK((dst->name = apc_string_pmemcpy(src->name, src->name_length+1, pool TSRMLS_CC)));
 +    }
 +
 +#if defined(ZEND_ENGINE_2) && PHP_MINOR_VERSION > 0
 +    if (src->doc_comment) {
-+        CHECK((dst->doc_comment = apc_pmemcpy(src->doc_comment, src->doc_comment_len+1, pool)));
++        CHECK((dst->doc_comment = apc_pmemcpy(src->doc_comment, (src->doc_comment_len + 1), pool TSRMLS_CC)));
 +    }
 +#endif
 +
@@ -3713,12 +3922,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_copy_property_info_for_execution */
-+static zend_property_info* my_copy_property_info_for_execution(zend_property_info* dst, zend_property_info* src, apc_context_t* ctxt)
++static zend_property_info* my_copy_property_info_for_execution(zend_property_info* dst, zend_property_info* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    assert(src != NULL);
 +
 +    if (!dst) {
-+        CHECK(dst = (zend_property_info*) apc_pool_alloc(ctxt->pool, (sizeof(*src))));
++        CHECK(dst = (zend_property_info*) apc_pool_alloc(ctxt->pool, sizeof(*src)));
 +    }
 +
 +    /* We need only a shallow copy */
@@ -3729,20 +3938,20 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_copy_arg_info_array */
-+static zend_arg_info* my_copy_arg_info_array(zend_arg_info* dst, const zend_arg_info* src, uint num_args, apc_context_t* ctxt)
++static zend_arg_info* my_copy_arg_info_array(zend_arg_info* dst, const zend_arg_info* src, uint num_args, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    uint i = 0;
 +
 +
 +    if (!dst) {
-+        CHECK(dst = (zend_arg_info*) apc_pool_alloc(ctxt->pool, sizeof(*src)*num_args));
++        CHECK(dst = (zend_arg_info*) apc_pool_alloc(ctxt->pool, (sizeof(*src) * num_args)));
 +    }
 +
 +    /* Start with a bitwise copy */
 +    memcpy(dst, src, sizeof(*src)*num_args);
 +
 +    for(i=0; i < num_args; i++) {
-+        CHECK((my_copy_arg_info( &dst[i], &src[i], ctxt)));
++        CHECK((my_copy_arg_info( &dst[i], &src[i], ctxt TSRMLS_CC)));
 +    }
 +
 +    return dst;
@@ -3750,7 +3959,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_copy_arg_info */
-+static zend_arg_info* my_copy_arg_info(zend_arg_info* dst, const zend_arg_info* src, apc_context_t* ctxt)
++static zend_arg_info* my_copy_arg_info(zend_arg_info* dst, const zend_arg_info* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    apc_pool* pool = ctxt->pool;
 +
@@ -3767,11 +3976,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    dst->class_name = NULL;
 +
 +    if (src->name) {
-+        CHECK((dst->name = apc_pmemcpy(src->name, src->name_len+1, pool)));
++        CHECK((dst->name = apc_string_pmemcpy((char *) src->name, src->name_len+1, pool TSRMLS_CC)));
 +    }
 +
 +    if (src->class_name) {
-+        CHECK((dst->class_name = apc_pmemcpy(src->class_name, src->class_name_len+1, pool)));
++        CHECK((dst->class_name = apc_string_pmemcpy((char *) src->class_name, src->class_name_len+1, pool TSRMLS_CC)));
 +    }
 +
 +    return dst;
@@ -3779,15 +3988,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ apc_copy_class_entry */
-+zend_class_entry* apc_copy_class_entry(zend_class_entry* dst, zend_class_entry* src, apc_context_t* ctxt)
++zend_class_entry* apc_copy_class_entry(zend_class_entry* dst, zend_class_entry* src, apc_context_t* ctxt TSRMLS_DC)
 +{
-+    return my_copy_class_entry(dst, src, ctxt);
++    return my_copy_class_entry(dst, src, ctxt TSRMLS_CC);
 +}
 +
 +/* {{{ my_copy_class_entry */
-+static zend_class_entry* my_copy_class_entry(zend_class_entry* dst, zend_class_entry* src, apc_context_t* ctxt)
++static zend_class_entry* my_copy_class_entry(zend_class_entry* dst, zend_class_entry* src, apc_context_t* ctxt TSRMLS_DC)
 +{
-+    uint i = 0;
++    int i = 0;
 +    apc_pool* pool = ctxt->pool;
 +
 +    assert(src != NULL);
@@ -3800,22 +4009,18 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    memcpy(dst, src, sizeof(*src));
 +
 +    dst->name = NULL;
-+    dst->builtin_functions = NULL;
 +    memset(&dst->function_table, 0, sizeof(dst->function_table));
-+    memset(&dst->default_properties, 0, sizeof(dst->default_properties));
-+    dst->static_members = NULL;
-+    dst->doc_comment = NULL;
-+    dst->filename = NULL;
++    ZEND_CE_DOC_COMMENT(dst) = NULL;
++    ZEND_CE_FILENAME(dst) = NULL;
 +    memset(&dst->properties_info, 0, sizeof(dst->properties_info));
 +    memset(&dst->constants_table, 0, sizeof(dst->constants_table));
-+    memset(&dst->default_static_members, 0, sizeof(dst->default_static_members));
 +
 +    if (src->name) {
-+        CHECK((dst->name = apc_pstrdup(src->name, pool)));
++        CHECK((dst->name = apc_pstrdup(src->name, pool TSRMLS_CC)));
 +    }
 +
 +    if(!(my_copy_hashtable_ex(&dst->function_table,
-+                            &src->function_table,
++                            &src->function_table TSRMLS_CC,
 +                            (ht_copy_fun_t) my_copy_function,
 +                            0,
 +                            ctxt,
@@ -3830,7 +4035,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    /* the current count includes inherited interfaces as well,
 +       the real dynamic ones are the first <n> which are zero'd
 +       out in zend_do_end_class_declaration */
-+    for(i = 0 ; i < src->num_interfaces ; i++) {
++    for(i = 0 ; (uint)i < src->num_interfaces ; i++) {
 +        if(src->interfaces[i])
 +        {
 +            dst->num_interfaces = i;
@@ -3863,16 +4068,33 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +
 +    my_fixup_hashtable(&dst->function_table, (ht_fixup_fun_t)my_fixup_function, src, dst);
 +
++#ifdef ZEND_ENGINE_2_4
++      dst->default_properties_count = src->default_properties_count;
++    if (src->default_properties_count) {
++        CHECK(dst->default_properties_table = (zval**) apc_pool_alloc(pool, (sizeof(zval*) * src->default_properties_count)));
++        for (i = 0; i < src->default_properties_count; i++) {
++            if (src->default_properties_table[i]) {
++                my_copy_zval_ptr(&dst->default_properties_table[i], (const zval**)&src->default_properties_table[i], ctxt TSRMLS_CC);
++            } else {
++                dst->default_properties_table[i] = NULL;
++            }
++        }
++    } else {
++        dst->default_properties_table = NULL;
++    }
++#else
++    memset(&dst->default_properties, 0, sizeof(dst->default_properties));
 +    CHECK((my_copy_hashtable_ex(&dst->default_properties,
-+                            &src->default_properties,
++                            &src->default_properties TSRMLS_CC,
 +                            (ht_copy_fun_t) my_copy_zval_ptr,
 +                            1,
 +                            ctxt,
 +                            (ht_check_copy_fun_t) my_check_copy_default_property,
 +                            src)));
++#endif
 +
 +    CHECK((my_copy_hashtable_ex(&dst->properties_info,
-+                            &src->properties_info,
++                            &src->properties_info TSRMLS_CC,
 +                            (ht_copy_fun_t) my_copy_property_info,
 +                            0,
 +                            ctxt,
@@ -3884,8 +4106,27 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    my_fixup_hashtable(&dst->properties_info, (ht_fixup_fun_t)my_fixup_property_info_for_execution, src, dst);
 +#endif
 +
++#ifdef ZEND_ENGINE_2_4
++    dst->default_static_members_count = src->default_static_members_count;
++
++    if (src->default_static_members_count) {
++        CHECK(dst->default_static_members_table = (zval**) apc_pool_alloc(pool, (sizeof(zval*) * src->default_static_members_count)));
++        for (i = 0; i < src->default_static_members_count; i++) {
++            if (src->default_static_members_table[i]) {
++                my_copy_zval_ptr(&dst->default_static_members_table[i], (const zval**)&src->default_static_members_table[i], ctxt TSRMLS_CC);
++            } else {
++                dst->default_static_members_table[i] = NULL;
++            }
++        }
++    } else {
++        dst->default_static_members_table = NULL;
++    }
++    dst->static_members_table = dst->default_static_members_table;
++#else
++    memset(&dst->default_static_members, 0, sizeof(dst->default_static_members));
++    dst->static_members = NULL;
 +    CHECK(my_copy_hashtable_ex(&dst->default_static_members,
-+                            &src->default_static_members,
++                            &src->default_static_members TSRMLS_CC,
 +                            (ht_copy_fun_t) my_copy_zval_ptr,
 +                            1,
 +                            ctxt,
@@ -3896,7 +4137,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    if(src->static_members != &src->default_static_members)
 +    {
 +        CHECK((dst->static_members = my_copy_hashtable_ex(NULL,
-+                            src->static_members,
++                            src->static_members TSRMLS_CC,
 +                            (ht_copy_fun_t) my_copy_zval_ptr,
 +                            1,
 +                            ctxt,
@@ -3908,45 +4149,48 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    {
 +        dst->static_members = &dst->default_static_members;
 +    }
++#endif
 +
-+    CHECK((my_copy_hashtable(&dst->constants_table,
-+                            &src->constants_table,
++    CHECK((my_copy_hashtable_ex(&dst->constants_table,
++                            &src->constants_table TSRMLS_CC,
 +                            (ht_copy_fun_t) my_copy_zval_ptr,
 +                            1,
-+                            ctxt)));
++                            ctxt,
++                            (ht_check_copy_fun_t) my_check_copy_constant,
++                            src)));
 +
-+    if (src->doc_comment) {
-+        CHECK(dst->doc_comment =
-+                    apc_pmemcpy(src->doc_comment, src->doc_comment_len+1, pool));
++    if (src->type == ZEND_USER_CLASS && ZEND_CE_DOC_COMMENT(src)) {
++        CHECK(ZEND_CE_DOC_COMMENT(dst) =
++                    apc_pmemcpy(ZEND_CE_DOC_COMMENT(src), (ZEND_CE_DOC_COMMENT_LEN(src) + 1), pool TSRMLS_CC));
 +    }
 +
-+    if (src->builtin_functions) {
++    if (src->type == ZEND_INTERNAL_CLASS && ZEND_CE_BUILTIN_FUNCTIONS(src)) {
 +        int i, n;
 +
-+        for (n = 0; src->type == ZEND_INTERNAL_CLASS && src->builtin_functions[n].fname != NULL; n++) {}
++        for (n = 0; src->type == ZEND_INTERNAL_CLASS && ZEND_CE_BUILTIN_FUNCTIONS(src)[n].fname != NULL; n++) {}
 +
-+        CHECK((dst->builtin_functions =
-+                (zend_function_entry*) apc_pool_alloc(pool, (n + 1) * sizeof(zend_function_entry))));
++        CHECK((ZEND_CE_BUILTIN_FUNCTIONS(dst) =
++                (zend_function_entry*) apc_pool_alloc(pool, ((n + 1) * sizeof(zend_function_entry)))));
 +
 +        for (i = 0; i < n; i++) {
-+            CHECK(my_copy_function_entry((zend_function_entry*)(&dst->builtin_functions[i]),
-+                                   &src->builtin_functions[i],
-+                                   ctxt));
++            CHECK(my_copy_function_entry((zend_function_entry*)(&ZEND_CE_BUILTIN_FUNCTIONS(dst)[i]),
++                                   &ZEND_CE_BUILTIN_FUNCTIONS(src)[i],
++                                   ctxt TSRMLS_CC));
 +        }
-+        *(char**)&(dst->builtin_functions[n].fname) = NULL;
++        *(char**)&(ZEND_CE_BUILTIN_FUNCTIONS(dst)[n].fname) = NULL;
 +    }
 +
-+    if (src->filename) {
-+        CHECK((dst->filename = apc_pstrdup(src->filename, pool)));
++    if (src->type == ZEND_USER_CLASS && ZEND_CE_FILENAME(src)) {
++        CHECK((ZEND_CE_FILENAME(dst) = apc_pstrdup(ZEND_CE_FILENAME(src), pool TSRMLS_CC)));
 +    }
 +
 +    return dst;
 +}
 +/* }}} */
 +
-+/* {{{ my_copy_hashtable */
++/* {{{ my_copy_hashtable_ex */
 +static HashTable* my_copy_hashtable_ex(HashTable* dst,
-+                                    HashTable* src,
++                                    HashTable* src TSRMLS_DC,
 +                                    ht_copy_fun_t copy_fn,
 +                                    int holds_ptrs,
 +                                    apc_context_t* ctxt,
@@ -3968,7 +4212,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    memcpy(dst, src, sizeof(src[0]));
 +
 +    /* allocate buckets for the new hashtable */
-+    CHECK((dst->arBuckets = apc_pool_alloc(pool, dst->nTableSize * sizeof(Bucket*))));
++    CHECK((dst->arBuckets = apc_pool_alloc(pool, (dst->nTableSize * sizeof(Bucket*)))));
 +
 +    memset(dst->arBuckets, 0, dst->nTableSize * sizeof(Bucket*));
 +    dst->pInternalPointer = NULL;
@@ -3986,6 +4230,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +             */
 +            if(!check_fn(curr, args)) {
 +                dst->nNumOfElements--;
++                va_end(args);
 +                continue;
 +            }
 +
@@ -3993,9 +4238,31 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +        }
 +
 +        /* create a copy of the bucket 'curr' */
++#ifdef ZEND_ENGINE_2_4
++        if (!curr->nKeyLength) {
++            CHECK((newp = (Bucket*) apc_pmemcpy(curr, sizeof(Bucket), pool TSRMLS_CC)));
++        } else if (IS_INTERNED(curr->arKey)) {
++            CHECK((newp = (Bucket*) apc_pmemcpy(curr, sizeof(Bucket), pool TSRMLS_CC)));
++        } else if (pool->type != APC_UNPOOL) {
++            char *arKey;
++
++            arKey = apc_new_interned_string(curr->arKey, curr->nKeyLength TSRMLS_CC);
++            if (!arKey) {
++                CHECK((newp = (Bucket*) apc_pmemcpy(curr, (sizeof(Bucket) + curr->nKeyLength), pool TSRMLS_CC)));
++                newp->arKey = ((char*)newp) + sizeof(Bucket);
++            } else {
++                CHECK((newp = (Bucket*) apc_pmemcpy(curr, sizeof(Bucket), pool TSRMLS_CC)));
++                newp->arKey = arKey;
++            }
++        } else {
++            CHECK((newp = (Bucket*) apc_pmemcpy(curr, (sizeof(Bucket) + curr->nKeyLength), pool TSRMLS_CC)));
++            newp->arKey = ((char*)newp) + sizeof(Bucket);
++        }        
++#else
 +        CHECK((newp = (Bucket*) apc_pmemcpy(curr,
-+                                  sizeof(Bucket) + curr->nKeyLength - 1,
-+                                  pool)));
++                                  (sizeof(Bucket) + curr->nKeyLength - 1),
++                                  pool TSRMLS_CC)));
++#endif
 +
 +        /* insert 'newp' into the linked list at its hashed index */
 +        if (dst->arBuckets[n]) {
@@ -4010,7 +4277,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +        dst->arBuckets[n] = newp;
 +
 +        /* copy the bucket data using our 'copy_fn' callback function */
-+        CHECK((newp->pData = copy_fn(NULL, curr->pData, ctxt)));
++        CHECK((newp->pData = copy_fn(NULL, curr->pData, ctxt TSRMLS_CC)));
 +
 +        if (holds_ptrs) {
 +            memcpy(&newp->pDataPtr, newp->pData, sizeof(void*));
@@ -4042,7 +4309,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ my_copy_static_variables */
-+static HashTable* my_copy_static_variables(zend_op_array* src, apc_context_t* ctxt)
++static HashTable* my_copy_static_variables(zend_op_array* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    if (src->static_variables == NULL) {
 +        return NULL;
@@ -4057,7 +4324,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ apc_copy_zval */
-+zval* apc_copy_zval(zval* dst, const zval* src, apc_context_t* ctxt)
++zval* apc_copy_zval(zval* dst, const zval* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    apc_pool* pool = ctxt->pool;
 +    int usegc = (ctxt->copy == APC_COPY_OUT_OPCODE) || (ctxt->copy == APC_COPY_OUT_USER);
@@ -4073,7 +4340,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +        }
 +    }
 +
-+    CHECK(dst = my_copy_zval(dst, src, ctxt));
++    CHECK(dst = my_copy_zval(dst, src, ctxt TSRMLS_CC));
 +    return dst;
 +}
 +/* }}} */
@@ -4087,9 +4354,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +        zend_op *zo = &(dst->opcodes[i]);
 +        /*convert opline number to jump address*/
 +        switch (zo->opcode) {
++#ifdef ZEND_ENGINE_2_3
++            case ZEND_GOTO:
++#endif
 +            case ZEND_JMP:
 +                /*Note: if src->opcodes != dst->opcodes then we need to the opline according to src*/
++#ifdef ZEND_ENGINE_2_4
++                zo->op1.jmp_addr = dst->opcodes + (zo->op1.jmp_addr - src->opcodes);
++#else
 +                zo->op1.u.jmp_addr = dst->opcodes + (zo->op1.u.jmp_addr - src->opcodes);
++#endif
 +                break;
 +            case ZEND_JMPZ:
 +            case ZEND_JMPNZ:
@@ -4098,7 +4372,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +#ifdef ZEND_ENGINE_2_3
 +            case ZEND_JMP_SET:
 +#endif
++#ifdef ZEND_ENGINE_2_4
++                zo->op2.jmp_addr = dst->opcodes + (zo->op2.jmp_addr - src->opcodes);
++#else
 +                zo->op2.u.jmp_addr = dst->opcodes + (zo->op2.u.jmp_addr - src->opcodes);
++#endif
 +                break;
 +            default:
 +                break;
@@ -4111,7 +4389,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +zend_op_array* apc_copy_op_array(zend_op_array* dst, zend_op_array* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    int i;
-+    apc_fileinfo_t fileinfo;
++    apc_fileinfo_t *fileinfo = NULL;
 +    char canon_path[MAXPATHLEN];
 +    char *fullpath = NULL;
 +    apc_opflags_t * flags = NULL;
@@ -4148,35 +4426,54 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +        CHECK(dst->arg_info = my_copy_arg_info_array(NULL,
 +                                                src->arg_info,
 +                                                src->num_args,
-+                                                ctxt));
++                                                ctxt TSRMLS_CC));
 +    }
 +
 +    if (src->function_name) {
-+        CHECK(dst->function_name = apc_pstrdup(src->function_name, pool));
++        CHECK(dst->function_name = apc_pstrdup(src->function_name, pool TSRMLS_CC));
 +    }
 +    if (src->filename) {
-+        CHECK(dst->filename = apc_pstrdup(src->filename, pool));
++        CHECK(dst->filename = apc_pstrdup(src->filename, pool TSRMLS_CC));
 +    }
 +
 +    CHECK(dst->refcount = apc_pmemcpy(src->refcount,
 +                                      sizeof(src->refcount[0]),
-+                                      pool));
++                                      pool TSRMLS_CC));
++
++#ifdef ZEND_ENGINE_2_4
++    if (src->literals) {
++        zend_literal *p, *q, *end;
++
++        q = src->literals;
++        p = dst->literals = (zend_literal*) apc_pool_alloc(pool, (sizeof(zend_literal) * src->last_literal));
++        end = p + src->last_literal;
++        while (p < end) {
++            *p = *q;
++            my_copy_zval(&p->constant, &q->constant, ctxt TSRMLS_CC);
++            p++;
++            q++;
++        }
++    }
++#endif
 +
 +    /* deep-copy the opcodes */
-+    CHECK(dst->opcodes = (zend_op*) apc_pool_alloc(pool, sizeof(zend_op) * src->last));
++    CHECK(dst->opcodes = (zend_op*) apc_pool_alloc(pool, (sizeof(zend_op) * src->last)));
 +
 +    if(apc_reserved_offset != -1) {
 +        /* Insanity alert: the void* pointer is cast into an apc_opflags_t 
 +         * struct. apc_zend_init() checks to ensure that it fits in a void* */
 +        flags = (apc_opflags_t*) & (dst->reserved[apc_reserved_offset]);
 +        memset(flags, 0, sizeof(apc_opflags_t));
-+        /* assert(sizeof(apc_opflags_t) < sizeof(dst->reserved)); */
++        /* assert(sizeof(apc_opflags_t) <= sizeof(dst->reserved)); */
 +    }
 +
 +    for (i = 0; (uint) i < src->last; i++) {
 +        zend_op *zo = &(src->opcodes[i]);
 +        /* a lot of files are merely constant arrays with no jumps */
 +        switch (zo->opcode) {
++#ifdef ZEND_ENGINE_2_3
++            case ZEND_GOTO:
++#endif
 +            case ZEND_JMP:
 +            case ZEND_JMPZ:
 +            case ZEND_JMPNZ:
@@ -4194,17 +4491,29 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +            case ZEND_FETCH_W:
 +            case ZEND_FETCH_IS:
 +            case ZEND_FETCH_FUNC_ARG:
++            case ZEND_FETCH_RW:
++            case ZEND_FETCH_UNSET:
 +                if(PG(auto_globals_jit) && flags != NULL)
 +                {
 +                     /* The fetch is only required if auto_globals_jit=1  */
++#ifdef ZEND_ENGINE_2_4
++                    if((zo->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_GLOBAL &&
++                            zo->op1_type == IS_CONST && 
++                            Z_TYPE_P(zo->op1.zv) == IS_STRING) {
++                        if (Z_STRVAL_P(zo->op1.zv)[0] == '_') {
++# define SET_IF_AUTOGLOBAL(member) \
++    if(!strcmp(Z_STRVAL_P(zo->op1.zv), #member)) \
++        flags->member = 1 /* no ';' here */
++#else
 +                    if(zo->op2.u.EA.type == ZEND_FETCH_GLOBAL &&
 +                            zo->op1.op_type == IS_CONST && 
 +                            zo->op1.u.constant.type == IS_STRING) {
 +                        znode * varname = &zo->op1;
 +                        if (varname->u.constant.value.str.val[0] == '_') {
-+#define SET_IF_AUTOGLOBAL(member) \
++# define SET_IF_AUTOGLOBAL(member) \
 +    if(!strcmp(varname->u.constant.value.str.val, #member)) \
 +        flags->member = 1 /* no ';' here */
++#endif
 +                            SET_IF_AUTOGLOBAL(_GET);
 +                            else SET_IF_AUTOGLOBAL(_POST);
 +                            else SET_IF_AUTOGLOBAL(_COOKIE);
@@ -4212,30 +4521,54 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +                            else SET_IF_AUTOGLOBAL(_ENV);
 +                            else SET_IF_AUTOGLOBAL(_FILES);
 +                            else SET_IF_AUTOGLOBAL(_REQUEST);
++                            else SET_IF_AUTOGLOBAL(_SESSION);
++#ifdef ZEND_ENGINE_2_4
++                            else if(zend_is_auto_global(
++                                            Z_STRVAL_P(zo->op1.zv),
++                                            Z_STRLEN_P(zo->op1.zv)
++                                            TSRMLS_CC))
++#else
 +                            else if(zend_is_auto_global(
 +                                            varname->u.constant.value.str.val,
 +                                            varname->u.constant.value.str.len
 +                                            TSRMLS_CC))
++#endif
 +                            {
 +                                flags->unknown_global = 1;
 +                            }
++#ifdef ZEND_ENGINE_2_4
++                        } else SET_IF_AUTOGLOBAL(GLOBALS);
++#else
 +                        }
++#endif
 +                    }
 +                }
 +                break;
 +            case ZEND_RECV_INIT:
++#ifdef ZEND_ENGINE_2_4
++                if(zo->op2_type == IS_CONST &&
++                    Z_TYPE_P(zo->op2.zv) == IS_CONSTANT_ARRAY) {
++#else
 +                if(zo->op2.op_type == IS_CONST &&
 +                    zo->op2.u.constant.type == IS_CONSTANT_ARRAY) {
++#endif
 +                    if(flags != NULL) {
 +                        flags->deep_copy = 1;
 +                    }
 +                }
 +                break;
 +            default:
++#ifdef ZEND_ENGINE_2_4
++                if((zo->op1_type == IS_CONST &&
++                    Z_TYPE_P(zo->op1.zv) == IS_CONSTANT_ARRAY) ||
++                    (zo->op2_type == IS_CONST &&
++                        Z_TYPE_P(zo->op2.zv) == IS_CONSTANT_ARRAY)) {
++#else
 +                if((zo->op1.op_type == IS_CONST &&
 +                    zo->op1.u.constant.type == IS_CONSTANT_ARRAY) ||
 +                    (zo->op2.op_type == IS_CONST &&
 +                        zo->op2.u.constant.type == IS_CONSTANT_ARRAY)) {
++#endif
 +                    if(flags != NULL) {
 +                        flags->deep_copy = 1;
 +                    }
@@ -4243,26 +4576,58 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +                break;
 +        }
 +
-+        if(!(my_copy_zend_op(dst->opcodes+i, src->opcodes+i, ctxt))) {
++        if(!(my_copy_zend_op(dst->opcodes+i, src->opcodes+i, ctxt TSRMLS_CC))) {
 +            return NULL;
 +        }
 +
-+/* This code breaks apc's rule#1 - cache what you compile */
++#ifdef ZEND_ENGINE_2_4
++        if (zo->op1_type == IS_CONST) {
++            dst->opcodes[i].op1.literal = src->opcodes[i].op1.literal - src->literals + dst->literals;
++        }
++        if (zo->op2_type == IS_CONST) {
++            dst->opcodes[i].op2.literal = src->opcodes[i].op2.literal - src->literals + dst->literals;
++        }
++        if (zo->result_type == IS_CONST) {
++            dst->opcodes[i].result.literal = src->opcodes[i].result.literal - src->literals + dst->literals;
++        }
++#endif
++
++        /* This code breaks apc's rule#1 - cache what you compile */
 +        if((APCG(fpstat)==0) && APCG(canonicalize)) {
++            /* not pool allocated, because the pool allocations eat up shm space */
++            fileinfo = (apc_fileinfo_t*) apc_php_malloc(sizeof(apc_fileinfo_t) TSRMLS_CC);
++#ifdef ZEND_ENGINE_2_4
++            if((zo->opcode == ZEND_INCLUDE_OR_EVAL) && 
++                (zo->op1_type == IS_CONST && Z_TYPE_P(zo->op1.zv) == IS_STRING)) {
++                /* constant includes */
++                if(!IS_ABSOLUTE_PATH(Z_STRVAL_P(zo->op1.zv),Z_STRLEN_P(zo->op1.zv))) { 
++                    if (apc_search_paths(Z_STRVAL_P(zo->op1.zv), PG(include_path), fileinfo TSRMLS_CC) == 0) {
++#else
 +            if((zo->opcode == ZEND_INCLUDE_OR_EVAL) && 
 +                (zo->op1.op_type == IS_CONST && zo->op1.u.constant.type == IS_STRING)) {
 +                /* constant includes */
 +                if(!IS_ABSOLUTE_PATH(Z_STRVAL_P(&zo->op1.u.constant),Z_STRLEN_P(&zo->op1.u.constant))) { 
-+                    if (apc_search_paths(Z_STRVAL_P(&zo->op1.u.constant), PG(include_path), &fileinfo) == 0) {
-+                        if((fullpath = realpath(fileinfo.fullpath, canon_path))) {
++                    if (apc_search_paths(Z_STRVAL_P(&zo->op1.u.constant), PG(include_path), fileinfo TSRMLS_CC) == 0) {
++#endif
++                        if((fullpath = realpath(fileinfo->fullpath, canon_path))) {
 +                            /* everything has to go through a realpath() */
 +                            zend_op *dzo = &(dst->opcodes[i]);
++#ifdef ZEND_ENGINE_2_4
++                            dzo->op1.literal = (zend_literal*) apc_pool_alloc(pool, sizeof(zend_literal));
++                            Z_STRLEN_P(dzo->op1.zv) = strlen(fullpath);
++                            Z_STRVAL_P(dzo->op1.zv) = apc_pstrdup(fullpath, pool TSRMLS_CC);
++                            Z_SET_REFCOUNT_P(dzo->op1.zv, 2);
++                            Z_SET_ISREF_P(dzo->op1.zv);
++                            dzo->op1.literal->hash_value = zend_hash_func(Z_STRVAL_P(dzo->op1.zv), Z_STRLEN_P(dzo->op1.zv)+1);
++#else
 +                            dzo->op1.u.constant.value.str.len = strlen(fullpath);
-+                            dzo->op1.u.constant.value.str.val = apc_pstrdup(fullpath, pool);
++                            dzo->op1.u.constant.value.str.val = apc_pstrdup(fullpath, pool TSRMLS_CC);
++#endif
 +                        }
 +                    }
 +                }
 +            }
++            apc_php_free(fileinfo TSRMLS_CC);
 +        }
 +    }
 +
@@ -4274,39 +4639,39 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    if (src->brk_cont_array) {
 +        CHECK(dst->brk_cont_array = apc_pmemcpy(src->brk_cont_array,
 +                                    sizeof(src->brk_cont_array[0]) * src->last_brk_cont,
-+                                    pool));
++                                    pool TSRMLS_CC));
 +    }
 +
 +    /* copy the table of static variables */
 +    if (src->static_variables) {
-+        CHECK(dst->static_variables = my_copy_static_variables(src, ctxt));
++        CHECK(dst->static_variables = my_copy_static_variables(src, ctxt TSRMLS_CC));
 +    }
 +
 +    if (src->try_catch_array) {
 +        CHECK(dst->try_catch_array = apc_pmemcpy(src->try_catch_array,
 +                                        sizeof(src->try_catch_array[0]) * src->last_try_catch,
-+                                        pool));
++                                        pool TSRMLS_CC));
 +    }
 +
 +#ifdef ZEND_ENGINE_2_1 /* PHP 5.1 */
 +    if (src->vars) {
 +        CHECK(dst->vars = apc_pmemcpy(src->vars,
 +                            sizeof(src->vars[0]) * src->last_var,
-+                            pool));
++                            pool TSRMLS_CC));
 +
 +        for(i = 0; i <  src->last_var; i++) dst->vars[i].name = NULL;
 +
 +        for(i = 0; i <  src->last_var; i++) {
-+            CHECK(dst->vars[i].name = apc_pmemcpy(src->vars[i].name,
++            CHECK(dst->vars[i].name = apc_string_pmemcpy(src->vars[i].name,
 +                                src->vars[i].name_len + 1,
-+                                pool));
++                                pool TSRMLS_CC));
 +        }
 +    }
 +#endif
 +
 +    if (src->doc_comment) {
 +        CHECK(dst->doc_comment
-+                = apc_pmemcpy(src->doc_comment, src->doc_comment_len+1, pool));
++                = apc_pmemcpy(src->doc_comment, (src->doc_comment_len + 1), pool TSRMLS_CC));
 +    }
 +
 +    return dst;
@@ -4327,7 +4692,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +
 +    CHECK(array =
 +        (apc_function_t*)
-+            apc_pool_alloc(pool, sizeof(apc_function_t) * (new_count+1)));
++            apc_pool_alloc(pool, (sizeof(apc_function_t) * (new_count + 1))));
 +
 +    if (new_count == 0) {
 +        array[0].function = NULL;
@@ -4355,9 +4720,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +
 +        zend_hash_get_current_data(CG(function_table), (void**) &fun);
 +
-+        CHECK(array[i].name = apc_pmemcpy(key, (int) key_size, pool));
++        CHECK(array[i].name = apc_pmemcpy(key, (int) key_size, pool TSRMLS_CC));
 +        array[i].name_len = (int) key_size-1;
-+        CHECK(array[i].function = my_copy_function(NULL, fun, ctxt));
++        CHECK(array[i].function = my_copy_function(NULL, fun, ctxt TSRMLS_CC));
 +        zend_hash_move_forward(CG(function_table));
 +    }
 +
@@ -4379,7 +4744,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +
 +    CHECK(array =
 +        (apc_class_t*)
-+            apc_pool_alloc(pool, sizeof(apc_class_t)*(new_count+1)));
++            apc_pool_alloc(pool, (sizeof(apc_class_t) * (new_count + 1))));
 +
 +    if (new_count == 0) {
 +        array[0].class_entry = NULL;
@@ -4412,9 +4777,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +
 +        elem = *((zend_class_entry**)elem);
 +
-+        CHECK(array[i].name = apc_pmemcpy(key, (int) key_size, pool));
++        CHECK(array[i].name = apc_pmemcpy(key, (int) key_size, pool TSRMLS_CC));
 +        array[i].name_len = (int) key_size-1;
-+        CHECK(array[i].class_entry = my_copy_class_entry(NULL, elem, ctxt));
++        CHECK(array[i].class_entry = my_copy_class_entry(NULL, elem, ctxt TSRMLS_CC));
 +
 +        /*
 +         * If the class has a pointer to its parent class, save the parent
@@ -4425,7 +4790,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +         */
 +
 +        if (elem->parent) {
-+            CHECK(array[i].parent_name = apc_pstrdup(elem->parent->name, pool));
++            CHECK(array[i].parent_name = apc_pstrdup(elem->parent->name, pool TSRMLS_CC));
 +        }
 +        else {
 +            array[i].parent_name = NULL;
@@ -4440,7 +4805,19 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* Used only by my_prepare_op_array_for_execution */
-+#define APC_PREPARE_FETCH_GLOBAL_FOR_EXECUTION()                                                \
++#ifdef ZEND_ENGINE_2_4
++# define APC_PREPARE_FETCH_GLOBAL_FOR_EXECUTION()                                               \
++                         /* The fetch is only required if auto_globals_jit=1  */                \
++                        if((zo->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_GLOBAL &&    \
++                            zo->op1_type == IS_CONST &&                                         \
++                            Z_TYPE_P(zo->op1.zv) == IS_STRING &&                                \
++                            Z_STRVAL_P(zo->op1.zv)[0] == '_') {                                 \
++                            (void)zend_is_auto_global(Z_STRVAL_P(zo->op1.zv),                   \
++                                                      Z_STRLEN_P(zo->op1.zv)                    \
++                                                      TSRMLS_CC);                               \
++                        }
++#else
++# define APC_PREPARE_FETCH_GLOBAL_FOR_EXECUTION()                                               \
 +                         /* The fetch is only required if auto_globals_jit=1  */                \
 +                        if(zo->op2.u.EA.type == ZEND_FETCH_GLOBAL &&                            \
 +                            zo->op1.op_type == IS_CONST &&                                      \
@@ -4451,7 +4828,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +                            (void)zend_is_auto_global(varname->u.constant.value.str.val,        \
 +                                                          varname->u.constant.value.str.len     \
 +                                                          TSRMLS_CC);                           \
-+                        }                                                                       \
++                        }
++#endif
 +
 +/* {{{ my_prepare_op_array_for_execution */
 +static int my_prepare_op_array_for_execution(zend_op_array* dst, zend_op_array* src, apc_context_t* ctxt TSRMLS_DC) 
@@ -4485,30 +4863,73 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    FETCH_AUTOGLOBAL(_ENV);
 +    FETCH_AUTOGLOBAL(_FILES);
 +    FETCH_AUTOGLOBAL(_REQUEST);
++    FETCH_AUTOGLOBAL(_SESSION);
++#ifdef ZEND_ENGINE_2_4
++    FETCH_AUTOGLOBAL(GLOBALS);
++#endif
 +
 +    if(needcopy) {
 +
++#ifdef ZEND_ENGINE_2_4
++        if (src->literals) {
++            zend_literal *p, *q, *end;
++
++            q = src->literals;
++            p = dst->literals = (zend_literal*) apc_xmemcpy(src->literals,
++                                        sizeof(zend_literal) * src->last_literal,
++                                        apc_php_malloc TSRMLS_CC);
++            end = p + src->last_literal;
++            while (p < end) {
++                if (Z_TYPE(q->constant) == IS_CONSTANT_ARRAY) {
++                    my_copy_zval(&p->constant, &q->constant, ctxt TSRMLS_CC);
++                }
++                p++;
++                q++;
++            }
++        }
++#endif
++
 +        dst->opcodes = (zend_op*) apc_xmemcpy(src->opcodes,
 +                                    sizeof(zend_op) * src->last,
-+                                    apc_php_malloc);
++                                    apc_php_malloc TSRMLS_CC);
 +        zo = src->opcodes;
 +        dzo = dst->opcodes;
 +        while(i > 0) {
 +
++#ifdef ZEND_ENGINE_2_4
++            if(zo->op1_type == IS_CONST) {
++               dzo->op1.literal = zo->op1.literal - src->literals + dst->literals;
++            }
++            if(zo->op2_type == IS_CONST) {
++               dzo->op2.literal = zo->op2.literal - src->literals + dst->literals;
++            }
++            if(zo->result_type == IS_CONST) {
++               dzo->result.literal = zo->result.literal - src->literals + dst->literals;
++            }
++#else
 +            if( ((zo->op1.op_type == IS_CONST &&
 +                  zo->op1.u.constant.type == IS_CONSTANT_ARRAY)) ||
 +                ((zo->op2.op_type == IS_CONST &&
 +                  zo->op2.u.constant.type == IS_CONSTANT_ARRAY))) {
 +
-+                if(!(my_copy_zend_op(dzo, zo, ctxt))) {
++                if(!(my_copy_zend_op(dzo, zo, ctxt TSRMLS_CC))) {
 +                    assert(0); /* emalloc failed or a bad constant array */
 +                }
 +            }
++#endif
 +
 +            switch(zo->opcode) {
++#ifdef ZEND_ENGINE_2_3
++                case ZEND_GOTO:
++#endif
 +                case ZEND_JMP:
++#ifdef ZEND_ENGINE_2_4
++                    dzo->op1.jmp_addr = dst->opcodes +
++                                            (zo->op1.jmp_addr - src->opcodes);
++#else
 +                    dzo->op1.u.jmp_addr = dst->opcodes +
 +                                            (zo->op1.u.jmp_addr - src->opcodes);
++#endif
 +                    break;
 +                case ZEND_JMPZ:
 +                case ZEND_JMPNZ:
@@ -4517,8 +4938,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +#ifdef ZEND_ENGINE_2_3
 +                case ZEND_JMP_SET:
 +#endif
++#ifdef ZEND_ENGINE_2_4
++                    dzo->op2.jmp_addr = dst->opcodes +
++                                            (zo->op2.jmp_addr - src->opcodes);
++#else
 +                    dzo->op2.u.jmp_addr = dst->opcodes +
 +                                            (zo->op2.u.jmp_addr - src->opcodes);
++#endif
 +                    break;
 +                case ZEND_FETCH_R:
 +                case ZEND_FETCH_W:
@@ -4567,12 +4993,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +        dst = (zend_op_array*) emalloc(sizeof(src[0]));
 +    }
 +    memcpy(dst, src, sizeof(src[0]));
-+    dst->static_variables = my_copy_static_variables(src, ctxt);
++    dst->static_variables = my_copy_static_variables(src, ctxt TSRMLS_CC);
 +
 +    /* memory leak */
 +    dst->refcount = apc_pmemcpy(src->refcount,
 +                                      sizeof(src->refcount[0]),
-+                                      ctxt->pool);
++                                      ctxt->pool TSRMLS_CC);
 +
 +    my_prepare_op_array_for_execution(dst,src, ctxt TSRMLS_CC);
 +
@@ -4581,10 +5007,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ apc_copy_function_for_execution */
-+zend_function* apc_copy_function_for_execution(zend_function* src, apc_context_t* ctxt)
++zend_function* apc_copy_function_for_execution(zend_function* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    zend_function* dst;
-+    TSRMLS_FETCH();
 +
 +    dst = (zend_function*) emalloc(sizeof(src[0]));
 +    memcpy(dst, src, sizeof(src[0]));
@@ -4594,16 +5019,19 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ apc_copy_function_for_execution_ex */
-+zend_function* apc_copy_function_for_execution_ex(void *dummy, zend_function* src, apc_context_t* ctxt)
++zend_function* apc_copy_function_for_execution_ex(void *dummy, zend_function* src, apc_context_t* ctxt TSRMLS_DC)
 +{
 +    if(src->type==ZEND_INTERNAL_FUNCTION || src->type==ZEND_OVERLOADED_FUNCTION) return src;
-+    return apc_copy_function_for_execution(src, ctxt);
++    return apc_copy_function_for_execution(src, ctxt TSRMLS_CC);
 +}
 +/* }}} */
 +
 +/* {{{ apc_copy_class_entry_for_execution */
-+zend_class_entry* apc_copy_class_entry_for_execution(zend_class_entry* src, apc_context_t* ctxt)
++zend_class_entry* apc_copy_class_entry_for_execution(zend_class_entry* src, apc_context_t* ctxt TSRMLS_DC)
 +{
++#ifdef ZEND_ENGINE_2_4
++    int i;
++#endif
 +    zend_class_entry* dst = (zend_class_entry*) apc_pool_alloc(ctxt->pool, sizeof(src[0]));
 +    memcpy(dst, src, sizeof(src[0]));
 +
@@ -4611,7 +5039,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    {
 +        /* These are slots to be populated later by ADD_INTERFACE insns */
 +        dst->interfaces = apc_php_malloc(
-+                            sizeof(zend_class_entry*) * src->num_interfaces);
++                            (sizeof(zend_class_entry*) * src->num_interfaces) TSRMLS_CC);
 +        memset(dst->interfaces, 0, 
 +                            sizeof(zend_class_entry*) * src->num_interfaces);
 +    }
@@ -4622,11 +5050,27 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +
 +    /* Deep-copy the class properties, because they will be modified */
 +
++#ifdef ZEND_ENGINE_2_4
++      dst->default_properties_count = src->default_properties_count;
++    if (src->default_properties_count) {
++        dst->default_properties_table = (zval**) apc_php_malloc((sizeof(zval*) * src->default_properties_count) TSRMLS_CC);
++        for (i = 0; i < src->default_properties_count; i++) {
++            if (src->default_properties_table[i]) {
++                my_copy_zval_ptr(&dst->default_properties_table[i], (const zval**)&src->default_properties_table[i], ctxt TSRMLS_CC);
++            } else {
++                dst->default_properties_table[i] = NULL;
++            }
++        }
++    } else {
++        dst->default_properties_table = NULL;
++    }
++#else
 +    my_copy_hashtable(&dst->default_properties,
 +                      &src->default_properties,
 +                      (ht_copy_fun_t) my_copy_zval_ptr,
 +                      1,
 +                      ctxt);
++#endif
 +
 +    /* For derived classes, we must also copy the function hashtable (although
 +     * we can merely bitwise copy the functions it contains) */
@@ -4663,6 +5107,22 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +                      1,
 +                      ctxt);
 +
++#ifdef ZEND_ENGINE_2_4
++      dst->default_static_members_count = src->default_static_members_count;
++    if (src->default_static_members_count) {
++        dst->default_static_members_table = (zval**) apc_php_malloc((sizeof(zval*) * src->default_static_members_count) TSRMLS_CC);
++        for (i = 0; i < src->default_static_members_count; i++) {
++            if (src->default_static_members_table[i]) {
++                my_copy_zval_ptr(&dst->default_static_members_table[i], (const zval**)&src->default_static_members_table[i], ctxt TSRMLS_CC);
++            } else {
++                dst->default_static_members_table[i] = NULL;
++            }
++        }
++    } else {
++        dst->default_static_members_table = NULL;
++    }
++    dst->static_members_table = dst->default_static_members_table;
++#else
 +    my_copy_hashtable(&dst->default_static_members,
 +                      &src->default_static_members,
 +                      (ht_copy_fun_t) my_copy_zval_ptr,
@@ -4681,34 +5141,59 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    {
 +        dst->static_members = &(dst->default_static_members);
 +    }
-+
++#endif
 +
 +    return dst;
 +}
 +/* }}} */
 +
 +/* {{{ apc_free_class_entry_after_execution */
-+void apc_free_class_entry_after_execution(zend_class_entry* src)
++void apc_free_class_entry_after_execution(zend_class_entry* src TSRMLS_DC)
 +{
 +    if(src->num_interfaces > 0 && src->interfaces) {
-+        apc_php_free(src->interfaces);
++        apc_php_free(src->interfaces TSRMLS_CC);
 +        src->interfaces = NULL;
 +        src->num_interfaces = 0;
 +    }
 +    /* my_destroy_hashtable() does not play nice with refcounts */
 +
++#ifdef ZEND_ENGINE_2_4
++    if (src->default_static_members_table) {
++       int i;
++
++       for (i = 0; i < src->default_static_members_count; i++) {
++          zval_ptr_dtor(&src->default_static_members_table[i]);
++       }
++       efree(src->default_static_members_table);
++       src->default_static_members_table = NULL;
++    }
++    src->static_members_table = NULL;
++    if (src->default_properties_table) {
++       int i;
++
++       for (i = 0; i < src->default_properties_count; i++) {
++           if (src->default_properties_table[i]) {
++               zval_ptr_dtor(&src->default_properties_table[i]);
++           }
++       }
++       efree(src->default_properties_table);
++       src->default_properties_table = NULL;
++    }
++#else
 +    zend_hash_clean(&src->default_static_members);
 +    if(src->static_members != &(src->default_static_members))
 +    {
 +        zend_hash_destroy(src->static_members);
-+        apc_php_free(src->static_members);
++        apc_php_free(src->static_members TSRMLS_CC);
 +        src->static_members = NULL;
 +    }
 +    else
 +    {
 +        src->static_members = NULL;
 +    }
++
 +    zend_hash_clean(&src->default_properties);
++#endif
 +    zend_hash_clean(&src->constants_table);
 +
 +    /* TODO: more cleanup */
@@ -4716,14 +5201,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +/* }}} */
 +
 +/* {{{ apc_file_halt_offset */
-+long apc_file_halt_offset(const char *filename)
++long apc_file_halt_offset(const char *filename TSRMLS_DC)
 +{
 +    zend_constant *c;
 +    char *name;
 +    int len;
 +    char haltoff[] = "__COMPILER_HALT_OFFSET__";
 +    long value = -1;
-+    TSRMLS_FETCH();
 +
 +    zend_mangle_property_name(&name, &len, haltoff, sizeof(haltoff) - 1, filename, strlen(filename), 0);
 +    
@@ -4856,6 +5340,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +}
 +/* }}} */
 +
++#ifndef ZEND_ENGINE_2_4
 +/* {{{ my_check_copy_default_property */
 +static int my_check_copy_default_property(Bucket* p, va_list args)
 +{
@@ -4878,7 +5363,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    return 1;
 +}
 +/* }}} */
-+
++#endif
 +
 +/* {{{ my_check_copy_property_info */
 +static int my_check_copy_property_info(Bucket* p, va_list args)
@@ -4915,6 +5400,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +}
 +/* }}} */
 +
++#ifndef ZEND_ENGINE_2_4
 +/* {{{ my_check_copy_static_member */
 +static int my_check_copy_static_member(Bucket* p, va_list args)
 +{
@@ -4950,16 +5436,6 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +        (zend_hash_find(&src->properties_info, member_name,
 +                        strlen(member_name)+1, (void**)&child_info) == SUCCESS))
 +    {
-+        if(child_info->flags & ZEND_ACC_STATIC &&
-+            (parent_info->flags & ZEND_ACC_PROTECTED &&
-+            child_info->flags & ZEND_ACC_PUBLIC))
-+        {
-+            /* Do not copy into static_members. zend_do_inheritance
-+             * will automatically insert a NULL value.
-+             * TODO: decrement refcount or fixup when copying out for exec ?
-+             */ 
-+            return 0;
-+        }
 +        if(ht == &(src->default_static_members))
 +        {
 +            parent_ht = &parent->default_static_members;
@@ -4983,6 +5459,30 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 +    return 1;
 +}
 +/* }}} */
++#endif
++
++/* {{{ my_check_copy_constant */
++static int my_check_copy_constant(Bucket* p, va_list args)
++{
++    zend_class_entry* src = va_arg(args, zend_class_entry*);
++    zend_class_entry* parent = src->parent;
++    zval ** child_const = (zval**)p->pData;
++    zval ** parent_const = NULL;
++
++    if (parent &&
++        zend_hash_quick_find(&parent->constants_table, p->arKey, 
++            p->nKeyLength, p->h, (void **) &parent_const)==SUCCESS) {
++
++        if((parent_const && child_const) && (*parent_const) == (*child_const))
++        {
++            return 0;
++        }
++    }
++
++    /* possibly not in the parent */
++    return 1;
++}
++/* }}} */
 +
 +/* {{{ apc_register_optimizer(apc_optimize_function_t optimizer)
 + *      register a optimizer callback function, returns the previous callback
@@ -5002,15 +5502,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.c php-5.3.1/ext/apc/apc_compile.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_compile.h php-5.3.1/ext/apc/apc_compile.h
---- php-5.3.1.orig/ext/apc/apc_compile.h       1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_compile.h    1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,142 @@
+--- /dev/null
++++ b/ext/apc/apc_compile.h
+@@ -0,0 +1,146 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -5035,7 +5534,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.h php-5.3.1/ext/apc/apc_compile.h
 +
 + */
 +
-+/* $Id: apc_compile.h 275218 2009-02-05 13:16:06Z gopalv $ */
++/* $Id: apc_compile.h 303388 2010-09-15 09:50:28Z dmitry $ */
 +
 +#ifndef APC_COMPILE_H
 +#define APC_COMPILE_H
@@ -5083,6 +5582,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.h php-5.3.1/ext/apc/apc_compile.h
 +    unsigned int _ENV           : 1;
 +    unsigned int _FILES         : 1;
 +    unsigned int _REQUEST       : 1;
++    unsigned int _SESSION       : 1;
++#ifdef ZEND_ENGINE_2_4
++    unsigned int GLOBALS        : 1;
++#endif
 +    unsigned int unknown_global : 1;
 +};
 +/* }}} */
@@ -5092,10 +5595,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.h php-5.3.1/ext/apc/apc_compile.h
 + */
 +
 +extern zend_op_array* apc_copy_op_array(zend_op_array* dst, zend_op_array* src, apc_context_t* ctxt TSRMLS_DC);
-+extern zend_class_entry* apc_copy_class_entry(zend_class_entry* dst, zend_class_entry* src, apc_context_t* ctxt);
++extern zend_class_entry* apc_copy_class_entry(zend_class_entry* dst, zend_class_entry* src, apc_context_t* ctxt TSRMLS_DC);
 +extern apc_function_t* apc_copy_new_functions(int old_count, apc_context_t* ctxt TSRMLS_DC);
 +extern apc_class_t* apc_copy_new_classes(zend_op_array* op_array, int old_count, apc_context_t* ctxt TSRMLS_DC);
-+extern zval* apc_copy_zval(zval* dst, const zval* src, apc_context_t* ctxt);
++extern zval* apc_copy_zval(zval* dst, const zval* src, apc_context_t* ctxt TSRMLS_DC);
 +
 +#if 0
 +/*
@@ -5116,15 +5619,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.h php-5.3.1/ext/apc/apc_compile.h
 + */
 +
 +extern zend_op_array* apc_copy_op_array_for_execution(zend_op_array* dst, zend_op_array* src, apc_context_t* ctxt TSRMLS_DC);
-+extern zend_function* apc_copy_function_for_execution(zend_function* src, apc_context_t* ctxt);
-+extern zend_class_entry* apc_copy_class_entry_for_execution(zend_class_entry* src, apc_context_t* ctxt);
++extern zend_function* apc_copy_function_for_execution(zend_function* src, apc_context_t* ctxt TSRMLS_DC);
++extern zend_class_entry* apc_copy_class_entry_for_execution(zend_class_entry* src, apc_context_t* ctxt TSRMLS_DC);
 +
 +/*
 + * The "free-after-execution" function performs a cursory clean up of the class data
 + * This is required to minimize memory leak warnings and to ensure correct destructor
 + * ordering of some variables.
 + */
-+extern void apc_free_class_entry_after_execution(zend_class_entry* src);
++extern void apc_free_class_entry_after_execution(zend_class_entry* src TSRMLS_DC);
 +
 +/*
 + * Optimization callback definition and registration function. 
@@ -5135,7 +5638,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.h php-5.3.1/ext/apc/apc_compile.h
 +/*
 + * To handle __COMPILER_HALT_OFFSET__
 + */
-+long apc_file_halt_offset(const char* filename);
++long apc_file_halt_offset(const char* filename TSRMLS_DC);
 +void apc_do_halt_compiler_register(const char *filename, long halt_offset TSRMLS_DC);
 +
 +#endif
@@ -5148,15 +5651,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_compile.h php-5.3.1/ext/apc/apc_compile.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_debug.c php-5.3.1/ext/apc/apc_debug.c
---- php-5.3.1.orig/ext/apc/apc_debug.c 1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_debug.c      1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,57 @@
+--- /dev/null
++++ b/ext/apc/apc_debug.c
+@@ -0,0 +1,70 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -5180,14 +5682,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_debug.c php-5.3.1/ext/apc/apc_debug.c
 +   All other licensing and usage conditions are those of the PHP Group.
 +*/
 +
-+/* $Id: apc_debug.c 268255 2008-11-04 05:42:11Z rasmus $ */
++/* $Id: apc_debug.c 304107 2010-10-05 15:14:06Z kalle $ */
 +#include "apc.h"
 +#include <stdio.h>
++#include "zend.h"
 +#include "zend_compile.h"
 +
-+#ifdef __DEBUG_APC__
-+
-+#include <dlfcn.h>
++#if defined(__DEBUG_APC__)
 +
 +/* keep track of vld_dump_oparray() signature */
 +typedef void (*vld_dump_f) (zend_op_array * TSRMLS_DC);
@@ -5196,244 +5697,73 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_debug.c php-5.3.1/ext/apc/apc_debug.c
 +
 +void dump(zend_op_array *op_array TSRMLS_DC)
 +{
-+#ifdef __DEBUG_APC__
-+  vld_dump_f dump_op_array = dlsym(NULL, "vld_dump_oparray");
++#if defined(__DEBUG_APC__)
++  vld_dump_f dump_op_array;
++  DL_HANDLE handle = NULL;
 +
-+  if(dump_op_array)
-+  {
-+  dump_op_array(op_array TSRMLS_CC); 
++#ifdef PHP_WIN32
++  handle = GetModuleHandle(NULL);
++  
++  if (!handle) {
++      apc_warning("unable to fetch current module handle." TSRMLS_CC);
 +  }
-+  else
-+  {
-+  apc_wprint("vld is not installed or something even worse.");
++#endif
++  
++  dump_op_array = (vld_dump_f) DL_FETCH_SYMBOL(handle, "vld_dump_oparray");
++  
++#ifdef PHP_WIN32
++  DL_UNLOAD(handle);
++#endif
++
++  if(dump_op_array) {
++    dump_op_array(op_array TSRMLS_CC);
++  
++    return;
 +  }
++  
++  apc_warning("vld is not installed or something even worse." TSRMLS_CC);
 +#endif
 +}
-diff -Naur php-5.3.1.orig/ext/apc/apc_debug.h php-5.3.1/ext/apc/apc_debug.h
---- php-5.3.1.orig/ext/apc/apc_debug.h 1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_debug.h      1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1 @@
-+void dump(zend_op_array * TSRMLS_DC);
-diff -Naur php-5.3.1.orig/ext/apc/apc.dsp php-5.3.1/ext/apc/apc.dsp
---- php-5.3.1.orig/ext/apc/apc.dsp     1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc.dsp  1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,207 @@
-+# Microsoft Developer Studio Project File - Name="apc" - Package Owner=<4>
-+# Microsoft Developer Studio Generated Build File, Format Version 6.00
-+# ** DO NOT EDIT **
-+
-+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-+
-+CFG=apc - Win32 Debug_TS
-+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-+!MESSAGE use the Export Makefile command and run
-+!MESSAGE 
-+!MESSAGE NMAKE /f "apc.mak".
-+!MESSAGE 
-+!MESSAGE You can specify a configuration when running NMAKE
-+!MESSAGE by defining the macro CFG on the command line. For example:
-+!MESSAGE 
-+!MESSAGE NMAKE /f "apc.mak" CFG="apc - Win32 Debug_TS"
-+!MESSAGE 
-+!MESSAGE Possible choices for configuration are:
-+!MESSAGE 
-+!MESSAGE "apc - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
-+!MESSAGE "apc - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
-+!MESSAGE 
-+
-+# Begin Project
-+# PROP AllowPerConfigDependencies 0
-+# PROP Scc_ProjName ""
-+# PROP Scc_LocalPath ""
-+CPP=cl.exe
-+MTL=midl.exe
-+RSC=rc.exe
-+
-+!IF  "$(CFG)" == "apc - Win32 Debug_TS"
-+
-+# PROP BASE Use_MFC 0
-+# PROP BASE Use_Debug_Libraries 1
-+# PROP BASE Output_Dir "Debug_TS"
-+# PROP BASE Intermediate_Dir "Debug_TS"
-+# PROP BASE Target_Dir ""
-+# PROP Use_MFC 0
-+# PROP Use_Debug_Libraries 1
-+# PROP Output_Dir "Debug_TS"
-+# PROP Intermediate_Dir "Debug_TS"
-+# PROP Ignore_Export_Lib 0
-+# PROP Target_Dir ""
-+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "APC_EXPORTS" /YX /FD /GZ /c
-+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\..\php4" /I "..\..\..\php4\main" /I "..\..\..\php4\Zend" /I "..\..\..\php4\TSRM" /I "..\..\..\php4\win32" /I "..\..\..\php4\regex" /D "TSRM_LOCKS" /D HAVE_APC=1 /D "COMPILE_DL_APC" /D ZEND_DEBUG=1 /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "APC_EXPORTS" /YX /FD /GZ /c
-+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-+# ADD BASE RSC /l 0x409 /d "_DEBUG"
-+# ADD RSC /l 0x409 /d "_DEBUG"
-+BSC32=bscmake.exe
-+# ADD BASE BSC32 /nologo
-+# ADD BSC32 /nologo
-+LINK32=link.exe
-+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-+# ADD LINK32 php4ts_debug.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"Debug_TS/php_apc.dll" /pdbtype:sept /libpath:"..\..\..\php4\Debug_TS"
-+
-+!ELSEIF  "$(CFG)" == "apc - Win32 Release_TS"
-+
-+# PROP BASE Use_MFC 0
-+# PROP BASE Use_Debug_Libraries 0
-+# PROP BASE Output_Dir "Release_TS"
-+# PROP BASE Intermediate_Dir "Release_TS"
-+# PROP BASE Target_Dir ""
-+# PROP Use_MFC 0
-+# PROP Use_Debug_Libraries 0
-+# PROP Output_Dir "Release_TS"
-+# PROP Intermediate_Dir "Release_TS"
-+# PROP Ignore_Export_Lib 0
-+# PROP Target_Dir ""
-+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "APC_EXPORTS" /YX /FD /c
-+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\php4" /I "..\..\..\php4\main" /I "..\..\..\php4\Zend" /I "..\..\..\php4\TSRM" /I "..\..\..\php4\win32" /I "..\..\..\php4\regex" /D "TSRM_LOCKS" /D HAVE_APC=1 /D "COMPILE_DL_APC" /D ZEND_DEBUG=0 /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "APC_EXPORTS" /YX /FD /c
-+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-+# ADD BASE RSC /l 0x409 /d "NDEBUG"
-+# ADD RSC /l 0x409 /d "NDEBUG"
-+BSC32=bscmake.exe
-+# ADD BASE BSC32 /nologo
-+# ADD BSC32 /nologo
-+LINK32=link.exe
-+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-+# ADD LINK32 php4ts.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../../Release_TS/php_apc.dll" /libpath:"..\..\..\php4\Release_TS" /libpath:"..\..\..\php4\Release_TS_Inline"
-+
-+!ENDIF 
-+
-+# Begin Target
-+
-+# Name "apc - Win32 Debug_TS"
-+# Name "apc - Win32 Release_TS"
-+# Begin Group "Source Files"
-+
-+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-+# Begin Source File
-+
-+SOURCE=.\apc.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_cache.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_compile.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_debug.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_fcntl_win32.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_main.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_rfc1867.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_shm.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_sma.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_stack.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_zend.c
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\php_apc.c
-+# End Source File
-+# End Group
-+# Begin Group "Header Files"
-+
-+# PROP Default_Filter "h;hpp;hxx;hm;inl"
-+# Begin Source File
-+
-+SOURCE=.\apc.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_cache.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_compile.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_debug.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_fcntl.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_globals.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_lock.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_main.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_php.h
-+# End Source File
-+# Begin Source File
+--- /dev/null
++++ b/ext/apc/apc_debug.h
+@@ -0,0 +1,29 @@
++/*
++  +----------------------------------------------------------------------+
++  | APC                                                                  |
++  +----------------------------------------------------------------------+
++  | Copyright (c) 2006-2010 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>              |
++  |          Arun C. Murthy <arunc@yahoo-inc.com>                        |
++  |          Gopal Vijayaraghavan <gopalv@yahoo-inc.com>                 |
++  +----------------------------------------------------------------------+
 +
-+SOURCE=.\apc_shm.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_sma.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_stack.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\apc_zend.h
-+# End Source File
-+# Begin Source File
-+
-+SOURCE=.\php_apc.h
-+# End Source File
-+# End Group
-+# Begin Group "Resource Files"
-+
-+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
-+# End Group
-+# End Target
-+# End Project
-diff -ubrN php-5.2.5-orig/ext/apc/apc_fcntl.c php-5.2.5/ext/apc/apc_fcntl.c
---- php-5.2.5-orig/ext/apc/apc_fcntl.c 1969-12-31 18:00:00.000000000 -0600
-+++ php-5.2.5/ext/apc/apc_fcntl.c      2007-12-26 16:51:32.000000000 -0600
-@@ -0,0 +1,118 @@
++   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.
++*/
++
++void dump(zend_op_array * TSRMLS_DC);
+--- /dev/null
++++ b/ext/apc/apc_fcntl.c
+@@ -0,0 +1,123 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -5457,7 +5787,7 @@ diff -ubrN php-5.2.5-orig/ext/apc/apc_fcntl.c php-5.2.5/ext/apc/apc_fcntl.c
 +
 + */
 +
-+/* $Id: apc_fcntl.c 268255 2008-11-04 05:42:11Z rasmus $ */
++/* $Id: apc_fcntl.c 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#include "apc.h"
 +
@@ -5467,7 +5797,7 @@ diff -ubrN php-5.2.5-orig/ext/apc/apc_fcntl.c php-5.2.5/ext/apc/apc_fcntl.c
 +#include <unistd.h>
 +#include <fcntl.h>
 +
-+int apc_fcntl_create(const char* pathname)
++int apc_fcntl_create(const char* pathname TSRMLS_DC)
 +{
 +    int fd;
 +    if(pathname == NULL) {
@@ -5478,7 +5808,7 @@ diff -ubrN php-5.2.5-orig/ext/apc/apc_fcntl.c php-5.2.5/ext/apc/apc_fcntl.c
 +            unlink(lock_path);
 +            return fd;
 +        } else {
-+            apc_eprint("apc_fcntl_create: open(%s, O_RDWR|O_CREAT, 0666) failed:", lock_path);
++            apc_error("apc_fcntl_create: open(%s, O_RDWR|O_CREAT, 0666) failed:" TSRMLS_CC, lock_path);
 +            return -1;
 +        }
 +    }
@@ -5487,7 +5817,7 @@ diff -ubrN php-5.2.5-orig/ext/apc/apc_fcntl.c php-5.2.5/ext/apc/apc_fcntl.c
 +        unlink(pathname);
 +        return fd;
 +    }
-+    apc_eprint("apc_fcntl_create: open(%s, O_RDWR|O_CREAT, 0666) failed:", pathname);
++    apc_error("apc_fcntl_create: open(%s, O_RDWR|O_CREAT, 0666) failed:" TSRMLS_CC, pathname);
 +    return -1;
 +}
 +
@@ -5512,33 +5842,33 @@ diff -ubrN php-5.2.5-orig/ext/apc/apc_fcntl.c php-5.2.5/ext/apc/apc_fcntl.c
 +  return(ret);
 +}
 +
-+void apc_fcntl_lock(int fd)
++void apc_fcntl_lock(int fd TSRMLS_DC)
 +{
 +    if(lock_reg(fd, F_SETLKW, F_WRLCK, 0, SEEK_SET, 0) < 0) {
-+        apc_eprint("apc_fcntl_lock failed:");
++        apc_error("apc_fcntl_lock failed:" TSRMLS_CC);
 +    }
 +}
 +
-+void apc_fcntl_rdlock(int fd)
++void apc_fcntl_rdlock(int fd TSRMLS_DC)
 +{
 +    if(lock_reg(fd, F_SETLKW, F_RDLCK, 0, SEEK_SET, 0) < 0) {
-+        apc_eprint("apc_fcntl_rdlock failed:");
++        apc_error("apc_fcntl_rdlock failed:" TSRMLS_CC);
 +    }
 +}
 +
-+zend_bool apc_fcntl_nonblocking_lock(int fd)
++zend_bool apc_fcntl_nonblocking_lock(int fd TSRMLS_DC)
 +{
 +    if(lock_reg(fd, F_SETLK, F_WRLCK, 0, SEEK_SET, 0) < 0) {
 +        if(errno==EACCES||errno==EAGAIN) return 0;
-+        else apc_eprint("apc_fcntl_lock failed:");
++        else apc_error("apc_fcntl_lock failed:" TSRMLS_CC);
 +    }
 +    return 1;
 +}
 +
-+void apc_fcntl_unlock(int fd)
++void apc_fcntl_unlock(int fd TSRMLS_DC)
 +{
 +    if(lock_reg(fd, F_SETLKW, F_UNLCK, 0, SEEK_SET, 0) < 0) {
-+        apc_eprint("apc_fcntl_unlock failed:");
++        apc_error("apc_fcntl_unlock failed:" TSRMLS_CC);
 +    }
 +}
 +
@@ -5552,15 +5882,14 @@ diff -ubrN php-5.2.5-orig/ext/apc/apc_fcntl.c php-5.2.5/ext/apc/apc_fcntl.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl.h php-5.3.1/ext/apc/apc_fcntl.h
---- php-5.3.1.orig/ext/apc/apc_fcntl.h 1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_fcntl.h      1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_fcntl.h
 @@ -0,0 +1,50 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -5584,18 +5913,18 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl.h php-5.3.1/ext/apc/apc_fcntl.h
 +
 + */
 +
-+/* $Id: apc_fcntl.h 268255 2008-11-04 05:42:11Z rasmus $ */
++/* $Id: apc_fcntl.h 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#ifndef APC_FCNTL_H
 +#define APC_FCNTL_H
 +
 +
-+extern int apc_fcntl_create(const char* pathname);
++extern int apc_fcntl_create(const char* pathname TSRMLS_DC);
 +extern void apc_fcntl_destroy(int fd);
-+extern void apc_fcntl_lock(int fd);
-+extern void apc_fcntl_rdlock(int fd);
-+extern void apc_fcntl_unlock(int fd);
-+extern unsigned char apc_fcntl_nonblocking_lock(int fd);
++extern void apc_fcntl_lock(int fd TSRMLS_DC);
++extern void apc_fcntl_rdlock(int fd TSRMLS_DC);
++extern void apc_fcntl_unlock(int fd TSRMLS_DC);
++extern unsigned char apc_fcntl_nonblocking_lock(int fd TSRMLS_DC);
 +#endif
 +
 +/*
@@ -5606,15 +5935,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl.h php-5.3.1/ext/apc/apc_fcntl.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl_win32.c php-5.3.1/ext/apc/apc_fcntl_win32.c
---- php-5.3.1.orig/ext/apc/apc_fcntl_win32.c   1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_fcntl_win32.c        1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_fcntl_win32.c
 @@ -0,0 +1,117 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -5638,10 +5966,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl_win32.c php-5.3.1/ext/apc/apc_fcntl_
 +
 + */
 +
-+/* $Id: apc_fcntl_win32.c 268255 2008-11-04 05:42:11Z rasmus $ */
++/* $Id: apc_fcntl_win32.c 302175 2010-08-13 06:20:28Z kalle $ */
 +
-+#include "apc_fcntl.h"
 +#include "apc.h"
++#include "apc_fcntl.h"
 +#include <php.h>
 +#include <win32/flock.h>
 +#include <io.h>
@@ -5649,7 +5977,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl_win32.c php-5.3.1/ext/apc/apc_fcntl_
 +#include <sys/types.h>
 +#include <sys/stat.h>
 +
-+int apc_fcntl_create(const char* pathname)
++int apc_fcntl_create(const char* pathname TSRMLS_DC)
 +{
 +    char *lock_file = emalloc(MAXPATHLEN);
 +    HANDLE fd;
@@ -5674,7 +6002,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl_win32.c php-5.3.1/ext/apc/apc_fcntl_
 +
 +
 +    if (fd == INVALID_HANDLE_VALUE) {
-+        apc_eprint("apc_fcntl_create: could not open %s", lock_file);
++        apc_error("apc_fcntl_create: could not open %s" TSRMLS_CC, lock_file);
 +        efree(lock_file);
 +        return -1;
 +    }
@@ -5688,25 +6016,25 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl_win32.c php-5.3.1/ext/apc/apc_fcntl_
 +    CloseHandle((HANDLE)fd);
 +}
 +
-+void apc_fcntl_lock(int fd)
++void apc_fcntl_lock(int fd TSRMLS_DC)
 +{
 +    OVERLAPPED offset = {0, 0, 0, 0, NULL};
 +
 +    if (!LockFileEx((HANDLE)fd, LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &offset)) {
-+        apc_eprint("apc_fcntl_lock failed errno:%d", GetLastError());
++        apc_error("apc_fcntl_lock failed errno:%d" TSRMLS_CC, GetLastError());
 +    }
 +}
 +
-+void apc_fcntl_rdlock(int fd)
++void apc_fcntl_rdlock(int fd TSRMLS_DC)
 +{
 +    OVERLAPPED offset = {0, 0, 0, 0, NULL};
 +
 +    if (!LockFileEx((HANDLE)fd, 0, 0, 1, 0, &offset)) {
-+        apc_eprint("apc_fcntl_rdlock failed errno:%d", GetLastError());
++        apc_error("apc_fcntl_rdlock failed errno:%d" TSRMLS_CC, GetLastError());
 +    }
 +}
 +
-+void apc_fcntl_unlock(int fd)
++void apc_fcntl_unlock(int fd TSRMLS_DC)
 +{
 +    OVERLAPPED offset = {0, 0, 0, 0, NULL};
 +
@@ -5714,7 +6042,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl_win32.c php-5.3.1/ext/apc/apc_fcntl_
 +        DWORD error_code = GetLastError();
 +        /* Ignore already unlocked error */
 +        if (error_code != ERROR_NOT_LOCKED) {
-+            apc_eprint("apc_fcntl_unlock failed errno:%d", error_code);
++            apc_error("apc_fcntl_unlock failed errno:%d" TSRMLS_CC, error_code);
 +        }
 +    }
 +}
@@ -5727,15 +6055,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_fcntl_win32.c php-5.3.1/ext/apc/apc_fcntl_
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_globals.h php-5.3.1/ext/apc/apc_globals.h
---- php-5.3.1.orig/ext/apc/apc_globals.h       1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_globals.h    1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,143 @@
+--- /dev/null
++++ b/ext/apc/apc_globals.h
+@@ -0,0 +1,148 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -5762,7 +6089,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_globals.h php-5.3.1/ext/apc/apc_globals.h
 +
 + */
 +
-+/* $Id: apc_globals.h 284222 2009-07-17 01:23:57Z shire $ */
++/* $Id: apc_globals.h 301232 2010-07-13 12:23:35Z gopalv $ */
 +
 +#ifndef APC_GLOBALS_H
 +#define APC_GLOBALS_H
@@ -5788,6 +6115,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_globals.h php-5.3.1/ext/apc/apc_globals.h
 +    size_t prev_bytes_processed;
 +    int update_freq;
 +    double rate;
++    int started;
 +};
 +/* }}} */
 +
@@ -5819,6 +6147,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_globals.h php-5.3.1/ext/apc/apc_globals.h
 +    zend_bool canonicalize;      /* true if relative paths should be canonicalized in no-stat mode */
 +    zend_bool stat_ctime;        /* true if ctime in addition to mtime should be checked */
 +    zend_bool write_lock;        /* true for a global write lock */
++    zend_bool slam_defense;      /* true for user cache slam defense */ 
 +    zend_bool report_autofilter; /* true for auto-filter warnings */
 +    zend_bool include_once;      /* Override the ZEND_INCLUDE_OR_EVAL opcode handler to avoid pointless fopen()s [still experimental] */
 +    apc_optimize_function_t apc_optimize_function;   /* optimizer function callback */
@@ -5833,7 +6162,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_globals.h php-5.3.1/ext/apc/apc_globals.h
 +    HashTable copied_zvals;      /* my_copy recursion detection list */
 +    zend_bool force_file_update; /* force files to be updated during apc_compile_file */
 +    char canon_path[MAXPATHLEN]; /* canonical path for key data */
-+#if APC_FILEHITS
++#ifdef APC_FILEHITS
 +    zval *filehits;              /* Files that came from the cache for this request */
 +#endif
 +    zend_bool coredump_unmap;    /* Trap signals that coredump and unmap shared memory */
@@ -5848,6 +6177,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_globals.h php-5.3.1/ext/apc/apc_globals.h
 +    HashTable *lazy_function_table;  /* lazy function entry table */
 +    zend_bool lazy_classes;          /* enable/disable lazy class loading */
 +    HashTable *lazy_class_table;     /* lazy class entry table */
++#ifdef ZEND_ENGINE_2_4
++    long shm_strings_buffer;
++#endif
 +ZEND_END_MODULE_GLOBALS(apc)
 +
 +/* (the following declaration is defined in php_apc.c) */
@@ -5874,15 +6206,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_globals.h php-5.3.1/ext/apc/apc_globals.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc.h php-5.3.1/ext/apc/apc.h
---- php-5.3.1.orig/ext/apc/apc.h       1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc.h    1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,126 @@
+--- /dev/null
++++ b/ext/apc/apc.h
+@@ -0,0 +1,124 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -5909,7 +6240,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.h php-5.3.1/ext/apc/apc.h
 +
 + */
 +
-+/* $Id: apc.h 276125 2009-02-19 01:02:59Z shire $ */
++/* $Id: apc.h 304310 2010-10-11 12:19:24Z gopalv $ */
 +
 +#ifndef APC_H
 +#define APC_H
@@ -5941,45 +6272,43 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.h php-5.3.1/ext/apc/apc.h
 +#include "php.h"
 +#include "main/php_streams.h"
 +
-+/* log levels constants (see my_log) */
-+enum { APC_DBG, APC_NOTICE, APC_WARNING, APC_ERROR };
-+
 +/* typedefs for extensible memory allocators */
-+typedef void* (*apc_malloc_t)(size_t);
-+typedef void  (*apc_free_t)  (void*);
++typedef void* (*apc_malloc_t)(size_t TSRMLS_DC);
++typedef void  (*apc_free_t)  (void * TSRMLS_DC);
 +
 +/* wrappers for memory allocation routines */
-+extern void* apc_emalloc(size_t n);
-+extern void* apc_erealloc(void* p, size_t n);
-+extern void apc_efree(void* p);
-+extern char* apc_estrdup(const char* s);
-+extern void* apc_xstrdup(const char* s, apc_malloc_t f);
-+extern void* apc_xmemcpy(const void* p, size_t n, apc_malloc_t f);
++extern void* apc_emalloc(size_t n TSRMLS_DC);
++extern void* apc_erealloc(void* p, size_t n TSRMLS_DC);
++extern void apc_efree(void* p TSRMLS_DC);
++extern char* apc_estrdup(const char* s TSRMLS_DC);
++extern void* apc_xstrdup(const char* s, apc_malloc_t f TSRMLS_DC);
++extern void* apc_xmemcpy(const void* p, size_t n, apc_malloc_t f TSRMLS_DC);
 +
 +/* console display functions */
-+extern void apc_eprint(const char* fmt, ...);
-+extern void apc_wprint(const char* fmt, ...);
-+extern void apc_dprint(const char* fmt, ...);
-+extern void apc_nprint(const char* fmt, ...);
++extern void apc_error(const char *format TSRMLS_DC, ...);
++extern void apc_warning(const char *format TSRMLS_DC, ...);
++extern void apc_notice(const char *format TSRMLS_DC, ...);
++extern void apc_debug(const char *format TSRMLS_DC, ...);
 +
 +/* string and text manipulation */
-+extern char* apc_append(const char* s, const char* t);
-+extern char* apc_substr(const char* s, int start, int length);
-+extern char** apc_tokenize(const char* s, char delim);
++extern char* apc_append(const char* s, const char* t TSRMLS_DC);
++extern char* apc_substr(const char* s, int start, int length TSRMLS_DC);
++extern char** apc_tokenize(const char* s, char delim TSRMLS_DC);
 +
 +/* filesystem functions */
 +
 +typedef struct apc_fileinfo_t 
 +{
-+    char fullpath[MAXPATHLEN+1];
++    char *fullpath;
++    char path_buf[MAXPATHLEN];
 +    php_stream_statbuf st_buf;
 +} apc_fileinfo_t;
 +
-+extern int apc_search_paths(const char* filename, const char* path, apc_fileinfo_t* fileinfo);
++extern int apc_search_paths(const char* filename, const char* path, apc_fileinfo_t* fileinfo TSRMLS_DC);
 +
 +/* regular expression wrapper functions */
 +extern void* apc_regex_compile_array(char* patterns[] TSRMLS_DC);
-+extern void apc_regex_destroy_array(void* p);
++extern void apc_regex_destroy_array(void* p TSRMLS_DC);
 +extern int apc_regex_match_array(void* p, const char* input);
 +
 +/* apc_crc32: returns the CRC-32 checksum of the first len bytes in buf */
@@ -6004,15 +6333,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.h php-5.3.1/ext/apc/apc.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.c
---- php-5.3.1.orig/ext/apc/apc_iterator.c      1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_iterator.c   1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,634 @@
+--- /dev/null
++++ b/ext/apc/apc_iterator.c
+@@ -0,0 +1,710 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2008 The PHP Group                                     |
++  | Copyright (c) 2006-2010 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        |
@@ -6022,12 +6350,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +  | obtain it through the world-wide-web, please send a note to          |
 +  | license@php.net so we can mail you a copy immediately.               |
 +  +----------------------------------------------------------------------+
-+  | Authors: Brian Shire <shire@.php.net>                                |
++  | Authors: Brian Shire <shire@php.net>                                 |
 +  +----------------------------------------------------------------------+
 +
 + */
 +
-+/* $Id: apc_iterator.c 284698 2009-07-24 11:35:52Z kalle $ */
++/* $Id: apc_iterator.c 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#include "php_apc.h"
 +#include "apc_iterator.h"
@@ -6043,7 +6371,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +
 +
 +/* {{{ apc_iterator_item */
-+static apc_iterator_item_t* apc_iterator_item_ctor(apc_iterator_t *iterator, slot_t **slot_pp) {
++static apc_iterator_item_t* apc_iterator_item_ctor(apc_iterator_t *iterator, slot_t **slot_pp TSRMLS_DC) {
 +    zval *zvalue;
 +    char md5str[33];
 +    slot_t *slot = *slot_pp;
@@ -6052,7 +6380,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +
 +    if (slot->key.type == APC_CACHE_KEY_FILE) {
 +        /* keys should be unique and with stat=1 we could have multiple files with the same name, so use '<device> <inode>' instead */
++#ifdef PHP_WIN32
++        item->key_len = spprintf(&item->key, 0, "%I64d %I64d", slot->key.data.file.device, slot->key.data.file.inode);
++#else
 +        item->key_len = spprintf(&item->key, 0, "%ld %ld", (ulong)slot->key.data.file.device, (ulong)slot->key.data.file.inode);
++#endif
 +        item->filename_key = estrdup(slot->value->data.file.filename);
 +    } else if (slot->key.type == APC_CACHE_KEY_USER) {
 +        item->key = estrndup((char*)slot->key.data.user.identifier, slot->key.data.user.identifier_len);
@@ -6061,8 +6393,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +    } else if (slot->key.type == APC_CACHE_KEY_FPFILE) {
 +        item->key = estrndup((char*)slot->key.data.fpfile.fullpath, slot->key.data.fpfile.fullpath_len);
 +        item->key_len = slot->key.data.fpfile.fullpath_len;
++        item->filename_key = item->key;
 +    } else {
-+        apc_eprint("Internal error, invalid entry type.");
++        apc_error("Internal error, invalid entry type." TSRMLS_CC);
 +    }
 +
 +    ALLOC_INIT_ZVAL(item->value);
@@ -6086,26 +6419,38 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +    }
 +    if (APC_ITER_DEVICE & iterator->format) {
 +        if(slot->key.type == APC_CACHE_KEY_FILE) {
++#ifdef PHP_WIN32
++                      char buf[20];
++                      sprintf(buf, "%I64d", slot->key.data.file.device);
++                      add_assoc_string(item->value, "device", buf, 1);
++#else
 +            add_assoc_long(item->value, "device", slot->key.data.file.device);
++#endif
 +        }
 +    }
 +    if (APC_ITER_INODE & iterator->format) {
 +        if(slot->key.type == APC_CACHE_KEY_FILE) {
++#ifdef PHP_WIN32
++                      char buf[20];
++                      sprintf(buf, "%I64d", slot->key.data.file.device);
++                      add_assoc_string(item->value, "device", buf, 1);
++#else
 +            add_assoc_long(item->value, "inode", slot->key.data.file.inode);
++#endif
 +        }
 +    }
 +    if (APC_ITER_KEY & iterator->format) {
-+        add_assoc_stringl(item->value, "key", item->key, item->key_len, 1);
++        add_assoc_stringl(item->value, "key", item->key, (item->key_len - 1), 1);
 +    }
 +    if (APC_ITER_VALUE & iterator->format) {
 +        if(slot->value->type == APC_CACHE_ENTRY_USER) {
 +
-+            ctxt.pool = apc_pool_create(APC_UNPOOL, apc_php_malloc, apc_php_free, NULL, NULL);
++            ctxt.pool = apc_pool_create(APC_UNPOOL, apc_php_malloc, apc_php_free, NULL, NULL TSRMLS_CC);
 +            ctxt.copy = APC_COPY_OUT_USER;
 +
 +            MAKE_STD_ZVAL(zvalue);
-+            apc_cache_fetch_zval(zvalue, slot->value->data.user.val, &ctxt);
-+            apc_pool_destroy(ctxt.pool);
++            apc_cache_fetch_zval(zvalue, slot->value->data.user.val, &ctxt TSRMLS_CC);
++            apc_pool_destroy(ctxt.pool TSRMLS_CC);
 +            add_assoc_zval(item->value, "value", zvalue);
 +        }
 +    }
@@ -6151,7 +6496,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +/* {{{ apc_iterator_clone */
 +static zend_object_value apc_iterator_clone(zval *zobject TSRMLS_DC) {
 +    zend_object_value value = {0};
-+    apc_eprint("APCIterator object cannot be cloned.");
++    apc_error("APCIterator object cannot be cloned." TSRMLS_CC);
 +    return value;
 +}
 +/* }}} */
@@ -6248,7 +6593,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +#endif
 +            
 +    if (iterator->search_hash) {
-+        rval = zend_hash_exists(iterator->search_hash, key, key_len+1);
++        rval = zend_hash_exists(iterator->search_hash, key, key_len);
 +        if (!rval && fname_key) {
 +            rval = zend_hash_exists(iterator->search_hash, fname_key, fname_key_len+1);
 +        }
@@ -6259,7 +6604,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +/* }}} */
 +
 +/* {{{ apc_iterator_fetch_active */
-+static int apc_iterator_fetch_active(apc_iterator_t *iterator) {
++static int apc_iterator_fetch_active(apc_iterator_t *iterator TSRMLS_DC) {
 +    int count=0;
 +    slot_t **slot;
 +    apc_iterator_item_t *item;
@@ -6274,9 +6619,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +        while(*slot) {
 +            if (apc_iterator_search_match(iterator, slot)) {
 +                count++;
-+                item = apc_iterator_item_ctor(iterator, slot);
++                item = apc_iterator_item_ctor(iterator, slot TSRMLS_CC);
 +                if (item) {
-+                    apc_stack_push(iterator->stack, item);
++                    apc_stack_push(iterator->stack, item TSRMLS_CC);
 +                }
 +            }
 +            slot = &(*slot)->next;
@@ -6290,7 +6635,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +/* }}} */
 +
 +/* {{{ apc_iterator_fetch_deleted */
-+static int apc_iterator_fetch_deleted(apc_iterator_t *iterator) {
++static int apc_iterator_fetch_deleted(apc_iterator_t *iterator TSRMLS_DC) {
 +    int count=0;
 +    slot_t **slot;
 +    apc_iterator_item_t *item;
@@ -6305,9 +6650,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +    while ((*slot) && count < iterator->chunk_size) {
 +        if (apc_iterator_search_match(iterator, slot)) {
 +            count++;
-+            item = apc_iterator_item_ctor(iterator, slot);
++            item = apc_iterator_item_ctor(iterator, slot TSRMLS_CC);
 +            if (item) {
-+                apc_stack_push(iterator->stack, item);
++                apc_stack_push(iterator->stack, item TSRMLS_CC);
 +            }
 +        }
 +        slot = &(*slot)->next;
@@ -6320,7 +6665,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +/* }}} */
 +
 +/* {{{ apc_iterator_totals */
-+static void apc_iterator_totals(apc_iterator_t *iterator) {
++static void apc_iterator_totals(apc_iterator_t *iterator TSRMLS_DC) {
 +    slot_t **slot;
 +    int i;
 +
@@ -6356,13 +6701,17 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +        return;
 +    }
 +
++    if (!APCG(enabled)) {
++        apc_error("APC must be enabled to use APCIterator." TSRMLS_CC);
++    }
++
 +    if (chunk_size < 0) {
-+        apc_eprint("APCIterator chunk size must be greater than 0.");
++        apc_error("APCIterator chunk size must be 0 or greater." TSRMLS_CC);
 +        return;
 +    }
 +
 +    if (format > APC_ITER_ALL) {
-+        apc_eprint("APCIterator format is invalid.");
++        apc_error("APCIterator format is invalid." TSRMLS_CC);
 +        return;
 +    }
 +
@@ -6371,7 +6720,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +    } else if (list == APC_LIST_DELETED) {
 +        iterator->fetch = apc_iterator_fetch_deleted;
 +    } else {
-+        apc_wprint("APCIterator invalid list type.");
++        apc_warning("APCIterator invalid list type." TSRMLS_CC);
 +        return;
 +    }
 +
@@ -6385,7 +6734,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +    iterator->stack_idx = 0;
 +    iterator->key_idx = 0;
 +    iterator->chunk_size = chunk_size == 0 ? APC_DEFAULT_CHUNK_SIZE : chunk_size;
-+    iterator->stack = apc_stack_create(chunk_size);
++    iterator->stack = apc_stack_create(chunk_size TSRMLS_CC);
 +    iterator->format = format;
 +    iterator->totals_flag = 0;
 +    iterator->count = 0;
@@ -6401,10 +6750,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +        iterator->re = pcre_get_compiled_regex(Z_STRVAL_P(search), NULL, NULL TSRMLS_CC);
 +
 +        if(!iterator->re) {
-+            apc_eprint("Could not compile regular expression: %s", Z_STRVAL_P(search));
++            apc_error("Could not compile regular expression: %s" TSRMLS_CC, Z_STRVAL_P(search));
 +        }
 +#else
-+        apc_eprint("Regular expressions support is not enabled, please enable PCRE for APCIterator regex support");
++        apc_error("Regular expressions support is not enabled, please enable PCRE for APCIterator regex support" TSRMLS_CC);
 +#endif
 +    } else if (search && Z_TYPE_P(search) == IS_ARRAY) {
 +        Z_ADDREF_P(search);
@@ -6416,8 +6765,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +
 +/* {{{ proto APCIterator::rewind() */
 +PHP_METHOD(apc_iterator, rewind) {
-+    zval *object = getThis();
-+    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(object TSRMLS_CC);
++    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
++
++    if (zend_parse_parameters_none() == FAILURE) {
++        return;
++    }
 +
 +    if (iterator->initialized == 0) {
 +        RETURN_FALSE;
@@ -6426,21 +6778,24 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +    iterator->slot_idx = 0;
 +    iterator->stack_idx = 0;
 +    iterator->key_idx = 0;
-+    iterator->fetch(iterator);
++    iterator->fetch(iterator TSRMLS_CC);
 +}
 +/* }}} */
 +
 +/* {{{ proto boolean APCIterator::valid() */
 +PHP_METHOD(apc_iterator, valid) {
-+    zval *object = getThis();
-+    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(object TSRMLS_CC);
++    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
++
++    if (zend_parse_parameters_none() == FAILURE) {
++        return;
++    }
 +
 +    if (iterator->initialized == 0) {
 +        RETURN_FALSE;
 +    }
 +
 +    if (apc_stack_size(iterator->stack) == iterator->stack_idx) {
-+        iterator->fetch(iterator);
++        iterator->fetch(iterator TSRMLS_CC);
 +    }
 +
 +    RETURN_BOOL(apc_stack_size(iterator->stack) == 0 ? 0 : 1);
@@ -6449,17 +6804,23 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +
 +/* {{{ proto mixed APCIterator::current() */
 +PHP_METHOD(apc_iterator, current) {
-+    zval *object = getThis();
 +    apc_iterator_item_t *item;
-+    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(object TSRMLS_CC);
++    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
++
++    if (zend_parse_parameters_none() == FAILURE) {
++        return;
++    }
++
 +    if (iterator->initialized == 0) {
 +        RETURN_FALSE;
 +    }
++
 +    if (apc_stack_size(iterator->stack) == iterator->stack_idx) {
-+        if (iterator->fetch(iterator) == 0) {
++        if (iterator->fetch(iterator TSRMLS_CC) == 0) {
 +            RETURN_FALSE;
 +        }
 +    }
++
 +    item = apc_stack_get(iterator->stack, iterator->stack_idx);
 +    RETURN_ZVAL(item->value, 1, 0);
 +}
@@ -6467,20 +6828,27 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +
 +/* {{{ proto string APCIterator::key() */
 +PHP_METHOD(apc_iterator, key) {
-+    zval *object = getThis();
 +    apc_iterator_item_t *item;
-+    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(object TSRMLS_CC);
++    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
++
++    if (zend_parse_parameters_none() == FAILURE) {
++        return;
++    }
++
 +    if (iterator->initialized == 0 || apc_stack_size(iterator->stack) == 0) {
 +        RETURN_FALSE;
 +    }
++
 +    if (apc_stack_size(iterator->stack) == iterator->stack_idx) {
-+        if (iterator->fetch(iterator) == 0) {
++        if (iterator->fetch(iterator TSRMLS_CC) == 0) {
 +            RETURN_FALSE;
 +        }
 +    }
++
 +    item = apc_stack_get(iterator->stack, iterator->stack_idx);
++
 +    if (item->key) {
-+        RETURN_STRINGL(item->key, item->key_len, 1);
++        RETURN_STRINGL(item->key, (item->key_len-1), 1);
 +    } else {
 +        RETURN_LONG(iterator->key_idx);
 +    }
@@ -6489,45 +6857,57 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +
 +/* {{{ proto APCIterator::next() */
 +PHP_METHOD(apc_iterator, next) {
-+    zval *object = getThis();
-+    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(object TSRMLS_CC);
++    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
++
++    if (zend_parse_parameters_none() == FAILURE) {
++        return;
++    }
++
 +    if (iterator->initialized == 0 || apc_stack_size(iterator->stack) == 0) {
 +        RETURN_FALSE;
 +    }
++
 +    iterator->stack_idx++;
 +    iterator->key_idx++;
++
 +    RETURN_TRUE;
 +}
 +/* }}} */
 +
 +/* {{{ proto long APCIterator::getTotalHits() */
 +PHP_METHOD(apc_iterator, getTotalHits) {
-+    zval *object = getThis();
-+    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(object TSRMLS_CC);
++    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
++
++    if (zend_parse_parameters_none() == FAILURE) {
++        return;
++    }
 +
 +    if (iterator->initialized == 0) {
 +        RETURN_FALSE;
 +    }
 +
 +    if (iterator->totals_flag == 0) {
-+        apc_iterator_totals(iterator);
++        apc_iterator_totals(iterator TSRMLS_CC);
 +    }
 +
 +    RETURN_LONG(iterator->hits);
 +}
 +/* }}} */
 +
-+/* {{{ proto long APCIterator:;getTotalSize() */
++/* {{{ proto long APCIterator::getTotalSize() */
 +PHP_METHOD(apc_iterator, getTotalSize) {
-+    zval *object = getThis();
-+    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(object TSRMLS_CC);
++    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
++
++    if (zend_parse_parameters_none() == FAILURE) {
++        return;
++    }
 +
 +    if (iterator->initialized == 0) {
 +        RETURN_FALSE;
 +    }
 +
 +    if (iterator->totals_flag == 0) {
-+        apc_iterator_totals(iterator);
++        apc_iterator_totals(iterator TSRMLS_CC);
 +    }
 +
 +    RETURN_LONG(iterator->size);
@@ -6536,32 +6916,56 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +
 +/* {{{ proto long APCIterator::getTotalCount() */
 +PHP_METHOD(apc_iterator, getTotalCount) {
-+    zval *object = getThis();
-+    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(object TSRMLS_CC);
++    apc_iterator_t *iterator = (apc_iterator_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
++
++    if (zend_parse_parameters_none() == FAILURE) {
++        return;
++    }
 +
 +    if (iterator->initialized == 0) {
 +        RETURN_FALSE;
 +    }
 +
 +    if (iterator->totals_flag == 0) {
-+        apc_iterator_totals(iterator);
++        apc_iterator_totals(iterator TSRMLS_CC);
 +    }
 +
 +    RETURN_LONG(iterator->count);
 +}
 +/* }}} */
 +
++/* {{{ arginfo */
++#if (PHP_MAJOR_VERSION >= 6 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3))
++# define PHP_APC_ARGINFO
++#else
++# define PHP_APC_ARGINFO static
++#endif
++
++PHP_APC_ARGINFO
++ZEND_BEGIN_ARG_INFO_EX(arginfo_apc_iterator___construct, 0, 0, 1)
++      ZEND_ARG_INFO(0, cache)
++      ZEND_ARG_INFO(0, search)
++      ZEND_ARG_INFO(0, format)
++      ZEND_ARG_INFO(0, chunk_size)
++      ZEND_ARG_INFO(0, list)
++ZEND_END_ARG_INFO()
++
++PHP_APC_ARGINFO
++ZEND_BEGIN_ARG_INFO_EX(arginfo_apc_iterator_void, 0, 0, 0)
++ZEND_END_ARG_INFO()
++/* }}} */
++
 +/* {{{ apc_iterator_functions */
-+static function_entry apc_iterator_functions[] = {
-+    PHP_ME(apc_iterator, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
-+    PHP_ME(apc_iterator, rewind, NULL, ZEND_ACC_PUBLIC)
-+    PHP_ME(apc_iterator, current, NULL, ZEND_ACC_PUBLIC)
-+    PHP_ME(apc_iterator, key, NULL, ZEND_ACC_PUBLIC)
-+    PHP_ME(apc_iterator, next, NULL, ZEND_ACC_PUBLIC)
-+    PHP_ME(apc_iterator, valid, NULL, ZEND_ACC_PUBLIC)
-+    PHP_ME(apc_iterator, getTotalHits, NULL, ZEND_ACC_PUBLIC)
-+    PHP_ME(apc_iterator, getTotalSize, NULL, ZEND_ACC_PUBLIC)
-+    PHP_ME(apc_iterator, getTotalCount, NULL, ZEND_ACC_PUBLIC)
++static zend_function_entry apc_iterator_functions[] = {
++    PHP_ME(apc_iterator, __construct, arginfo_apc_iterator___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
++    PHP_ME(apc_iterator, rewind, arginfo_apc_iterator_void, ZEND_ACC_PUBLIC)
++    PHP_ME(apc_iterator, current, arginfo_apc_iterator_void, ZEND_ACC_PUBLIC)
++    PHP_ME(apc_iterator, key, arginfo_apc_iterator_void, ZEND_ACC_PUBLIC)
++    PHP_ME(apc_iterator, next, arginfo_apc_iterator_void, ZEND_ACC_PUBLIC)
++    PHP_ME(apc_iterator, valid, arginfo_apc_iterator_void, ZEND_ACC_PUBLIC)
++    PHP_ME(apc_iterator, getTotalHits, arginfo_apc_iterator_void, ZEND_ACC_PUBLIC)
++    PHP_ME(apc_iterator, getTotalSize, arginfo_apc_iterator_void, ZEND_ACC_PUBLIC)
++    PHP_ME(apc_iterator, getTotalCount, arginfo_apc_iterator_void, ZEND_ACC_PUBLIC)
 +    {NULL, NULL, NULL}
 +};
 +/* }}} */
@@ -6610,7 +7014,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +    apc_iterator_item_t *item;
 +
 +    if (!ce || !instanceof_function(ce, apc_iterator_ce TSRMLS_CC)) {
-+        apc_eprint("apc_delete object argument must be instance of APCIterator");
++        apc_error("apc_delete object argument must be instance of APCIterator" TSRMLS_CC);
 +        return 0;
 +    }
 +    iterator = (apc_iterator_t*)zend_object_store_get_object(zobj TSRMLS_CC);
@@ -6619,13 +7023,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 +        return 0;
 +    }
 +
-+    while (iterator->fetch(iterator)) {
++    while (iterator->fetch(iterator TSRMLS_CC)) {
 +        while (iterator->stack_idx < apc_stack_size(iterator->stack)) {
 +            item = apc_stack_get(iterator->stack, iterator->stack_idx++);
 +            if (iterator->cache == apc_cache) {
-+                apc_cache_delete(apc_cache, item->filename_key, strlen(item->filename_key)+1);
++                apc_cache_delete(apc_cache, item->filename_key, strlen(item->filename_key) + 1 TSRMLS_CC);
 +            } else {
-+                apc_cache_user_delete(apc_user_cache, item->key, item->key_len+1);
++                apc_cache_user_delete(apc_user_cache, item->key, item->key_len TSRMLS_CC);
 +            }
 +        }
 +    }
@@ -6642,15 +7046,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.c php-5.3.1/ext/apc/apc_iterator.
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.h php-5.3.1/ext/apc/apc_iterator.h
---- php-5.3.1.orig/ext/apc/apc_iterator.h      1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_iterator.h   1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_iterator.h
 @@ -0,0 +1,117 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2008 The PHP Group                                     |
++  | Copyright (c) 2006-2010 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        |
@@ -6665,7 +7068,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.h php-5.3.1/ext/apc/apc_iterator.
 +
 + */
 +
-+/* $Id: apc_iterator.h 277132 2009-03-14 01:50:57Z shire $ */
++/* $Id: apc_iterator.h 300979 2010-07-04 10:15:05Z kalle $ */
 +
 +#ifndef APC_ITERATOR_H
 +#define APC_ITERATOR_H
@@ -6719,7 +7122,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.h php-5.3.1/ext/apc/apc_iterator.
 +    zend_object obj;         /* must always be first */
 +    short int initialized;   /* sanity check in case __construct failed */
 +    long format;             /* format bitmask of the return values ie: key, value, info */
-+    int (*fetch)(struct _apc_iterator_t *iterator);
++    int (*fetch)(struct _apc_iterator_t *iterator TSRMLS_DC);
 +                             /* fetch callback to fetch items from cache slots or lists */
 +    apc_cache_t *cache;      /* cache which we are iterating on */
 +    long slot_idx;           /* index to the slot array or linked list */
@@ -6763,15 +7166,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_iterator.h php-5.3.1/ext/apc/apc_iterator.
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_lock.h php-5.3.1/ext/apc/apc_lock.h
---- php-5.3.1.orig/ext/apc/apc_lock.h  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_lock.h       1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,100 @@
+--- /dev/null
++++ b/ext/apc/apc_lock.h
+@@ -0,0 +1,101 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -6795,11 +7197,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_lock.h php-5.3.1/ext/apc/apc_lock.h
 +
 + */
 +
-+/* $Id: apc_lock.h 268620 2008-11-09 02:30:49Z shire $ */
++/* $Id: apc_lock.h 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#ifndef APC_LOCK
 +#define APC_LOCK
 +
++#include "apc.h"
 +#include "apc_sem.h"
 +#include "apc_fcntl.h"
 +#include "apc_pthreadmutex.h"
@@ -6821,23 +7224,23 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_lock.h php-5.3.1/ext/apc/apc_lock.h
 +#define RDLOCK_AVAILABLE 0
 +#define NONBLOCKING_LOCK_AVAILABLE 1 
 +#define apc_lck_t int
-+#define apc_lck_create(a,b,c,d) d=apc_sem_create(NULL,(b),(c))
++#define apc_lck_create(a,b,c,d) d=apc_sem_create((b),(c) TSRMLS_CC)
 +#define apc_lck_destroy(a)    apc_sem_destroy(a)
-+#define apc_lck_lock(a)       apc_sem_lock(a)
-+#define apc_lck_nb_lock(a)    apc_sem_nonblocking_lock(a)
-+#define apc_lck_rdlock(a)     apc_sem_lock(a)
-+#define apc_lck_unlock(a)     apc_sem_unlock(a)
++#define apc_lck_lock(a)       apc_sem_lock(a TSRMLS_CC)
++#define apc_lck_nb_lock(a)    apc_sem_nonblocking_lock(a TSRMLS_CC)
++#define apc_lck_rdlock(a)     apc_sem_lock(a TSRMLS_CC)
++#define apc_lck_unlock(a)     apc_sem_unlock(a TSRMLS_CC)
 +#elif defined(APC_PTHREADMUTEX_LOCKS)
 +#define APC_LOCK_TYPE "pthread mutex Locks"
 +#define RDLOCK_AVAILABLE 0
 +#define NONBLOCKING_LOCK_AVAILABLE 1
 +#define apc_lck_t pthread_mutex_t 
-+#define apc_lck_create(a,b,c,d) apc_pthreadmutex_create((pthread_mutex_t*)&d)
++#define apc_lck_create(a,b,c,d) apc_pthreadmutex_create((pthread_mutex_t*)&d TSRMLS_CC)
 +#define apc_lck_destroy(a)    apc_pthreadmutex_destroy(&a)
-+#define apc_lck_lock(a)       apc_pthreadmutex_lock(&a)
-+#define apc_lck_nb_lock(a)    apc_pthreadmutex_nonblocking_lock(&a)
-+#define apc_lck_rdlock(a)     apc_pthreadmutex_lock(&a)
-+#define apc_lck_unlock(a)     apc_pthreadmutex_unlock(&a)
++#define apc_lck_lock(a)       apc_pthreadmutex_lock(&a TSRMLS_CC)
++#define apc_lck_nb_lock(a)    apc_pthreadmutex_nonblocking_lock(&a TSRMLS_CC)
++#define apc_lck_rdlock(a)     apc_pthreadmutex_lock(&a TSRMLS_CC)
++#define apc_lck_unlock(a)     apc_pthreadmutex_unlock(&a TSRMLS_CC)
 +#elif defined(APC_SPIN_LOCKS)
 +#define APC_LOCK_TYPE "spin Locks"
 +#define RDLOCK_AVAILABLE 0
@@ -6845,9 +7248,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_lock.h php-5.3.1/ext/apc/apc_lock.h
 +#define apc_lck_t slock_t 
 +#define apc_lck_create(a,b,c,d) apc_slock_create((slock_t*)&(d))
 +#define apc_lck_destroy(a)    apc_slock_destroy(&a)
-+#define apc_lck_lock(a)       apc_slock_lock(&a)
++#define apc_lck_lock(a)       apc_slock_lock(&a TSRMLS_CC)
 +#define apc_lck_nb_lock(a)    apc_slock_nonblocking_lock(&a)
-+#define apc_lck_rdlock(a)     apc_slock_lock(&a)
++#define apc_lck_rdlock(a)     apc_slock_lock(&a TSRMLS_CC)
 +#define apc_lck_unlock(a)     apc_slock_unlock(&a)
 +#else
 +#define APC_LOCK_TYPE "File Locks"
@@ -6858,24 +7261,23 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_lock.h php-5.3.1/ext/apc/apc_lock.h
 +#define NONBLOCKING_LOCK_AVAILABLE 1
 +#endif
 +#define apc_lck_t int
-+#define apc_lck_create(a,b,c,d) d=apc_fcntl_create((a))
++#define apc_lck_create(a,b,c,d) d=apc_fcntl_create((a) TSRMLS_CC)
 +#define apc_lck_destroy(a)    apc_fcntl_destroy(a)
-+#define apc_lck_lock(a)       apc_fcntl_lock(a)
-+#define apc_lck_nb_lock(a)    apc_fcntl_nonblocking_lock(a)
-+#define apc_lck_rdlock(a)     apc_fcntl_rdlock(a)
-+#define apc_lck_unlock(a)     apc_fcntl_unlock(a)
++#define apc_lck_lock(a)       apc_fcntl_lock(a TSRMLS_CC)
++#define apc_lck_nb_lock(a)    apc_fcntl_nonblocking_lock(a TSRMLS_CC)
++#define apc_lck_rdlock(a)     apc_fcntl_rdlock(a TSRMLS_CC)
++#define apc_lck_unlock(a)     apc_fcntl_unlock(a TSRMLS_CC)
 +#endif
 +
 +#endif
-diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
---- php-5.3.1.orig/ext/apc/apc_main.c  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_main.c       1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,957 @@
+--- /dev/null
++++ b/ext/apc/apc_main.c
+@@ -0,0 +1,969 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -6901,7 +7303,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 + */
 +
-+/* $Id: apc_main.c 284282 2009-07-17 21:50:33Z shire $ */
++/* $Id: apc_main.c 304994 2010-10-30 20:33:46Z gopalv $ */
 +
 +#include "apc_php.h"
 +#include "apc_main.h"
@@ -6914,6 +7316,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +#include "apc_stack.h"
 +#include "apc_zend.h"
 +#include "apc_pool.h"
++#include "apc_string.h"
 +#include "SAPI.h"
 +#include "php_scandir.h"
 +#include "ext/standard/php_var.h"
@@ -6942,7 +7345,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +{
 +    int status;
 +
-+
++#if APC_HAVE_LOOKUP_HOOKS
 +    if(lazy && fn.name[0] != '\0' && strncmp(fn.name, "__autoload", fn.name_len) != 0) {
 +        status = zend_hash_add(APCG(lazy_function_table),
 +                              fn.name,
@@ -6950,8 +7353,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +                              &fn,
 +                              sizeof(apc_function_t),
 +                              NULL);
++#else
++    if(0) {
++#endif
 +    } else {
-+        zend_function *func = apc_copy_function_for_execution(fn.function, ctxt);
++        zend_function *func = apc_copy_function_for_execution(fn.function, ctxt TSRMLS_CC);
 +        status = zend_hash_add(EG(function_table),
 +                              fn.name,
 +                              fn.name_len+1,
@@ -6962,7 +7368,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    }
 +
 +    if (status == FAILURE) {
-+        /* apc_eprint("Cannot redeclare %s()", fn.name); */
++        /* apc_error("Cannot redeclare %s()" TSRMLS_CC, fn.name); */
 +    }
 +
 +    return status;
@@ -6976,11 +7382,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    apc_context_t ctxt = {0,};
 +    TSRMLS_FETCH();
 +
-+    ctxt.pool = apc_pool_create(APC_UNPOOL, apc_php_malloc, apc_php_free, apc_sma_protect, apc_sma_unprotect);
++    ctxt.pool = apc_pool_create(APC_UNPOOL, apc_php_malloc, apc_php_free, apc_sma_protect, apc_sma_unprotect TSRMLS_CC);
 +    ctxt.copy = APC_COPY_OUT_OPCODE;
 +
 +    if(zend_hash_quick_find(APCG(lazy_function_table), name, len, hash, (void**)&fn) == SUCCESS) {
-+        *fe = apc_copy_function_for_execution(fn->function, &ctxt);
++        *fe = apc_copy_function_for_execution(fn->function, &ctxt TSRMLS_CC);
 +        status = zend_hash_add(EG(function_table),
 +                                  fn->name,
 +                                  fn->name_len+1,
@@ -7031,7 +7437,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    /*
 +     * XXX: We need to free this somewhere...
 +     */
-+    allocated_ce = apc_php_malloc(sizeof(zend_class_entry*));
++    allocated_ce = apc_php_malloc(sizeof(zend_class_entry*) TSRMLS_CC);
 +
 +    if(!allocated_ce) {
 +        return FAILURE;
@@ -7039,7 +7445,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 +    *allocated_ce =
 +    class_entry =
-+        apc_copy_class_entry_for_execution(cl.class_entry, ctxt);
++        apc_copy_class_entry_for_execution(cl.class_entry, ctxt TSRMLS_CC);
 +
 +
 +    /* restore parent class pointer for compile-time inheritance */
@@ -7062,11 +7468,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +         */
 +        status = zend_lookup_class_ex(cl.parent_name,
 +                                    strlen(cl.parent_name), 
++#ifdef ZEND_ENGINE_2_4
++                                    NULL,
++#endif
 +                                    0,
 +                                    &parent_ptr TSRMLS_CC);
 +        if (status == FAILURE) {
 +            if(APCG(report_autofilter)) {
-+                apc_wprint("Dynamic inheritance detected for class %s", cl.name);
++                apc_warning("Dynamic inheritance detected for class %s" TSRMLS_CC, cl.name);
 +            }
 +            class_entry->parent = NULL;
 +            return status;
@@ -7088,7 +7497,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +                           NULL);
 +
 +    if (status == FAILURE) {
-+        apc_eprint("Cannot redeclare class %s", cl.name);
++        apc_error("Cannot redeclare class %s" TSRMLS_CC, cl.name);
 +    }
 +    return status;
 +}
@@ -7107,16 +7516,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +        return FAILURE;
 +    }
 +
-+    ctxt.pool = apc_pool_create(APC_UNPOOL, apc_php_malloc, apc_php_free, apc_sma_protect, apc_sma_unprotect);
++    ctxt.pool = apc_pool_create(APC_UNPOOL, apc_php_malloc, apc_php_free, apc_sma_protect, apc_sma_unprotect TSRMLS_CC);
 +    ctxt.copy = APC_COPY_OUT_OPCODE;
 +
 +    if(install_class(*cl, &ctxt, 0 TSRMLS_CC) == FAILURE) {
-+        apc_wprint("apc_lookup_class_hook: could not install %s", name);
++        apc_warning("apc_lookup_class_hook: could not install %s" TSRMLS_CC, name);
 +        return FAILURE;
 +    }
 +
 +    if(zend_hash_quick_find(EG(class_table), name, len, hash, (void**)ce) == FAILURE) {
-+        apc_wprint("apc_lookup_class_hook: known error trying to fetch class %s", name);
++        apc_warning("apc_lookup_class_hook: known error trying to fetch class %s" TSRMLS_CC, name);
 +        return FAILURE;
 +    }
 +
@@ -7134,7 +7543,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +                           cl.name,
 +                           cl.name_len+1);
 +    if (status == FAILURE) {
-+        apc_eprint("Cannot delete class %s", cl.name);
++        apc_error("Cannot delete class %s" TSRMLS_CC, cl.name);
 +    }
 +    return status;
 +}
@@ -7182,7 +7591,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +/* {{{ apc_defined_function_hook */
 +int apc_defined_function_hook(zval *internal, zval *user) {
 +    TSRMLS_FETCH();
-+  zend_hash_apply_with_arguments(APCG(lazy_function_table) TSRMLS_CC, (apply_func_args_t) copy_function_name, 2, internal, user);
++    zend_hash_apply_with_arguments(APCG(lazy_function_table) 
++#ifdef ZEND_ENGINE_2_3
++    TSRMLS_CC
++#endif
++    ,(apply_func_args_t) copy_function_name, 2, internal, user);
 +  return 1;
 +}
 +/* }}} */
@@ -7190,22 +7603,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +/* {{{ apc_declared_class_hook */
 +int apc_declared_class_hook(zval *classes, zend_uint mask, zend_uint comply) {
 +    TSRMLS_FETCH();
-+  zend_hash_apply_with_arguments(APCG(lazy_class_table) TSRMLS_CC, (apply_func_args_t) copy_class_or_interface_name, 3, classes, mask, comply);
++    zend_hash_apply_with_arguments(APCG(lazy_class_table) 
++#ifdef ZEND_ENGINE_2_3
++    TSRMLS_CC
++#endif
++    , (apply_func_args_t) copy_class_or_interface_name, 3, classes, mask, comply);
 +  return 1;
 +}
 +/* }}} */
 +
-+/* {{{ compare_file_handles */
-+static int compare_file_handles(void* a, void* b)
-+{
-+    zend_file_handle* fh1 = (zend_file_handle*)a;
-+    zend_file_handle* fh2 = (zend_file_handle*)b;
-+    return (fh1->type == fh2->type && 
-+            fh1->filename == fh2->filename &&
-+            fh1->opened_path == fh2->opened_path);
-+}
-+/* }}} */
-+
 +/* {{{ cached_compile */
 +static zend_op_array* cached_compile(zend_file_handle* h,
 +                                        int type,
@@ -7218,16 +7624,18 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    assert(cache_entry != NULL);
 +
 +    if (cache_entry->data.file.classes) {
++        int lazy_classes = APCG(lazy_classes);
 +        for (i = 0; cache_entry->data.file.classes[i].class_entry != NULL; i++) {
-+            if(install_class(cache_entry->data.file.classes[i], ctxt, APCG(lazy_classes) TSRMLS_CC) == FAILURE) {
++            if(install_class(cache_entry->data.file.classes[i], ctxt, lazy_classes TSRMLS_CC) == FAILURE) {
 +                goto default_compile;
 +            }
 +        }
 +    }
 +
 +    if (cache_entry->data.file.functions) {
++        int lazy_functions = APCG(lazy_functions);
 +        for (i = 0; cache_entry->data.file.functions[i].function != NULL; i++) {
-+            install_function(cache_entry->data.file.functions[i], ctxt, APCG(lazy_functions) TSRMLS_CC);
++            install_function(cache_entry->data.file.functions[i], ctxt, lazy_functions TSRMLS_CC);
 +        }
 +    }
 +
@@ -7238,10 +7646,6 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 +default_compile:
 +
-+    if(APCG(report_autofilter)) {
-+        apc_wprint("Autofiltering %s", h->opened_path);
-+    }
-+
 +    if(cache_entry->data.file.classes) {
 +        for(ii = 0; ii < i ; ii++) {
 +            uninstall_class(cache_entry->data.file.classes[ii] TSRMLS_CC);
@@ -7250,20 +7654,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 +    apc_stack_pop(APCG(cache_stack)); /* pop out cache_entry */
 +
-+    apc_cache_release(apc_cache, cache_entry);
++    apc_cache_release(apc_cache, cache_entry TSRMLS_CC);
 +
 +    /* cannot free up cache data yet, it maybe in use */
 +
-+    zend_llist_del_element(&CG(open_files), h, compare_file_handles); /* We leak fds without this hack */
-+
-+    /* WARNING: zend_llist shallow copies - so element delete via the 
-+     * zend_file_handle_dtor leaves h->opened_path dangling onto bad memory.
-+     */
-+
-+    h->opened_path = NULL;
-+    h->type = ZEND_HANDLE_FILENAME;
-+    if(h->free_filename) h->filename = NULL;
-+
 +    return NULL;
 +}
 +/* }}} */
@@ -7290,9 +7684,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    }
 +
 +    ctxt.pool = apc_pool_create(APC_MEDIUM_POOL, apc_sma_malloc, apc_sma_free, 
-+                                                 apc_sma_protect, apc_sma_unprotect);
++                                                 apc_sma_protect, apc_sma_unprotect TSRMLS_CC);
 +    if (!ctxt.pool) {
-+        apc_wprint("Unable to allocate memory for pool.");
++        apc_warning("Unable to allocate memory for pool." TSRMLS_CC);
 +        return FAILURE;
 +    }
 +    ctxt.copy = APC_COPY_IN_OPCODE;
@@ -7318,10 +7712,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +            PHP_MD5Final(key.md5, &context);
 +            php_stream_close(stream);
 +            if(n<0) {
-+                apc_wprint("Error while reading '%s' for md5 generation.", filename);
++                apc_warning("Error while reading '%s' for md5 generation." TSRMLS_CC, filename);
 +            }
 +        } else {
-+            apc_wprint("Unable to open '%s' for md5 generation.", filename);
++            apc_warning("Unable to open '%s' for md5 generation." TSRMLS_CC, filename);
 +        }
 +    }
 +
@@ -7339,18 +7733,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    path = h->opened_path;
 +    if(!path) path=h->filename;
 +
-+#ifdef __DEBUG_APC__
-+    fprintf(stderr,"2. h->opened_path=[%s]  h->filename=[%s]\n", h->opened_path?h->opened_path:"null",h->filename);
-+#endif
++    apc_debug("2. h->opened_path=[%s]  h->filename=[%s]\n" TSRMLS_CC, h->opened_path?h->opened_path:"null",h->filename);
 +
-+    if(!(*cache_entry = apc_cache_make_file_entry(path, alloc_op_array, alloc_functions, alloc_classes, &ctxt))) {
++    if(!(*cache_entry = apc_cache_make_file_entry(path, alloc_op_array, alloc_functions, alloc_classes, &ctxt TSRMLS_CC))) {
 +        goto freepool;
 +    }
 +
 +    return SUCCESS;
 +
 +freepool:
-+    apc_pool_destroy(ctxt.pool);
++    apc_pool_destroy(ctxt.pool TSRMLS_CC);
 +    ctxt.pool = NULL;
 +
 +    return FAILURE;
@@ -7369,14 +7761,21 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    time_t t;
 +    apc_context_t ctxt = {0,};
 +    int bailout=0;
++      const char* filename = NULL;
 +
 +    if (!APCG(enabled) || apc_cache_busy(apc_cache)) {
 +        return old_compile_file(h, type TSRMLS_CC);
 +    }
 +
++    if(h->opened_path) {
++        filename = h->opened_path;
++    } else {
++        filename = h->filename;
++    }
++
 +    /* check our regular expression filters */
-+    if (APCG(filters) && APCG(compiled_filters) && h->opened_path) {
-+        int ret = apc_regex_match_array(APCG(compiled_filters), h->opened_path);
++    if (APCG(filters) && APCG(compiled_filters) && filename) {
++        int ret = apc_regex_match_array(APCG(compiled_filters), filename);
 +
 +        if(ret == APC_NEGATIVE_MATCH || (ret != APC_POSITIVE_MATCH && !APCG(cache_by_default))) {
 +            return old_compile_file(h, type TSRMLS_CC);
@@ -7389,19 +7788,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 +    t = apc_time();
 +
-+#ifdef __DEBUG_APC__
-+    fprintf(stderr,"1. h->opened_path=[%s]  h->filename=[%s]\n", h->opened_path?h->opened_path:"null",h->filename);
-+#endif
++    apc_debug("1. h->opened_path=[%s]  h->filename=[%s]\n" TSRMLS_CC, h->opened_path?h->opened_path:"null",h->filename);
 +
 +    /* try to create a cache key; if we fail, give up on caching */
 +    if (!apc_cache_make_file_key(&key, h->filename, PG(include_path), t TSRMLS_CC)) {
 +        return old_compile_file(h, type TSRMLS_CC);
 +    }
 +
-+
 +    if(!APCG(force_file_update)) {
 +        /* search for the file in the cache */
-+        cache_entry = apc_cache_find(apc_cache, key, t);
++        cache_entry = apc_cache_find(apc_cache, key, t TSRMLS_CC);
 +        ctxt.force_update = 0;
 +    } else {
 +        cache_entry = NULL;
@@ -7410,40 +7806,45 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 +    if (cache_entry != NULL) {
 +        int dummy = 1;
-+
++        
 +        ctxt.pool = apc_pool_create(APC_UNPOOL, apc_php_malloc, apc_php_free,
-+                                                apc_sma_protect, apc_sma_unprotect);
++                                                apc_sma_protect, apc_sma_unprotect TSRMLS_CC);
 +        if (!ctxt.pool) {
-+            apc_wprint("Unable to allocate memory for pool.");
++            apc_warning("Unable to allocate memory for pool." TSRMLS_CC);
 +            return old_compile_file(h, type TSRMLS_CC);
 +        }
 +        ctxt.copy = APC_COPY_OUT_OPCODE;
++        
++        zend_hash_add(&EG(included_files), cache_entry->data.file.filename, 
++                            strlen(cache_entry->data.file.filename)+1,
++                            (void *)&dummy, sizeof(int), NULL);
 +
-+        if (h->opened_path == NULL) {
-+            h->opened_path = estrdup(cache_entry->data.file.filename);
-+        }
-+        zend_hash_add(&EG(included_files), h->opened_path, strlen(h->opened_path)+1, (void *)&dummy, sizeof(int), NULL);
-+
-+        zend_llist_add_element(&CG(open_files), h); /* We leak fds without this hack */
-+
-+        apc_stack_push(APCG(cache_stack), cache_entry);
++        apc_stack_push(APCG(cache_stack), cache_entry TSRMLS_CC);
 +        op_array = cached_compile(h, type, &ctxt TSRMLS_CC);
++
 +        if(op_array) {
 +#ifdef APC_FILEHITS
 +            /* If the file comes from the cache, add it to the global request file list */
 +            add_next_index_string(APCG(filehits), h->filename, 1);
 +#endif
 +            /* this is an unpool, which has no cleanup - this only free's the pool header */
-+            apc_pool_destroy(ctxt.pool);
++            apc_pool_destroy(ctxt.pool TSRMLS_CC);
++            
++            /* We might leak fds without this hack */
++            if (h->type != ZEND_HANDLE_FILENAME) {
++                zend_llist_add_element(&CG(open_files), h); 
++            }
 +            return op_array;
 +        }
 +        if(APCG(report_autofilter)) {
-+            apc_wprint("Recompiling %s", cache_entry->data.file.filename);
++            apc_warning("Autofiltering %s" TSRMLS_CC, 
++                            (h->opened_path ? h->opened_path : h->filename));
++            apc_warning("Recompiling %s" TSRMLS_CC, cache_entry->data.file.filename);
 +        }
 +        /* TODO: check what happens with EG(included_files) */
 +    }
 +
-+    /* Make sure the mtime reflects the files last known mtime in the case of fpstat==0 */
++    /* Make sure the mtime reflects the files last known mtime, and we respect max_file_size in the case of fpstat==0 */
 +    if(key.type == APC_CACHE_KEY_FPFILE) {
 +        apc_fileinfo_t fileinfo;
 +        struct stat *tmp_buf = NULL;
@@ -7453,13 +7854,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +        if(tmp_buf) {
 +            fileinfo.st_buf.sb = *tmp_buf;
 +        } else {
-+            if (apc_search_paths(h->filename, PG(include_path), &fileinfo) != 0) {
-+#ifdef __DEBUG_APC__
-+                fprintf(stderr,"Stat failed %s - bailing (%s) (%d)\n",h->filename,SG(request_info).path_translated);
-+#endif
-+                return op_array;
++            if (apc_search_paths(h->filename, PG(include_path), &fileinfo TSRMLS_CC) != 0) {
++                apc_debug("Stat failed %s - bailing (%s) (%d)\n" TSRMLS_CC,h->filename,SG(request_info).path_translated);
++                return old_compile_file(h, type TSRMLS_CC);
 +            }
 +        }
++        if (APCG(max_file_size) < fileinfo.st_buf.sb.st_size) { 
++            apc_debug("File is too big %s (%ld) - bailing\n" TSRMLS_CC, h->filename, fileinfo.st_buf.sb.st_size);
++            return old_compile_file(h, type TSRMLS_CC);
++        }
 +        key.mtime = fileinfo.st_buf.sb.st_mtime;
 +    }
 +
@@ -7467,7 +7870,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 +#if NONBLOCKING_LOCK_AVAILABLE
 +    if(APCG(write_lock)) {
-+        if(!apc_cache_write_lock(apc_cache)) {
++        if(!apc_cache_write_lock(apc_cache TSRMLS_CC)) {
 +            HANDLE_UNBLOCK_INTERRUPTIONS();
 +            return old_compile_file(h, type TSRMLS_CC);
 +        }
@@ -7478,8 +7881,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +        if (apc_compile_cache_entry(key, h, type, t, &op_array, &cache_entry TSRMLS_CC) == SUCCESS) {
 +            ctxt.pool = cache_entry->pool;
 +            ctxt.copy = APC_COPY_IN_OPCODE;
-+            if (apc_cache_insert(apc_cache, key, cache_entry, &ctxt, t) != 1) {
-+                apc_pool_destroy(ctxt.pool);
++            if (apc_cache_insert(apc_cache, key, cache_entry, &ctxt, t TSRMLS_CC) != 1) {
++                apc_pool_destroy(ctxt.pool TSRMLS_CC);
 +                ctxt.pool = NULL;
 +            }
 +        }
@@ -7491,7 +7894,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 +#if NONBLOCKING_LOCK_AVAILABLE
 +    if(APCG(write_lock)) {
-+        apc_cache_write_unlock(apc_cache);
++        apc_cache_write_unlock(apc_cache TSRMLS_CC);
 +    }
 +#endif
 +    HANDLE_UNBLOCK_INTERRUPTIONS();
@@ -7506,7 +7909,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +
 +extern int _apc_store(char *strkey, int strkey_len, const zval *val, const unsigned int ttl, const int exclusive TSRMLS_DC);
 +
-+static zval* data_unserialize(const char *filename)
++static zval* data_unserialize(const char *filename TSRMLS_DC)
 +{
 +    zval* retval;
 +    long len = 0;
@@ -7514,7 +7917,6 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    char *contents, *tmp;
 +    FILE *fp;
 +    php_unserialize_data_t var_hash;
-+    TSRMLS_FETCH();
 +
 +    if(VCWD_STAT(filename, &sb) == -1) {
 +        return NULL;
@@ -7570,7 +7972,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +            p[0] = '\0';
 +            key_len = strlen(key);
 +
-+            data = data_unserialize(data_file);
++            data = data_unserialize(data_file TSRMLS_CC);
 +            if(data) {
 +                _apc_store(key, key_len, data, 0, 1 TSRMLS_CC);
 +            }
@@ -7627,12 +8029,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +{
 +    /* apc initialization */
 +#if APC_MMAP
-+    apc_sma_init(APCG(shm_segments), APCG(shm_size)*1024*1024, APCG(mmap_file_mask));
++    apc_sma_init(APCG(shm_segments), APCG(shm_size), APCG(mmap_file_mask) TSRMLS_CC);
 +#else
-+    apc_sma_init(APCG(shm_segments), APCG(shm_size)*1024*1024, NULL);
++    apc_sma_init(APCG(shm_segments), APCG(shm_size), NULL TSRMLS_CC);
 +#endif
-+    apc_cache = apc_cache_create(APCG(num_files_hint), APCG(gc_ttl), APCG(ttl));
-+    apc_user_cache = apc_cache_create(APCG(user_entries_hint), APCG(gc_ttl), APCG(user_ttl));
++    apc_cache = apc_cache_create(APCG(num_files_hint), APCG(gc_ttl), APCG(ttl) TSRMLS_CC);
++    apc_user_cache = apc_cache_create(APCG(user_entries_hint), APCG(gc_ttl), APCG(user_ttl) TSRMLS_CC);
 +
 +    /* override compilation */
 +    old_compile_file = zend_compile_file;
@@ -7655,11 +8057,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +    }
 +#else
 +    if(APCG(lazy_functions) || APCG(lazy_classes)) {
-+        apc_wprint("Lazy function/class loading not available with this version of PHP, please disable APC lazy loading.");
++        apc_warning("Lazy function/class loading not available with this version of PHP, please disable APC lazy loading." TSRMLS_CC);
 +        APCG(lazy_functions) = APCG(lazy_classes) = 0;
 +    }
 +#endif
 +
++#ifdef ZEND_ENGINE_2_4
++    apc_interned_strings_init(TSRMLS_C);
++#endif
++
 +    APCG(initialized) = 1;
 +    return 0;
 +}
@@ -7699,12 +8105,16 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +                    cache_entry->data.file.classes[i].name_len+1);
 +            }
 +        }
-+        apc_cache_release(apc_cache, cache_entry);
++        apc_cache_release(apc_cache, cache_entry TSRMLS_CC);
 +    }
 +
-+    apc_cache_destroy(apc_cache);
-+    apc_cache_destroy(apc_user_cache);
-+    apc_sma_cleanup();
++    apc_cache_destroy(apc_cache TSRMLS_CC);
++    apc_cache_destroy(apc_user_cache TSRMLS_CC);
++    apc_sma_cleanup(TSRMLS_C);
++
++#ifdef ZEND_ENGINE_2_4
++    apc_interned_strings_shutdown(TSRMLS_C);
++#endif
 +
 +    APCG(initialized) = 0;
 +    return 0;
@@ -7760,10 +8170,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +                    cache_entry->data.file.classes[i].name,
 +                    cache_entry->data.file.classes[i].name_len+1);
 +
-+                apc_free_class_entry_after_execution(zce);
++                apc_free_class_entry_after_execution(zce TSRMLS_CC);
 +            }
 +        }
-+        apc_cache_release(apc_cache, cache_entry);
++        apc_cache_release(apc_cache, cache_entry TSRMLS_CC);
 +    }
 +}
 +/* }}} */
@@ -7779,6 +8189,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +        APCG(compiled_filters) = apc_regex_compile_array(APCG(filters) TSRMLS_CC);
 +    }
 +
++#if APC_HAVE_LOOKUP_HOOKS
 +    if(APCG(lazy_functions)) {
 +        APCG(lazy_function_table) = emalloc(sizeof(HashTable));
 +        zend_hash_init(APCG(lazy_function_table), 0, NULL, NULL, 0);
@@ -7787,6 +8198,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +        APCG(lazy_class_table) = emalloc(sizeof(HashTable));
 +        zend_hash_init(APCG(lazy_class_table), 0, NULL, NULL, 0);
 +    }
++#endif
 +
 +#ifdef APC_FILEHITS
 +    ALLOC_INIT_ZVAL(APCG(filehits));
@@ -7799,6 +8211,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +int apc_request_shutdown(TSRMLS_D)
 +{
 +
++#if APC_HAVE_LOOKUP_HOOKS
 +    if(APCG(lazy_class_table)) {
 +        zend_hash_destroy(APCG(lazy_class_table));
 +        efree(APCG(lazy_class_table));
@@ -7807,6 +8220,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 +        zend_hash_destroy(APCG(lazy_function_table));
 +        efree(APCG(lazy_function_table));
 +    }
++#endif
 +
 +    apc_deactivate(TSRMLS_C);
 +
@@ -7828,15 +8242,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.c php-5.3.1/ext/apc/apc_main.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_main.h php-5.3.1/ext/apc/apc_main.h
---- php-5.3.1.orig/ext/apc/apc_main.h  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_main.h       1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_main.h
 @@ -0,0 +1,74 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -7863,7 +8276,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.h php-5.3.1/ext/apc/apc_main.h
 +
 + */
 +
-+/* $Id: apc_main.h 268255 2008-11-04 05:42:11Z rasmus $ */
++/* $Id: apc_main.h 300979 2010-07-04 10:15:05Z kalle $ */
 +
 +#ifndef APC_MAIN_H
 +#define APC_MAIN_H
@@ -7906,15 +8319,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_main.h php-5.3.1/ext/apc/apc_main.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
---- php-5.3.1.orig/ext/apc/apc_mmap.c  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_mmap.c       1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_mmap.c
 @@ -0,0 +1,175 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -7937,7 +8349,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 +
 + */
 +
-+/* $Id: apc_mmap.c 287248 2009-08-13 15:13:52Z gopalv $ */
++/* $Id: apc_mmap.c 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#include "apc.h"
 +#include "apc_mmap.h"
@@ -7965,7 +8377,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 +# define MAP_ANON MAP_ANONYMOUS
 +#endif
 +
-+apc_segment_t apc_mmap(char *file_mask, size_t size)
++apc_segment_t apc_mmap(char *file_mask, size_t size TSRMLS_DC)
 +{
 +    apc_segment_t segment; 
 +
@@ -7976,7 +8388,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 +    /* If no filename was provided, do an anonymous mmap */
 +    if(!file_mask || (file_mask && !strlen(file_mask))) {
 +#if !defined(MAP_ANON)
-+        apc_eprint("Anonymous mmap does not apear to be available on this system (MAP_ANON/MAP_ANONYMOUS).  Please see the apc.mmap_file_mask INI option.");
++        apc_error("Anonymous mmap does not apear to be available on this system (MAP_ANON/MAP_ANONYMOUS).  Please see the apc.mmap_file_mask INI option." TSRMLS_CC);
 +#else
 +        fd = -1;
 +        flags = MAP_SHARED | MAP_ANON;
@@ -7985,7 +8397,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 +    } else if(!strcmp(file_mask,"/dev/zero")) { 
 +        fd = open("/dev/zero", O_RDWR, S_IRUSR | S_IWUSR);
 +        if(fd == -1) {
-+            apc_eprint("apc_mmap: open on /dev/zero failed:");
++            apc_error("apc_mmap: open on /dev/zero failed:" TSRMLS_CC);
 +            goto error;
 +        }
 +        remap = 0; /* cannot remap */
@@ -8001,18 +8413,18 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 +         * path you want here.
 +         */
 +        if(!mktemp(file_mask)) {
-+            apc_eprint("apc_mmap: mktemp on %s failed:", file_mask);
++            apc_error("apc_mmap: mktemp on %s failed:" TSRMLS_CC, file_mask);
 +            goto error;
 +        }
 +        fd = shm_open(file_mask, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
 +        if(fd == -1) {
-+            apc_eprint("apc_mmap: shm_open on %s failed:", file_mask);
++            apc_error("apc_mmap: shm_open on %s failed:" TSRMLS_CC, file_mask);
 +            goto error;
 +        }
 +        if (ftruncate(fd, size) < 0) {
 +            close(fd);
 +            shm_unlink(file_mask);
-+            apc_eprint("apc_mmap: ftruncate failed:");
++            apc_error("apc_mmap: ftruncate failed:" TSRMLS_CC);
 +            goto error;
 +        }
 +        shm_unlink(file_mask);
@@ -8022,13 +8434,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 +         */
 +        fd = mkstemp(file_mask);
 +        if(fd == -1) {
-+            apc_eprint("apc_mmap: mkstemp on %s failed:", file_mask);
++            apc_error("apc_mmap: mkstemp on %s failed:" TSRMLS_CC, file_mask);
 +            goto error;
 +        }
 +        if (ftruncate(fd, size) < 0) {
 +            close(fd);
 +            unlink(file_mask);
-+            apc_eprint("apc_mmap: ftruncate failed:");
++            apc_error("apc_mmap: ftruncate failed:" TSRMLS_CC);
 +            goto error;
 +        }
 +        unlink(file_mask);
@@ -8045,7 +8457,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 +#endif
 +
 +    if((long)segment.shmaddr == -1) {
-+        apc_eprint("apc_mmap: mmap failed:");
++        apc_error("apc_mmap: mmap failed:" TSRMLS_CC);
 +    }
 +
 +    if(fd != -1) close(fd);
@@ -8061,15 +8473,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 +    return segment;
 +}
 +
-+void apc_unmap(apc_segment_t *segment)
++void apc_unmap(apc_segment_t *segment TSRMLS_DC)
 +{
 +    if (munmap(segment->shmaddr, segment->size) < 0) {
-+        apc_wprint("apc_unmap: munmap failed:");
++        apc_warning("apc_unmap: munmap failed:" TSRMLS_CC);
 +    }
 +
 +#ifdef APC_MEMPROTECT
 +    if (segment->roaddr && munmap(segment->roaddr, segment->size) < 0) {
-+        apc_wprint("apc_unmap: munmap failed:");
++        apc_warning("apc_unmap: munmap failed:" TSRMLS_CC);
 +    }
 +#endif
 +
@@ -8085,15 +8497,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.c php-5.3.1/ext/apc/apc_mmap.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.h php-5.3.1/ext/apc/apc_mmap.h
---- php-5.3.1.orig/ext/apc/apc_mmap.h  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_mmap.h       1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_mmap.h
 @@ -0,0 +1,54 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2009 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -8103,7 +8514,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.h php-5.3.1/ext/apc/apc_mmap.h
 +  | 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 V <gopalv@php.net> 
++  | Authors: Gopal V <gopalv@php.net>                                    |
 +  +----------------------------------------------------------------------+
 +
 +   This software was contributed to PHP by Community Connect Inc. in 2002
@@ -8116,7 +8527,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.h php-5.3.1/ext/apc/apc_mmap.h
 +
 + */
 +
-+/* $Id: apc_mmap.h 273456 2009-01-13 14:43:58Z gopalv $ */
++/* $Id: apc_mmap.h 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#ifndef APC_MMAP_H
 +#define APC_MMAP_H
@@ -8129,8 +8540,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.h php-5.3.1/ext/apc/apc_mmap.h
 +/* Wrapper functions for shared memory mapped files */
 +
 +#if APC_MMAP
-+apc_segment_t apc_mmap(char *file_mask, size_t size);
-+void apc_unmap(apc_segment_t* segment);
++apc_segment_t apc_mmap(char *file_mask, size_t size TSRMLS_DC);
++void apc_unmap(apc_segment_t* segment TSRMLS_DC);
 +#endif
 +
 +#endif
@@ -8143,16 +8554,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_mmap.h php-5.3.1/ext/apc/apc_mmap.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc.php php-5.3.1/ext/apc/apc.php
---- php-5.3.1.orig/ext/apc/apc.php     1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc.php  1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc.php
 @@ -0,0 +1,1362 @@
 +<?php
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -8171,7 +8581,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.php php-5.3.1/ext/apc/apc.php
 +
 + */
 +
-+$VERSION='$Id: apc.php 271315 2008-12-16 07:15:07Z shire $';
++$VERSION='$Id: apc.php 304410 2010-10-15 11:21:07Z gopalv $';
 +
 +////////// READ OPTIONAL CONFIGURATION FILE ////////////
 +if (file_exists("apc.conf.php")) include("apc.conf.php");
@@ -8214,7 +8624,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.php php-5.3.1/ext/apc/apc.php
 +$time = time();
 +$host = php_uname('n');
 +if($host) { $host = '('.$host.')'; }
-+if ($_SERVER['SERVER_ADDR']) {
++if (isset($_SERVER['SERVER_ADDR'])) {
 +  $host .= ' ('.$_SERVER['SERVER_ADDR'].')';
 +}
 +
@@ -8892,7 +9302,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.php php-5.3.1/ext/apc/apc.php
 +      
 +if ($AUTHENTICATED) {
 +      echo <<<EOB
-+              <li><a class="aright" href="$MY_SELF&CC=1&OB={$MYREQUEST['OB']}" onClick="javascipt:return confirm('Are you sure?');">Clear $cache_mode Cache</a></li>
++              <li><a class="aright" href="$MY_SELF&CC=1&OB={$MYREQUEST['OB']}" onClick="javascript:return confirm('Are you sure?');">Clear $cache_mode Cache</a></li>
 +EOB;
 +}
 +echo <<<EOB
@@ -9140,14 +9550,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.php php-5.3.1/ext/apc/apc.php
 +                                      echo
 +                                              "<tr class=tr-$m>",
 +                                              "<td class=td-0>",ucwords(preg_replace("/_/"," ",$k)),"</td>",
-+                                              "<td class=td-last>",(preg_match("/time/",$k) && $value!='None') ? date(DATE_FORMAT,$value) : $value,"</td>",
++                                              "<td class=td-last>",(preg_match("/time/",$k) && $value!='None') ? date(DATE_FORMAT,$value) : htmlspecialchars($value, ENT_QUOTES, 'UTF-8'),"</td>",
 +                                              "</tr>";
 +                                      $m=1-$m;
 +                              }
 +                              if($fieldkey=='info') {
 +                                      echo "<tr class=tr-$m><td class=td-0>Stored Value</td><td class=td-last><pre>";
 +                                      $output = var_export(apc_fetch($entry[$fieldkey]),true);
-+                                      echo htmlspecialchars($output);
++                                      echo htmlspecialchars($output, ENT_QUOTES, 'UTF-8');
 +                                      echo "</pre></td></tr>\n";
 +                              }
 +                              break;
@@ -9486,8 +9896,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.php php-5.3.1/ext/apc/apc.php
 +                      } else if (!$i--) {
 +                              break;
 +                      }
-+                      echo "<b><a href=\"http://pecl.php.net/package/APC/$ver\">".htmlspecialchars($v)."</a></b><br><blockquote>";
-+                      echo nl2br(htmlspecialchars(current($match[2])))."</blockquote>";
++                      echo "<b><a href=\"http://pecl.php.net/package/APC/$ver\">".htmlspecialchars($v, ENT_QUOTES, 'UTF-8')."</a></b><br><blockquote>";
++                      echo nl2br(htmlspecialchars(current($match[2]), ENT_QUOTES, 'UTF-8'))."</blockquote>";
 +                      next($match[2]);
 +              }
 +              echo '</td></tr>';
@@ -9509,15 +9919,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc.php php-5.3.1/ext/apc/apc.php
 +<!-- <?php echo "\nBased on APCGUI By R.Becker\n$VERSION\n"?> -->
 +</body>
 +</html>
-diff -Naur php-5.3.1.orig/ext/apc/apc_php.h php-5.3.1/ext/apc/apc_php.h
---- php-5.3.1.orig/ext/apc/apc_php.h   1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_php.h        1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,74 @@
+--- /dev/null
++++ b/ext/apc/apc_php.h
+@@ -0,0 +1,77 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -9544,7 +9953,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_php.h php-5.3.1/ext/apc/apc_php.h
 +
 + */
 +
-+/* $Id: apc_php.h 268255 2008-11-04 05:42:11Z rasmus $ */
++/* $Id: apc_php.h 300979 2010-07-04 10:15:05Z kalle $ */
 +
 +#ifndef APC_PHP_H
 +#define APC_PHP_H
@@ -9562,6 +9971,9 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_php.h php-5.3.1/ext/apc/apc_php.h
 +#include "zend_hash.h"
 +#include "zend_extensions.h"
 +
++#if ZEND_MODULE_API_NO >= 20100409
++#define ZEND_ENGINE_2_4
++#endif
 +#if ZEND_MODULE_API_NO > 20060613
 +#define ZEND_ENGINE_2_3
 +#endif
@@ -9587,15 +9999,115 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_php.h php-5.3.1/ext/apc/apc_php.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
---- php-5.3.1.orig/ext/apc/apc_pool.c  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_pool.c       1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,484 @@
+--- /dev/null
++++ b/ext/apc/apc_php_pcre.h
+@@ -0,0 +1,98 @@
++/*
++   +----------------------------------------------------------------------+
++   | APC/PHP Version 5                                                    |
++   +----------------------------------------------------------------------+
++   | Copyright (c) 1997-2010 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.               |
++   +----------------------------------------------------------------------+
++   | Author: Andrei Zmievski <andrei@php.net>                             |
++   +----------------------------------------------------------------------+
++ */
++ 
++/* $Id: apc_php_pcre.h 300979 2010-07-04 10:15:05Z kalle $ */
++
++#ifndef PHP_PCRE_H
++#define PHP_PCRE_H
++
++#if HAVE_PCRE || HAVE_BUNDLED_PCRE
++
++#if HAVE_BUNDLED_PCRE
++#include "ext/pcre/pcrelib/pcre.h"
++#else
++#include "pcre.h"
++#endif
++
++#if HAVE_LOCALE_H
++#include <locale.h>
++#endif
++
++PHP_FUNCTION(preg_match);
++PHP_FUNCTION(preg_match_all);
++PHP_FUNCTION(preg_replace);
++PHP_FUNCTION(preg_replace_callback);
++PHP_FUNCTION(preg_split);
++PHP_FUNCTION(preg_quote);
++PHP_FUNCTION(preg_grep);
++
++PHPAPI char *php_pcre_replace(char *regex, int regex_len, char *subject, int subject_len, zval *replace_val, int is_callable_replace, int *result_len, int limit, int *replace_count TSRMLS_DC);
++PHPAPI pcre* pcre_get_compiled_regex(char *regex, pcre_extra **extra, int *options TSRMLS_DC);
++PHPAPI pcre* pcre_get_compiled_regex_ex(char *regex, pcre_extra **extra, int *preg_options, int *coptions TSRMLS_DC);
++
++extern zend_module_entry pcre_module_entry;
++#define pcre_module_ptr &pcre_module_entry
++
++typedef struct {
++      pcre *re;
++      pcre_extra *extra;
++      int preg_options;
++#if HAVE_SETLOCALE
++      char *locale;
++      unsigned const char *tables;
++#endif
++      int compile_options;
++      int refcount;
++} pcre_cache_entry;
++
++PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(char *regex, int regex_len TSRMLS_DC);
++
++PHPAPI void  php_pcre_match_impl(  pcre_cache_entry *pce, char *subject, int subject_len, zval *return_value,
++      zval *subpats, int global, int use_flags, long flags, long start_offset TSRMLS_DC);
++
++PHPAPI char *php_pcre_replace_impl(pcre_cache_entry *pce, char *subject, int subject_len, zval *return_value, 
++      int is_callable_replace, int *result_len, int limit, int *replace_count TSRMLS_DC);
++
++PHPAPI void  php_pcre_split_impl(  pcre_cache_entry *pce, char *subject, int subject_len, zval *return_value,
++      long limit_val, long flags TSRMLS_DC);
++
++PHPAPI void  php_pcre_grep_impl(   pcre_cache_entry *pce, zval *input, zval *return_value,
++      long flags TSRMLS_DC);
++
++ZEND_BEGIN_MODULE_GLOBALS(pcre)
++      HashTable pcre_cache;
++      long backtrack_limit;
++      long recursion_limit;
++      int  error_code;
++ZEND_END_MODULE_GLOBALS(pcre)
++
++#ifdef ZTS
++# define PCRE_G(v) TSRMG(pcre_globals_id, zend_pcre_globals *, v)
++#else
++# define PCRE_G(v)    (pcre_globals.v)
++#endif
++
++#else
++
++#define pcre_module_ptr NULL
++
++#endif /* HAVE_PCRE || HAVE_BUNDLED_PCRE */
++
++#define phpext_pcre_ptr pcre_module_ptr
++
++#endif /* PHP_PCRE_H */
+--- /dev/null
++++ b/ext/apc/apc_pool.c
+@@ -0,0 +1,488 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2008 The PHP Group                                     |
++  | Copyright (c) 2006-2010 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        |
@@ -9618,7 +10130,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +
 + */
 +
-+/* $Id: apc_pool.c 281353 2009-05-28 23:45:08Z kalle $ */
++/* $Id: apc_pool.c 301964 2010-08-07 03:34:18Z rasmus $ */
 +
 +
 +#include "apc_pool.h"
@@ -9630,8 +10142,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +
 +
 +/* {{{ forward references */
-+static apc_pool* apc_unpool_create(apc_pool_type type, apc_malloc_t, apc_free_t, apc_protect_t, apc_unprotect_t);
-+static apc_pool* apc_realpool_create(apc_pool_type type, apc_malloc_t, apc_free_t, apc_protect_t, apc_unprotect_t);
++static apc_pool* apc_unpool_create(apc_pool_type type, apc_malloc_t, apc_free_t, apc_protect_t, apc_unprotect_t TSRMLS_DC);
++static apc_pool* apc_realpool_create(apc_pool_type type, apc_malloc_t, apc_free_t, apc_protect_t, apc_unprotect_t TSRMLS_DC);
 +/* }}} */
 +
 +/* {{{ apc_pool_create */
@@ -9639,26 +10151,27 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +                            apc_malloc_t allocate, 
 +                            apc_free_t deallocate,
 +                            apc_protect_t protect,
-+                            apc_unprotect_t unprotect)
++                            apc_unprotect_t unprotect
++                          TSRMLS_DC)
 +{
 +    if(pool_type == APC_UNPOOL) {
 +        return apc_unpool_create(pool_type, allocate, deallocate,
-+                                            protect, unprotect );
++                                            protect, unprotect TSRMLS_CC);
 +    }
 +
 +    return apc_realpool_create(pool_type, allocate, deallocate, 
-+                                          protect,  unprotect );
++                                          protect,  unprotect TSRMLS_CC);
 +}
 +/* }}} */
 +
 +/* {{{ apc_pool_destroy */
-+void apc_pool_destroy(apc_pool *pool)
++void apc_pool_destroy(apc_pool *pool TSRMLS_DC)
 +{
 +    apc_free_t deallocate = pool->deallocate;
 +    apc_pcleanup_t cleanup = pool->cleanup;
 +
-+    cleanup(pool);
-+    deallocate(pool);
++    cleanup(pool TSRMLS_CC);
++    deallocate(pool TSRMLS_CC);
 +}
 +/* }}} */
 +
@@ -9671,7 +10184,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +    /* apc_unpool is a lie! */
 +};
 +
-+static void* apc_unpool_alloc(apc_pool* pool, size_t size) 
++static void* apc_unpool_alloc(apc_pool* pool, size_t size TSRMLS_DC
 +{
 +    apc_unpool *upool = (apc_unpool*)pool;
 +
@@ -9680,27 +10193,28 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +    upool->parent.size += size;
 +    upool->parent.used += size;
 +
-+    return allocate(size);
++    return allocate(size TSRMLS_CC);
 +}
 +
-+static void apc_unpool_free(apc_pool* pool, void *ptr)
++static void apc_unpool_free(apc_pool* pool, void *ptr TSRMLS_DC)
 +{
 +    apc_unpool *upool = (apc_unpool*) pool;
 +
 +    apc_free_t deallocate = upool->parent.deallocate;
 +
-+    deallocate(ptr);
++    deallocate(ptr TSRMLS_CC);
 +}
 +
-+static void apc_unpool_cleanup(apc_pool* pool)
++static void apc_unpool_cleanup(apc_pool* pool TSRMLS_DC)
 +{
 +}
 +
 +static apc_pool* apc_unpool_create(apc_pool_type type, 
 +                    apc_malloc_t allocate, apc_free_t deallocate,
-+                    apc_protect_t protect, apc_unprotect_t unprotect)
++                    apc_protect_t protect, apc_unprotect_t unprotect
++                  TSRMLS_DC)
 +{
-+    apc_unpool* upool = allocate(sizeof(apc_unpool));
++    apc_unpool* upool = allocate(sizeof(apc_unpool) TSRMLS_CC);
 +
 +    if (!upool) {
 +        return NULL;
@@ -9797,13 +10311,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +} while(0)
 +
 +/* {{{ create_pool_block */
-+static pool_block* create_pool_block(apc_realpool *rpool, size_t size)
++static pool_block* create_pool_block(apc_realpool *rpool, size_t size TSRMLS_DC)
 +{
 +    apc_malloc_t allocate = rpool->parent.allocate;
 +
 +    size_t realsize = sizeof(pool_block) + ALIGNWORD(size);
 +
-+    pool_block* entry = allocate(realsize);
++    pool_block* entry = allocate(realsize TSRMLS_CC);
 +
 +    if (!entry) {
 +        return NULL;
@@ -9818,7 +10332,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +/* }}} */
 +
 +/* {{{ apc_realpool_alloc */
-+static void* apc_realpool_alloc(apc_pool *pool, size_t size)
++static void* apc_realpool_alloc(apc_pool *pool, size_t size TSRMLS_DC)
 +{
 +    apc_realpool *rpool = (apc_realpool*)pool;
 +    unsigned char *p = NULL;
@@ -9827,9 +10341,8 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +    unsigned char *redzone  = NULL;
 +    size_t redsize  = 0;
 +    size_t *sizeinfo= NULL;
-+
-+    pool_block *entry;
-+
++    pool_block *entry = NULL;
++    
 +    if(APC_POOL_HAS_REDZONES(pool)) {
 +        redsize = REDZONE_SIZE(size); /* redsize might be re-using word size padding */
 +        realsize = size + redsize;    /* recalculating realsize */
@@ -9850,7 +10363,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +
 +    poolsize = ALIGNSIZE(realsize, rpool->dsize);
 +
-+    entry = create_pool_block(rpool, poolsize);
++    entry = create_pool_block(rpool, poolsize TSRMLS_CC);
 +
 +    if(!entry) {
 +        return NULL;
@@ -9951,18 +10464,18 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +}
 +/* }}} */
 +
-+/* {{{ apc_pool_free */
++/* {{{ apc_realpool_free */
 +/*
 + * free does not do anything other than
 + * check for redzone values when free'ing
 + * data areas.
 + */
-+static void apc_realpool_free(apc_pool *pool, void *p)
++static void apc_realpool_free(apc_pool *pool, void *p TSRMLS_DC)
 +{
 +}
 +/* }}} */
 +
-+static void apc_realpool_cleanup(apc_pool *pool) 
++static void apc_realpool_cleanup(apc_pool *pool TSRMLS_DC
 +{
 +    pool_block *entry;
 +    pool_block *tmp;
@@ -9975,14 +10488,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +
 +    while(entry->next != NULL) {
 +        tmp = entry->next;
-+        deallocate(entry);
++        deallocate(entry TSRMLS_CC);
 +        entry = tmp;
 +    }
 +}
 +
 +/* {{{ apc_realpool_create */
 +static apc_pool* apc_realpool_create(apc_pool_type type, apc_malloc_t allocate, apc_free_t deallocate, 
-+                                                         apc_protect_t protect, apc_unprotect_t unprotect)
++                                                         apc_protect_t protect, apc_unprotect_t unprotect
++                                                         TSRMLS_DC)
 +{
 +
 +    size_t dsize = 0;
@@ -10005,7 +10519,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +            return NULL;
 +    }
 +
-+    rpool = (apc_realpool*)allocate(sizeof(apc_realpool) + ALIGNWORD(dsize));
++    rpool = (apc_realpool*)allocate((sizeof(apc_realpool) + ALIGNWORD(dsize)) TSRMLS_CC);
 +
 +    if(!rpool) {
 +        return NULL;
@@ -10043,19 +10557,21 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 +    /* put all ye sanity checks here */
 +    assert(sizeof(decaff) > REDZONE_SIZE(ALIGNWORD(sizeof(char))));
 +    assert(sizeof(pool_block) == ALIGNWORD(sizeof(pool_block)));
++#if APC_POOL_DEBUG
 +    assert((APC_POOL_SIZE_MASK & (APC_POOL_SIZEINFO | APC_POOL_REDZONES)) == 0);
++#endif
 +}
 +/* }}} */
 +
 +/* {{{ apc_pstrdup */
-+void* apc_pstrdup(const char* s, apc_pool* pool)
++void* apc_pstrdup(const char* s, apc_pool* pool TSRMLS_DC)
 +{
-+    return s != NULL ? apc_pmemcpy(s, strlen(s)+1, pool) : NULL;
++    return s != NULL ? apc_pmemcpy(s, (strlen(s) + 1), pool TSRMLS_CC) : NULL;
 +}
 +/* }}} */
 +
 +/* {{{ apc_pmemcpy */
-+void* apc_pmemcpy(const void* p, size_t n, apc_pool* pool)
++void* apc_pmemcpy(const void* p, size_t n, apc_pool* pool TSRMLS_DC)
 +{
 +    void* q;
 +
@@ -10075,15 +10591,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.c php-5.3.1/ext/apc/apc_pool.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_pool.h php-5.3.1/ext/apc/apc_pool.h
---- php-5.3.1.orig/ext/apc/apc_pool.h  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_pool.h       1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,102 @@
+--- /dev/null
++++ b/ext/apc/apc_pool.h
+@@ -0,0 +1,114 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2008 The PHP Group                                     |
++  | Copyright (c) 2006-2010 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        |
@@ -10106,7 +10621,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.h php-5.3.1/ext/apc/apc_pool.h
 +
 + */
 +
-+/* $Id: apc_pool.h 275212 2009-02-05 08:36:26Z gopalv $ */
++/* $Id: apc_pool.h 301682 2010-07-29 11:09:00Z gopalv $ */
 +
 +#ifndef APC_POOL_H
 +#define APC_POOL_H
@@ -10114,26 +10629,37 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.h php-5.3.1/ext/apc/apc_pool.h
 +#include "apc.h"
 +#include "apc_sma.h"
 +
++/* #define APC_POOL_DEBUG 1 */
++
 +typedef enum {
 +    APC_UNPOOL         = 0x0,
 +    APC_SMALL_POOL     = 0x1,
 +    APC_MEDIUM_POOL    = 0x2,
 +    APC_LARGE_POOL     = 0x3,
 +    APC_POOL_SIZE_MASK = 0x7,   /* waste a bit */
++#if APC_POOL_DEBUG
 +    APC_POOL_REDZONES  = 0x08,
 +    APC_POOL_SIZEINFO  = 0x10,
 +    APC_POOL_OPT_MASK  = 0x18
++#endif
 +} apc_pool_type;
 +
++#if APC_POOL_DEBUG
 +#define APC_POOL_HAS_SIZEINFO(pool) ((pool->type & APC_POOL_SIZEINFO)!=0)
 +#define APC_POOL_HAS_REDZONES(pool) ((pool->type & APC_POOL_REDZONES)!=0)
++#else
++/* let gcc optimize away the optional features */
++#define APC_POOL_HAS_SIZEINFO(pool) (0)
++#define APC_POOL_HAS_REDZONES(pool) (0)
++#endif
++
 +
 +typedef struct _apc_pool apc_pool;
 +
-+typedef void  (*apc_pcleanup_t)(apc_pool *pool);
++typedef void  (*apc_pcleanup_t)(apc_pool *pool TSRMLS_DC);
 +
-+typedef void* (*apc_palloc_t)(apc_pool *pool, size_t size);
-+typedef void  (*apc_pfree_t) (apc_pool *pool, void* p);
++typedef void* (*apc_palloc_t)(apc_pool *pool, size_t size TSRMLS_DC);
++typedef void  (*apc_pfree_t) (apc_pool *pool, void* p TSRMLS_DC);
 +
 +typedef void* (*apc_protect_t)  (void *p);
 +typedef void* (*apc_unprotect_t)(void *p);
@@ -10158,13 +10684,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.h php-5.3.1/ext/apc/apc_pool.h
 +    /* apc_realpool and apc_unpool add more here */
 +};
 +
-+#define apc_pool_alloc(pool, size) ((pool)->palloc((pool), (size)))
-+#define apc_pool_free (pool, ptr)  ((pool)->pfree((pool), (ptr)))
++#define apc_pool_alloc(pool, size)  ((void *) pool->palloc(pool, size TSRMLS_CC))
++#define apc_pool_free(pool, ptr)      ((void)   pool->pfree (pool, ptr TSRMLS_CC))
 +
-+#define apc_pool_protect (pool, ptr)  (pool->protect ? \
++#define apc_pool_protect(pool, ptr)  (pool->protect ? \
 +                                                                              (pool)->protect((ptr)) : (ptr))
 +
-+#define apc_pool_unprotect (pool, ptr)  (pool->unprotect ? \
++#define apc_pool_unprotect(pool, ptr)  (pool->unprotect ? \
 +                                                                                      (pool)->unprotect((ptr)) : (ptr))
 +
 +extern void apc_pool_init();
@@ -10173,23 +10699,23 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pool.h php-5.3.1/ext/apc/apc_pool.h
 +                            apc_malloc_t allocate,
 +                            apc_free_t deallocate,
 +                                                      apc_protect_t protect,
-+                                                      apc_unprotect_t unprotect);
++                                                      apc_unprotect_t unprotect
++                                                      TSRMLS_DC);
 +
-+extern void apc_pool_destroy(apc_pool* pool);
++extern void apc_pool_destroy(apc_pool* pool TSRMLS_DC);
 +
-+extern void* apc_pmemcpy(const void* p, size_t n, apc_pool* pool);
-+extern void* apc_pstrdup(const char* s, apc_pool* pool);
++extern void* apc_pmemcpy(const void* p, size_t n, apc_pool* pool TSRMLS_DC);
++extern void* apc_pstrdup(const char* s, apc_pool* pool TSRMLS_DC);
 +
 +#endif
-diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.c php-5.3.1/ext/apc/apc_pthreadmutex.c
---- php-5.3.1.orig/ext/apc/apc_pthreadmutex.c  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_pthreadmutex.c       1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_pthreadmutex.c
 @@ -0,0 +1,111 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -10204,13 +10730,13 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.c php-5.3.1/ext/apc/apc_pthre
 +
 + */
 +
-+/* $Id: apc_pthreadmutex.c 268255 2008-11-04 05:42:11Z rasmus $ */
++/* $Id: apc_pthreadmutex.c 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#include "apc_pthreadmutex.h"
 +
 +#ifdef APC_PTHREADMUTEX_LOCKS
 +
-+pthread_mutex_t *apc_pthreadmutex_create(pthread_mutex_t *lock) 
++pthread_mutex_t *apc_pthreadmutex_create(pthread_mutex_t *lock TSRMLS_DC
 +{
 +    int result;
 +    pthread_mutexattr_t* attr;
@@ -10218,32 +10744,32 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.c php-5.3.1/ext/apc/apc_pthre
 +
 +    result = pthread_mutexattr_init(attr);
 +    if(result == ENOMEM) {
-+        apc_eprint("pthread mutex error: Insufficient memory exists to create the mutex attribute object.");
++        apc_error("pthread mutex error: Insufficient memory exists to create the mutex attribute object." TSRMLS_CC);
 +    } else if(result == EINVAL) {
-+        apc_eprint("pthread mutex error: attr does not point to writeable memory.");
++        apc_error("pthread mutex error: attr does not point to writeable memory." TSRMLS_CC);
 +    } else if(result == EFAULT) {
-+        apc_eprint("pthread mutex error: attr is an invalid pointer.");
++        apc_error("pthread mutex error: attr is an invalid pointer." TSRMLS_CC);
 +    }
 +
 +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
 +       result = pthread_mutexattr_settype(attr, PTHREAD_MUTEX_ADAPTIVE_NP);
 +       if (result == EINVAL) {
-+               apc_eprint("pthread_mutexattr_settype: unable to set adaptive mutexes");
++               apc_error("pthread_mutexattr_settype: unable to set adaptive mutexes" TSRMLS_CC);
 +       }
 +#endif
 +
 +    /* pthread_mutexattr_settype(attr, PTHREAD_MUTEX_ERRORCHECK); */
 +    result = pthread_mutexattr_setpshared(attr, PTHREAD_PROCESS_SHARED);
 +    if(result == EINVAL) {
-+        apc_eprint("pthread mutex error: attr is not an initialized mutex attribute object, or pshared is not a valid process-shared state setting.");
++        apc_error("pthread mutex error: attr is not an initialized mutex attribute object, or pshared is not a valid process-shared state setting." TSRMLS_CC);
 +    } else if(result == EFAULT) {
-+        apc_eprint("pthread mutex error: attr is an invalid pointer.");
++        apc_error("pthread mutex error: attr is an invalid pointer." TSRMLS_CC);
 +    } else if(result == ENOTSUP) {
-+        apc_eprint("pthread mutex error: pshared was set to PTHREAD_PROCESS_SHARED.");
++        apc_error("pthread mutex error: pshared was set to PTHREAD_PROCESS_SHARED." TSRMLS_CC);
 +    }
 +
 +    if(pthread_mutex_init(lock, attr)) { 
-+        apc_eprint("unable to initialize pthread lock");
++        apc_error("unable to initialize pthread lock" TSRMLS_CC);
 +    }
 +    return lock;
 +}
@@ -10253,25 +10779,25 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.c php-5.3.1/ext/apc/apc_pthre
 +    return; /* we don't actually destroy the mutex, as it would destroy it for all processes */
 +}
 +
-+void apc_pthreadmutex_lock(pthread_mutex_t *lock)
++void apc_pthreadmutex_lock(pthread_mutex_t *lock TSRMLS_DC)
 +{
 +    int result;
 +    result = pthread_mutex_lock(lock);
 +    if(result == EINVAL) {
-+        apc_eprint("unable to obtain pthread lock (EINVAL)");
++        apc_error("unable to obtain pthread lock (EINVAL)" TSRMLS_CC);
 +    } else if(result == EDEADLK) {
-+        apc_eprint("unable to obtain pthread lock (EDEADLK)");
++        apc_error("unable to obtain pthread lock (EDEADLK)" TSRMLS_CC);
 +    }
 +}
 +
-+void apc_pthreadmutex_unlock(pthread_mutex_t *lock)
++void apc_pthreadmutex_unlock(pthread_mutex_t *lock TSRMLS_DC)
 +{
 +    if(pthread_mutex_unlock(lock)) {
-+        apc_eprint("unable to unlock pthread lock");
++        apc_error("unable to unlock pthread lock" TSRMLS_CC);
 +    }
 +}
 +
-+zend_bool apc_pthreadmutex_nonblocking_lock(pthread_mutex_t *lock)
++zend_bool apc_pthreadmutex_nonblocking_lock(pthread_mutex_t *lock TSRMLS_DC)
 +{
 +    int rval;
 +    rval = pthread_mutex_trylock(lock);
@@ -10280,7 +10806,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.c php-5.3.1/ext/apc/apc_pthre
 +    } else if(rval == 0) {  /* Obtained lock */
 +        return 1;
 +    } else {                /* Other error */
-+        apc_eprint("unable to obtain pthread trylock");
++        apc_error("unable to obtain pthread trylock" TSRMLS_CC);
 +        return 0;
 +    }
 +}
@@ -10296,15 +10822,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.c php-5.3.1/ext/apc/apc_pthre
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.h php-5.3.1/ext/apc/apc_pthreadmutex.h
---- php-5.3.1.orig/ext/apc/apc_pthreadmutex.h  1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_pthreadmutex.h       1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_pthreadmutex.h
 @@ -0,0 +1,48 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -10319,7 +10844,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.h php-5.3.1/ext/apc/apc_pthre
 +
 + */
 +
-+/* $Id: apc_pthreadmutex.h 268255 2008-11-04 05:42:11Z rasmus $ */
++/* $Id: apc_pthreadmutex.h 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#ifndef APC_PTHREADMUTEX_H
 +#define APC_PTHREADMUTEX_H
@@ -10330,11 +10855,11 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.h php-5.3.1/ext/apc/apc_pthre
 +
 +#include <pthread.h>
 +
-+pthread_mutex_t *apc_pthreadmutex_create();
++pthread_mutex_t *apc_pthreadmutex_create(pthread_mutex_t *lock TSRMLS_DC);
 +void apc_pthreadmutex_destroy(pthread_mutex_t *lock);
-+void apc_pthreadmutex_lock(pthread_mutex_t *lock);
-+void apc_pthreadmutex_unlock(pthread_mutex_t *lock);
-+zend_bool apc_pthreadmutex_nonblocking_lock(pthread_mutex_t *lock);
++void apc_pthreadmutex_lock(pthread_mutex_t *lock TSRMLS_DC);
++void apc_pthreadmutex_unlock(pthread_mutex_t *lock TSRMLS_DC);
++zend_bool apc_pthreadmutex_nonblocking_lock(pthread_mutex_t *lock TSRMLS_DC);
 +
 +#endif
 +
@@ -10348,15 +10873,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_pthreadmutex.h php-5.3.1/ext/apc/apc_pthre
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
---- php-5.3.1.orig/ext/apc/apc_rfc1867.c       1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_rfc1867.c    1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,214 @@
+--- /dev/null
++++ b/ext/apc/apc_rfc1867.c
+@@ -0,0 +1,232 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -10379,7 +10903,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
 +
 + */
 +
-+/* $Id: apc_rfc1867.c 284580 2009-07-22 06:05:31Z kalle $*/
++/* $Id: apc_rfc1867.c 305798 2010-11-28 13:43:20Z gopalv $*/
 +
 +#include "apc.h"
 +#include "apc_globals.h"
@@ -10443,8 +10967,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
 +                RFC1867_DATA(key_length)        = 0;
 +                RFC1867_DATA(start_time)        = my_time();
 +                RFC1867_DATA(bytes_processed)   = 0;
++                RFC1867_DATA(prev_bytes_processed) = 0;
 +                RFC1867_DATA(rate)              = 0;
 +                RFC1867_DATA(update_freq)       = (int) APCG(rfc1867_freq);
++                RFC1867_DATA(started)           = 0;
 +                
 +                if(RFC1867_DATA(update_freq) < 0) {  // frequency is a percentage, not bytes
 +                    RFC1867_DATA(update_freq) = (int) (RFC1867_DATA(content_length) * APCG(rfc1867_freq) / 100); 
@@ -10457,7 +10983,20 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
 +                int prefix_len = strlen(APCG(rfc1867_prefix));
 +                multipart_event_formdata *data = (multipart_event_formdata *) event_data;
 +                if(data->name && !strncasecmp(data->name, APCG(rfc1867_name), strlen(APCG(rfc1867_name))) 
-+                    && data->value && data->length && data->length < sizeof(RFC1867_DATA(tracking_key)) - prefix_len) {
++                    && data->value && data->length) { 
++                    
++                    if(data->length >= sizeof(RFC1867_DATA(tracking_key)) - prefix_len) {
++                        apc_warning("Key too long for '%s'. Maximum size is '%d' characters." TSRMLS_CC, 
++                                    APCG(rfc1867_name), 
++                                    sizeof(RFC1867_DATA(tracking_key)) - prefix_len);
++                        break;
++                    }
++
++                    if(RFC1867_DATA(started)) {
++                        apc_warning("Upload progress key '%s' should be before the file upload entry in the form." TSRMLS_CC, 
++                                    APCG(rfc1867_name)); 
++                        break;
++                    }
 +
 +                    strlcat(RFC1867_DATA(tracking_key), APCG(rfc1867_prefix), 63);
 +                    strlcat(RFC1867_DATA(tracking_key), *data->value, 63);
@@ -10468,23 +11007,26 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
 +            break;
 +
 +        case MULTIPART_EVENT_FILE_START:
-+            if(*RFC1867_DATA(tracking_key)) {
-+                multipart_event_file_start *data = (multipart_event_file_start *) event_data;
++            {
++                RFC1867_DATA(started) = 1;
++                if(*RFC1867_DATA(tracking_key)) {
++                    multipart_event_file_start *data = (multipart_event_file_start *) event_data;
 +
-+                RFC1867_DATA(bytes_processed) = data->post_bytes_processed;
-+                strncpy(RFC1867_DATA(filename),*data->filename,127);
-+                RFC1867_DATA(temp_filename) = NULL;
-+                strncpy(RFC1867_DATA(name),data->name,63);
-+                ALLOC_INIT_ZVAL(track);
-+                array_init(track);
-+                add_assoc_long(track, "total", RFC1867_DATA(content_length));
-+                add_assoc_long(track, "current", RFC1867_DATA(bytes_processed));
-+                add_assoc_string(track, "filename", RFC1867_DATA(filename), 1);
-+                add_assoc_string(track, "name", RFC1867_DATA(name), 1);
-+                add_assoc_long(track, "done", 0);
-+                add_assoc_double(track, "start_time", RFC1867_DATA(start_time));
-+                _apc_store(RFC1867_DATA(tracking_key), RFC1867_DATA(key_length), track, 3600, 0 TSRMLS_CC);
-+                zval_ptr_dtor(&track);
++                    RFC1867_DATA(bytes_processed) = data->post_bytes_processed;
++                    strlcpy(RFC1867_DATA(filename),*data->filename,128);
++                    RFC1867_DATA(temp_filename) = NULL;
++                    strlcpy(RFC1867_DATA(name),data->name,64);
++                    ALLOC_INIT_ZVAL(track);
++                    array_init(track);
++                    add_assoc_long(track, "total", RFC1867_DATA(content_length));
++                    add_assoc_long(track, "current", RFC1867_DATA(bytes_processed));
++                    add_assoc_string(track, "filename", RFC1867_DATA(filename), 1);
++                    add_assoc_string(track, "name", RFC1867_DATA(name), 1);
++                    add_assoc_long(track, "done", 0);
++                    add_assoc_double(track, "start_time", RFC1867_DATA(start_time));
++                    _apc_store(RFC1867_DATA(tracking_key), RFC1867_DATA(key_length)+1, track, APCG(rfc1867_ttl), 0 TSRMLS_CC);
++                    zval_ptr_dtor(&track);
++                }
 +            }
 +            break;
 +
@@ -10502,7 +11044,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
 +                        add_assoc_string(track, "name", RFC1867_DATA(name), 1);
 +                        add_assoc_long(track, "done", 0);
 +                        add_assoc_double(track, "start_time", RFC1867_DATA(start_time));
-+                        _apc_store(RFC1867_DATA(tracking_key), RFC1867_DATA(key_length), track, 3600, 0 TSRMLS_CC);
++                        _apc_store(RFC1867_DATA(tracking_key), RFC1867_DATA(key_length)+1, track, APCG(rfc1867_ttl), 0 TSRMLS_CC);
 +                        zval_ptr_dtor(&track);
 +                    }
 +                    RFC1867_DATA(prev_bytes_processed) = RFC1867_DATA(bytes_processed);
@@ -10526,7 +11068,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
 +                add_assoc_long(track, "cancel_upload", RFC1867_DATA(cancel_upload));
 +                add_assoc_long(track, "done", 0);
 +                add_assoc_double(track, "start_time", RFC1867_DATA(start_time));
-+                _apc_store(RFC1867_DATA(tracking_key), RFC1867_DATA(key_length), track, 3600, 0 TSRMLS_CC);
++                _apc_store(RFC1867_DATA(tracking_key), RFC1867_DATA(key_length)+1, track, APCG(rfc1867_ttl), 0 TSRMLS_CC);
 +                zval_ptr_dtor(&track);
 +            }
 +            break;
@@ -10548,7 +11090,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
 +                add_assoc_long(track, "cancel_upload", RFC1867_DATA(cancel_upload));
 +                add_assoc_long(track, "done", 1);
 +                add_assoc_double(track, "start_time", RFC1867_DATA(start_time));
-+                _apc_store(RFC1867_DATA(tracking_key), RFC1867_DATA(key_length), track, APCG(rfc1867_ttl), 0 TSRMLS_CC);
++                _apc_store(RFC1867_DATA(tracking_key), RFC1867_DATA(key_length)+1, track, APCG(rfc1867_ttl), 0 TSRMLS_CC);
 +                zval_ptr_dtor(&track);
 +            }
 +            break;
@@ -10566,15 +11108,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_rfc1867.c php-5.3.1/ext/apc/apc_rfc1867.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
---- php-5.3.1.orig/ext/apc/apc_sem.c   1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_sem.c        1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,201 @@
+--- /dev/null
++++ b/ext/apc/apc_sem.c
+@@ -0,0 +1,192 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -10597,7 +11138,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
 +
 + */
 +
-+/* $Id: apc_sem.c 268620 2008-11-09 02:30:49Z shire $ */
++/* $Id: apc_sem.c 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#include "apc.h"
 +
@@ -10641,38 +11182,29 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
 +# define UNDO 0
 +#endif
 +
-+int apc_sem_create(const char* pathname, int proj, int initval)
++int apc_sem_create(int proj, int initval TSRMLS_DC)
 +{
 +    int semid;
-+    int perms;
++    int perms = 0777;
 +    union semun arg;
-+    key_t key;
-+
-+    perms = 0777;
-+
-+    key = IPC_PRIVATE;
-+    if (pathname != NULL) {
-+        if ((key = ftok(pathname, proj)) < 0) {
-+            apc_eprint("apc_sem_create: ftok(%s,%d) failed:", pathname, proj);
-+        }
-+    }
++    key_t key = IPC_PRIVATE;
 +
 +    if ((semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms)) >= 0) {
 +        /* sempahore created for the first time, initialize now */
 +        arg.val = initval;
 +        if (semctl(semid, 0, SETVAL, arg) < 0) {
-+            apc_eprint("apc_sem_create: semctl(%d,...) failed:", semid);
++            apc_error("apc_sem_create: semctl(%d,...) failed:" TSRMLS_CC, semid);
 +        }
 +    }
 +    else if (errno == EEXIST) {
 +        /* sempahore already exists, don't initialize */
 +        if ((semid = semget(key, 1, perms)) < 0) {
-+            apc_eprint("apc_sem_create: semget(%u,...) failed:", key);
++            apc_error("apc_sem_create: semget(%u,...) failed:" TSRMLS_CC, key);
 +        }
 +        /* insert <sleazy way to avoid race condition> here */
 +    }
 +    else {
-+        apc_eprint("apc_sem_create: semget(%u,...) failed:", key);
++        apc_error("apc_sem_create: semget(%u,...) failed:" TSRMLS_CC, key);
 +    }
 +
 +    return semid;
@@ -10685,7 +11217,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
 +    semctl(semid, 0, IPC_RMID, arg);
 +}
 +
-+void apc_sem_lock(int semid)
++void apc_sem_lock(int semid TSRMLS_DC)
 +{
 +    struct sembuf op;
 +
@@ -10695,12 +11227,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
 +
 +    if (semop(semid, &op, 1) < 0) {
 +        if (errno != EINTR) {
-+            apc_eprint("apc_sem_lock: semop(%d) failed:", semid);
++            apc_error("apc_sem_lock: semop(%d) failed:" TSRMLS_CC, semid);
 +        }
 +    }
 +}
 +
-+int apc_sem_nonblocking_lock(int semid) 
++int apc_sem_nonblocking_lock(int semid TSRMLS_DC
 +{
 +    struct sembuf op;
 +
@@ -10712,14 +11244,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
 +      if (errno == EAGAIN) {
 +        return 0;  /* Lock is already held */
 +      } else if (errno != EINTR) {
-+        apc_eprint("apc_sem_lock: semop(%d) failed:", semid);
++        apc_error("apc_sem_lock: semop(%d) failed:" TSRMLS_CC, semid);
 +      }
 +    }
 +
 +    return 1;  /* Lock obtained */
 +}
 +
-+void apc_sem_unlock(int semid)
++void apc_sem_unlock(int semid TSRMLS_DC)
 +{
 +    struct sembuf op;
 +
@@ -10729,12 +11261,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
 +
 +    if (semop(semid, &op, 1) < 0) {
 +        if (errno != EINTR) {
-+            apc_eprint("apc_sem_unlock: semop(%d) failed:", semid);
++            apc_error("apc_sem_unlock: semop(%d) failed:" TSRMLS_CC, semid);
 +        }
 +    }
 +}
 +
-+void apc_sem_wait_for_zero(int semid)
++void apc_sem_wait_for_zero(int semid TSRMLS_DC)
 +{
 +    struct sembuf op;
 +
@@ -10744,19 +11276,19 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
 +
 +    if (semop(semid, &op, 1) < 0) {
 +        if (errno != EINTR) {
-+            apc_eprint("apc_sem_waitforzero: semop(%d) failed:", semid);
++            apc_error("apc_sem_waitforzero: semop(%d) failed:" TSRMLS_CC, semid);
 +        }
 +    }
 +}
 +
-+int apc_sem_get_value(int semid)
++int apc_sem_get_value(int semid TSRMLS_DC)
 +{
 +    union semun arg;
 +    unsigned short val[1];
 +
 +    arg.array = val;
 +    if (semctl(semid, 0, GETALL, arg) < 0) {
-+        apc_eprint("apc_sem_getvalue: semctl(%d,...) failed:", semid);
++        apc_error("apc_sem_getvalue: semctl(%d,...) failed:" TSRMLS_CC, semid);
 +    }
 +    return val[0];
 +}
@@ -10771,15 +11303,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.c php-5.3.1/ext/apc/apc_sem.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_sem.h php-5.3.1/ext/apc/apc_sem.h
---- php-5.3.1.orig/ext/apc/apc_sem.h   1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_sem.h        1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_sem.h
 @@ -0,0 +1,52 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -10802,20 +11333,20 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.h php-5.3.1/ext/apc/apc_sem.h
 +
 + */
 +
-+/* $Id: apc_sem.h 268620 2008-11-09 02:30:49Z shire $ */
++/* $Id: apc_sem.h 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#ifndef APC_SEM_H
 +#define APC_SEM_H
 +
 +/* Wrapper functions for SysV sempahores */
 +
-+extern int apc_sem_create(const char* pathname, int proj, int initval);
++extern int apc_sem_create(int proj, int initval TSRMLS_DC);
 +extern void apc_sem_destroy(int semid);
-+extern void apc_sem_lock(int semid);
-+extern int apc_sem_nonblocking_lock(int semid); 
-+extern void apc_sem_unlock(int semid);
-+extern void apc_sem_wait_for_zero(int semid);
-+extern int apc_sem_get_value(int semid);
++extern void apc_sem_lock(int semid TSRMLS_DC);
++extern int apc_sem_nonblocking_lock(int semid TSRMLS_DC); 
++extern void apc_sem_unlock(int semid TSRMLS_DC);
++extern void apc_sem_wait_for_zero(int semid TSRMLS_DC);
++extern int apc_sem_get_value(int semid TSRMLS_DC);
 +
 +#endif
 +
@@ -10827,15 +11358,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_sem.h php-5.3.1/ext/apc/apc_sem.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_shm.c php-5.3.1/ext/apc/apc_shm.c
---- php-5.3.1.orig/ext/apc/apc_shm.c   1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_shm.c        1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,124 @@
+--- /dev/null
++++ b/ext/apc/apc_shm.c
+@@ -0,0 +1,114 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -10859,7 +11389,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_shm.c php-5.3.1/ext/apc/apc_shm.c
 +
 + */
 +
-+/* $Id: apc_shm.c 273457 2009-01-13 15:16:42Z gopalv $ */
++/* $Id: apc_shm.c 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#include "apc_shm.h"
 +#include "apc.h"
@@ -10880,25 +11410,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_shm.c php-5.3.1/ext/apc/apc_shm.c
 +# define SHM_A 0222 /* write permission */
 +#endif
 +
-+int apc_shm_create(const char* pathname, int proj, size_t size)
++int apc_shm_create(int proj, size_t size TSRMLS_DC)
 +{
-+    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
++    int shmid;                        /* shared memory id */
++    int oflag;                        /* permissions on shm */
++    key_t key = IPC_PRIVATE;  /* shm key */
 +
 +    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));
++        apc_error("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." TSRMLS_CC, key, size, oflag, strerror(errno));
 +    }
 +
 +    return shmid;
@@ -10910,12 +11430,12 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_shm.c php-5.3.1/ext/apc/apc_shm.c
 +    shmctl(shmid, IPC_RMID, 0);
 +}
 +
-+apc_segment_t apc_shm_attach(int shmid)
++apc_segment_t apc_shm_attach(int shmid TSRMLS_DC)
 +{
 +    apc_segment_t segment; /* shm segment */
 +
 +    if ((long)(segment.shmaddr = shmat(shmid, 0, 0)) == -1) {
-+        apc_eprint("apc_shm_attach: shmat failed:");
++        apc_error("apc_shm_attach: shmat failed:" TSRMLS_CC);
 +    }
 +
 +#ifdef APC_MEMPROTECT
@@ -10934,15 +11454,15 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_shm.c php-5.3.1/ext/apc/apc_shm.c
 +    return segment;
 +}
 +
-+void apc_shm_detach(apc_segment_t* segment)
++void apc_shm_detach(apc_segment_t* segment TSRMLS_DC)
 +{
 +    if (shmdt(segment->shmaddr) < 0) {
-+        apc_eprint("apc_shm_detach: shmdt failed:");
++        apc_error("apc_shm_detach: shmdt failed:" TSRMLS_CC);
 +    }
 +
 +#ifdef APC_MEMPROTECT
 +    if (segment->roaddr && shmdt(segment->roaddr) < 0) {
-+        apc_eprint("apc_shm_detach: shmdt failed:");
++        apc_error("apc_shm_detach: shmdt failed:" TSRMLS_CC);
 +    }
 +#endif
 +}
@@ -10955,15 +11475,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_shm.c php-5.3.1/ext/apc/apc_shm.c
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_shm.h php-5.3.1/ext/apc/apc_shm.h
---- php-5.3.1.orig/ext/apc/apc_shm.h   1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_shm.h        1970-01-01 10:13:08.000000000 +0100
+--- /dev/null
++++ b/ext/apc/apc_shm.h
 @@ -0,0 +1,56 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                                |
++  | Copyright (c) 2006-2010 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        |
@@ -10986,7 +11505,7 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_shm.h php-5.3.1/ext/apc/apc_shm.h
 +
 + */
 +
-+/* $Id: apc_shm.h 273456 2009-01-13 14:43:58Z gopalv $ */
++/* $Id: apc_shm.h 302175 2010-08-13 06:20:28Z kalle $ */
 +
 +#ifndef APC_SHM_H
 +#define APC_SHM_H
@@ -11000,10 +11519,10 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_shm.h php-5.3.1/ext/apc/apc_shm.h
 +
 +/* Wrapper functions for unix shared memory */
 +
-+extern int apc_shm_create(const char* name, int proj, size_t size);
++extern int apc_shm_create(int proj, size_t size TSRMLS_DC);
 +extern void apc_shm_destroy(int shmid);
-+extern apc_segment_t apc_shm_attach(int shmid);
-+extern void apc_shm_detach(apc_segment_t* segment);
++extern apc_segment_t apc_shm_attach(int shmid TSRMLS_DC);
++extern void apc_shm_detach(apc_segment_t* segment TSRMLS_DC);
 +
 +#endif
 +
@@ -11015,15 +11534,14 @@ diff -Naur php-5.3.1.orig/ext/apc/apc_shm.h php-5.3.1/ext/apc/apc_shm.h
 + * vim>600: expandtab sw=4 ts=4 sts=4 fdm=marker
 + * vim<600: expandtab sw=4 ts=4 sts=4
 + */
-diff -Naur php-5.3.1.orig/ext/apc/apc_signal.c php-5.3.1/ext/apc/apc_signal.c
---- php-5.3.1.orig/ext/apc/apc_signal.c        1970-01-01 01:00:00.000000000 +0100
-+++ php-5.3.1/ext/apc/apc_signal.c     1970-01-01 10:13:08.000000000 +0100
-@@ -0,0 +1,195 @@
+--- /dev/null
++++ b/ext/apc/apc_signal.c
+@@ -0,0 +1,197 @@
 +/*
 +  +----------------------------------------------------------------------+
 +  | APC                                                                  |
 +  +----------------------------------------------------------------------+
-+  | Copyright (c) 2006-2008 The PHP Group                    &