diff options
Diffstat (limited to 'ext/mysqlnd/mysqlnd_qcache.c')
-rw-r--r-- | ext/mysqlnd/mysqlnd_qcache.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/ext/mysqlnd/mysqlnd_qcache.c b/ext/mysqlnd/mysqlnd_qcache.c new file mode 100644 index 0000000000..a08c7d488d --- /dev/null +++ b/ext/mysqlnd/mysqlnd_qcache.c @@ -0,0 +1,141 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 6 | + +----------------------------------------------------------------------+ + | Copyright (c) 2006-2007 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: Georg Richter <georg@mysql.com> | + | Andrey Hristov <andrey@mysql.com> | + | Ulf Wendel <uwendel@mysql.com> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ +#include "php.h" +#include "mysqlnd.h" +#include "mysqlnd_priv.h" +#include "mysqlnd_statistics.h" + +#define MYSQLND_SILENT + +#ifdef ZTS +#define LOCK_QCACHE(cache) tsrm_mutex_lock((cache)->LOCK_access) +#define UNLOCK_QCACHE(cache) tsrm_mutex_unlock((cache)->LOCK_access) +#else +#define LOCK_QCACHE(cache) +#define UNLOCK_QCACHE(cache) +#endif + + +/* {{{ mysqlnd_qcache_init_cache */ +PHPAPI MYSQLND_QCACHE * mysqlnd_qcache_init_cache() +{ + MYSQLND_QCACHE *cache = calloc(1, sizeof(MYSQLND_QCACHE)); +#ifndef MYSQLND_SILENT + php_printf("[mysqlnd_qcache_init_cache %p]\n", cache); +#endif + + cache->references = 1; +#ifdef ZTS + cache->LOCK_access = tsrm_mutex_alloc(); +#endif + cache->ht = malloc(sizeof(HashTable)); + zend_hash_init(cache->ht, 10 /* init_elements */, NULL, NULL, TRUE /*pers*/); + + return cache; +} +/* }}} */ + + +/* {{{ mysqlnd_qcache_get_cache_reference */ +PHPAPI MYSQLND_QCACHE * mysqlnd_qcache_get_cache_reference(MYSQLND_QCACHE * const cache) +{ + if (cache) { +#ifndef MYSQLND_SILENT + php_printf("[mysqlnd_qcache_get_cache_reference %p will become %d]\n", cache, cache->references+1); +#endif + LOCK_QCACHE(cache); + cache->references++; + UNLOCK_QCACHE(cache); + } + return cache; +} +/* }}} */ + + +/* {{{ mysqlnd_qcache_free_cache */ +/* + As this call will happen on MSHUTDOWN(), then we don't need to copy the zvals with + copy_ctor but scrap what they point to with zval_dtor() and then just free our + pre-allocated block. Precondition is that we ZVAL_NULL() the zvals when we put them + to the free list after usage. We ZVAL_NULL() them when we allocate them in the + constructor of the cache. +*/ +static +void mysqlnd_qcache_free_cache(MYSQLND_QCACHE *cache) +{ +#ifndef MYSQLND_SILENT + php_printf("[mysqlnd_qcache_free_cache %p]\n", cache); +#endif + +#ifdef ZTS + tsrm_mutex_free(cache->LOCK_access); +#endif + zend_hash_destroy(cache->ht); + free(cache->ht); + free(cache); +} +/* }}} */ + + +/* {{{ mysqlnd_qcache_free_cache_reference */ +PHPAPI void mysqlnd_qcache_free_cache_reference(MYSQLND_QCACHE **cache) +{ + if (*cache) { + zend_bool to_free; +#ifndef MYSQLND_SILENT + php_printf("[mysqlnd_qcache_free_cache_reference %p] refs=%d\n", *cache, (*cache)->references); +#endif + LOCK_QCACHE(*cache); + to_free = --(*cache)->references == 0; + /* Unlock before destroying */ + UNLOCK_QCACHE(*cache); + if (to_free) { + mysqlnd_qcache_free_cache(*cache); + } + *cache = NULL; + } +} +/* }}} */ + + +/* {{{ mysqlnd_qcache_free_cache_reference */ +PHPAPI void mysqlnd_qcache_stats(const MYSQLND_QCACHE * const cache, zval *return_value) +{ + if (cache) { + LOCK_QCACHE(cache); + array_init(return_value); + add_assoc_long_ex(return_value, "references", sizeof("references"), cache->references); + UNLOCK_QCACHE(cache); + } else { + ZVAL_NULL(return_value); + } +} +/* }}} */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ |