1999-12-28 03:07:33 +08:00
|
|
|
/*
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
| Zend Engine |
|
|
|
|
+----------------------------------------------------------------------+
|
2005-08-03 21:30:58 +08:00
|
|
|
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
1999-12-28 03:07:33 +08:00
|
|
|
+----------------------------------------------------------------------+
|
2001-12-11 23:16:21 +08:00
|
|
|
| This source file is subject to version 2.00 of the Zend license, |
|
1999-12-28 03:07:33 +08:00
|
|
|
| that is bundled with this package in the file LICENSE, and is |
|
2003-06-11 04:04:29 +08:00
|
|
|
| available through the world-wide-web at the following url: |
|
2001-12-11 23:16:21 +08:00
|
|
|
| http://www.zend.com/license/2_00.txt. |
|
1999-12-28 03:07:33 +08:00
|
|
|
| If you did not receive a copy of the Zend license and are unable to |
|
|
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
|
|
| license@zend.com so we can mail you a copy immediately. |
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
| Authors: Andi Gutmans <andi@zend.com> |
|
|
|
|
| Zeev Suraski <zeev@zend.com> |
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
*/
|
|
|
|
|
2003-02-01 09:49:15 +08:00
|
|
|
/* $Id$ */
|
1999-12-28 03:07:33 +08:00
|
|
|
|
2000-07-03 07:54:19 +08:00
|
|
|
#ifndef ZEND_FAST_CACHE_H
|
|
|
|
#define ZEND_FAST_CACHE_H
|
1999-12-28 03:07:33 +08:00
|
|
|
|
2000-02-01 02:21:54 +08:00
|
|
|
#ifndef ZEND_ENABLE_FAST_CACHE
|
|
|
|
# if ZEND_DEBUG
|
|
|
|
# define ZEND_ENABLE_FAST_CACHE 0
|
|
|
|
# else
|
2002-06-25 03:41:06 +08:00
|
|
|
# define ZEND_ENABLE_FAST_CACHE 0
|
2000-02-01 02:21:54 +08:00
|
|
|
# endif
|
|
|
|
#endif
|
1999-12-28 03:07:33 +08:00
|
|
|
|
1999-12-28 06:03:25 +08:00
|
|
|
typedef struct _zend_fast_cache_list_entry {
|
|
|
|
struct _zend_fast_cache_list_entry *next;
|
|
|
|
} zend_fast_cache_list_entry;
|
|
|
|
|
1999-12-28 03:07:33 +08:00
|
|
|
#define MAX_FAST_CACHE_TYPES 4
|
|
|
|
|
1999-12-28 06:03:25 +08:00
|
|
|
|
2000-02-01 02:21:54 +08:00
|
|
|
#define ZVAL_CACHE_LIST 0
|
|
|
|
#define HASHTABLE_CACHE_LIST 1
|
1999-12-28 06:03:25 +08:00
|
|
|
|
1999-12-28 03:07:33 +08:00
|
|
|
#if ZEND_ENABLE_FAST_CACHE
|
|
|
|
|
|
|
|
|
|
|
|
#include "zend_globals.h"
|
|
|
|
#include "zend_globals_macros.h"
|
|
|
|
#include "zend_alloc.h"
|
|
|
|
|
|
|
|
|
|
|
|
#if ZEND_DEBUG
|
|
|
|
# define RECORD_ZVAL_CACHE_HIT(fc_type) AG(fast_cache_stats)[fc_type][1]++;
|
|
|
|
# define RECORD_ZVAL_CACHE_MISS(fc_type) AG(fast_cache_stats)[fc_type][0]++;
|
|
|
|
#else
|
|
|
|
# define RECORD_ZVAL_CACHE_HIT(fc_type)
|
|
|
|
# define RECORD_ZVAL_CACHE_MISS(fc_type)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_FAST_ALLOC(p, type, fc_type) \
|
|
|
|
{ \
|
2001-07-28 18:51:54 +08:00
|
|
|
TSRMLS_FETCH(); \
|
1999-12-28 03:07:33 +08:00
|
|
|
\
|
|
|
|
if (((p) = (type *) AG(fast_cache_list_head)[fc_type])) { \
|
|
|
|
AG(fast_cache_list_head)[fc_type] = ((zend_fast_cache_list_entry *) AG(fast_cache_list_head)[fc_type])->next; \
|
|
|
|
RECORD_ZVAL_CACHE_HIT(fc_type); \
|
|
|
|
} else { \
|
|
|
|
(p) = (type *) emalloc(sizeof(type)); \
|
|
|
|
RECORD_ZVAL_CACHE_MISS(fc_type); \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#define ZEND_FAST_FREE(p, fc_type) \
|
|
|
|
{ \
|
2001-07-28 18:51:54 +08:00
|
|
|
TSRMLS_FETCH(); \
|
1999-12-28 03:07:33 +08:00
|
|
|
\
|
2000-10-19 03:53:43 +08:00
|
|
|
((zend_fast_cache_list_entry *) (p))->next = (zend_fast_cache_list_entry *) AG(fast_cache_list_head)[fc_type]; \
|
1999-12-28 03:07:33 +08:00
|
|
|
AG(fast_cache_list_head)[fc_type] = (zend_fast_cache_list_entry *) (p); \
|
|
|
|
}
|
|
|
|
|
2000-02-20 03:21:45 +08:00
|
|
|
#define ZEND_FAST_ALLOC_REL(p, type, fc_type) \
|
|
|
|
ZEND_FAST_ALLOC(p, type, fc_type)
|
|
|
|
|
|
|
|
#define ZEND_FAST_FREE_REL(p, fc_type) \
|
|
|
|
ZEND_FAST_FREE(p, fc_type)
|
|
|
|
|
1999-12-28 03:07:33 +08:00
|
|
|
|
|
|
|
#else /* !ZEND_ENABLE_FAST_CACHE */
|
|
|
|
|
|
|
|
#define ZEND_FAST_ALLOC(p, type, fc_type) \
|
|
|
|
(p) = (type *) emalloc(sizeof(type))
|
|
|
|
|
|
|
|
#define ZEND_FAST_FREE(p, fc_type) \
|
|
|
|
efree(p)
|
|
|
|
|
2000-02-20 03:21:45 +08:00
|
|
|
#define ZEND_FAST_ALLOC_REL(p, type, fc_type) \
|
|
|
|
(p) = (type *) emalloc_rel(sizeof(type))
|
|
|
|
|
|
|
|
#define ZEND_FAST_FREE_REL(p, fc_type) \
|
|
|
|
efree_rel(p)
|
|
|
|
|
1999-12-28 03:07:33 +08:00
|
|
|
#endif /* ZEND_ENABLE_FAST_CACHE */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* fast cache for zval's */
|
|
|
|
#define ALLOC_ZVAL(z) \
|
|
|
|
ZEND_FAST_ALLOC(z, zval, ZVAL_CACHE_LIST)
|
|
|
|
|
|
|
|
#define FREE_ZVAL(z) \
|
|
|
|
ZEND_FAST_FREE(z, ZVAL_CACHE_LIST)
|
|
|
|
|
2000-02-20 03:21:45 +08:00
|
|
|
#define ALLOC_ZVAL_REL(z) \
|
|
|
|
ZEND_FAST_ALLOC_REL(z, zval, ZVAL_CACHE_LIST)
|
|
|
|
|
|
|
|
#define FREE_ZVAL_REL(z) \
|
|
|
|
ZEND_FAST_FREE_REL(z, ZVAL_CACHE_LIST)
|
|
|
|
|
2000-02-26 01:55:33 +08:00
|
|
|
/* fast cache for HashTables */
|
2000-02-20 03:21:45 +08:00
|
|
|
#define ALLOC_HASHTABLE(ht) \
|
|
|
|
ZEND_FAST_ALLOC(ht, HashTable, HASHTABLE_CACHE_LIST)
|
1999-12-28 03:07:33 +08:00
|
|
|
|
|
|
|
#define FREE_HASHTABLE(ht) \
|
|
|
|
ZEND_FAST_FREE(ht, HASHTABLE_CACHE_LIST)
|
|
|
|
|
2000-02-20 03:21:45 +08:00
|
|
|
#define ALLOC_HASHTABLE_REL(ht) \
|
|
|
|
ZEND_FAST_ALLOC_REL(ht, HashTable, HASHTABLE_CACHE_LIST)
|
|
|
|
|
|
|
|
#define FREE_HASHTABLE_REL(ht) \
|
|
|
|
ZEND_FAST_FREE_REL(ht, HASHTABLE_CACHE_LIST)
|
|
|
|
|
2000-07-03 07:54:19 +08:00
|
|
|
#endif /* ZEND_FAST_CACHE_H */
|
1999-12-28 03:07:33 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Local variables:
|
|
|
|
* tab-width: 4
|
|
|
|
* c-basic-offset: 4
|
2003-02-01 09:49:15 +08:00
|
|
|
* indent-tabs-mode: t
|
1999-12-28 03:07:33 +08:00
|
|
|
* End:
|
|
|
|
*/
|