pgpool2.git / summary / log / commit / refs

commit    e54de176303be45335f4c55d1e854edae692a74b
Author:   Tatsuo Ishii <ishii@postgresql.org>
Date:     Mon Apr 09 05:03:11 2012 +0000

    Fix memory leak.


pool_memqcache.c | 13 ++++++++----- pool_memqcache.h | 3 +++ pool_process_query.c | 8 ++++++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/pool_memqcache.c b/pool_memqcache.c index d3080604d..aa32faa51 100644 --- a/pool_memqcache.c +++ b/pool_memqcache.c @@ -77,16 +77,14 @@ static char *pool_get_item_shmem_cache(POOL_QUERY_HASH *query_hash, int *size, i static void pool_shmem_lock(void); static void pool_shmem_unlock(void); static void pool_add_query_cache_array(POOL_QUERY_CACHE_ARRAY *cache_array, POOL_TEMP_QUERY_CACHE *cache); -static void pool_discard_temp_query_cache(POOL_TEMP_QUERY_CACHE *temp_cache); static void pool_add_temp_query_cache(POOL_TEMP_QUERY_CACHE *temp_cache, char kind, char *data, int data_len); static void pool_add_oids_temp_query_cache(POOL_TEMP_QUERY_CACHE *temp_cache, int num_oids, int *oids); static POOL_INTERNAL_BUFFER *pool_create_buffer(void); static void pool_discard_buffer(POOL_INTERNAL_BUFFER *buffer); static void pool_add_buffer(POOL_INTERNAL_BUFFER *buffer, void *data, size_t len); static void *pool_get_buffer(POOL_INTERNAL_BUFFER *buffer, size_t *len); -static size_t pool_get_buffer_length(POOL_INTERNAL_BUFFER *buffer); -static POOL_TEMP_QUERY_CACHE *pool_get_current_cache(void); static char *pool_get_current_cache_buffer(size_t *len); +static size_t pool_get_buffer_length(POOL_INTERNAL_BUFFER *buffer); static void pool_check_and_discard_cache_buffer(int num_oids, int *oids); static void pool_set_memqcache_blocks(int num_blocks); @@ -1278,8 +1276,13 @@ static void pool_reset_memqcache_buffer(void) if (session_context && session_context->query_cache_array) { + POOL_TEMP_QUERY_CACHE *cache; + pool_discard_query_cache_array(session_context->query_cache_array); session_context->query_cache_array = pool_create_query_cache_array(); + + cache = pool_get_current_cache(); + pool_discard_temp_query_cache(cache); } pool_discard_dml_table_oid(); pool_tmp_stats_reset_num_selects(); @@ -2289,7 +2292,7 @@ POOL_TEMP_QUERY_CACHE *pool_create_temp_query_cache(char *query) /* * Discard temp query cache */ -static void pool_discard_temp_query_cache(POOL_TEMP_QUERY_CACHE *temp_cache) +void pool_discard_temp_query_cache(POOL_TEMP_QUERY_CACHE *temp_cache) { if (!temp_cache) return; @@ -2478,7 +2481,7 @@ static size_t pool_get_buffer_length(POOL_INTERNAL_BUFFER *buffer) /* * Get query cache buffer struct of current query context */ -static POOL_TEMP_QUERY_CACHE *pool_get_current_cache(void) +POOL_TEMP_QUERY_CACHE *pool_get_current_cache(void) { POOL_SESSION_CONTEXT *session_context; POOL_QUERY_CONTEXT *query_context; diff --git a/pool_memqcache.h b/pool_memqcache.h index 968e52a8a..184967248 100644 --- a/pool_memqcache.h +++ b/pool_memqcache.h @@ -235,5 +235,8 @@ extern long long int pool_stats_count_up_num_cache_hits(void); extern long long int pool_tmp_stats_count_up_num_selects(void); extern long long int pool_tmp_stats_get_num_selects(void); extern void pool_tmp_stats_reset_num_selects(void); +extern POOL_TEMP_QUERY_CACHE *pool_get_current_cache(void); +extern POOL_TEMP_QUERY_CACHE *pool_get_current_cache(void); +extern void pool_discard_temp_query_cache(POOL_TEMP_QUERY_CACHE *temp_cache); #endif /* POOL_MEMQCACHE_H */ diff --git a/pool_process_query.c b/pool_process_query.c index 94c3af8f5..6cd3c648f 100644 --- a/pool_process_query.c +++ b/pool_process_query.c @@ -1277,6 +1277,7 @@ static int reset_backend(POOL_CONNECTION_POOL *backend, int qcnt) POOL_SESSION_CONTEXT *session_context; int i; bool need_to_abort; + POOL_TEMP_QUERY_CACHE *cache; /* Get session context */ session_context = pool_get_session_context(); @@ -1369,6 +1370,13 @@ static int reset_backend(POOL_CONNECTION_POOL *backend, int qcnt) } pool_set_timeout(0); + + cache = pool_get_current_cache(); + if (cache) + { + pool_discard_temp_query_cache(cache); + } + return 1; } [parent: eeca48acf2fa]