pgpool2.git / summary / log / commit / refs

commit    9c54a289313fa902fd7b9cf2e4409a655e2f44bd
Author:   Yoshiyuki Asaba <y-asaba at pgfoundry.org>
Date:     Fri Sep 07 09:08:16 2007 +0000

    Improve performance.
      - Reuse parser memory space in free_parser().
      - Check node type before comparing with "show pool_status()".


parser/parser.c | 5 +++-- parser/pool_memory.c | 33 +++++++++++++++++++++++++++++---- parser/pool_memory.h | 2 +- pool_process_query.c | 13 ++++++++----- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/parser/parser.c b/parser/parser.c index 096901715..f777abdbe 100644 --- a/parser/parser.c +++ b/parser/parser.c @@ -42,7 +42,8 @@ raw_parser(const char *str) { int yyresult; - pool_memory = pool_memory_create(); + if (pool_memory == NULL) + pool_memory = pool_memory_create(); parsetree = NIL; /* in case grammar forgets to set it */ have_lookahead = false; @@ -107,6 +108,6 @@ sql_yylex(void) void free_parser(void) { - pool_memory_delete(pool_memory); + pool_memory_delete(pool_memory, 1); } diff --git a/parser/pool_memory.c b/parser/pool_memory.c index 2ece55de8..9039c0fc1 100644 --- a/parser/pool_memory.c +++ b/parser/pool_memory.c @@ -32,7 +32,7 @@ #define ALIGN 3 #define POOL_HEADER_SIZE (sizeof (POOL_CHUNK_HEADER)) -POOL_MEMORY_POOL *pool_memory; +POOL_MEMORY_POOL *pool_memory = NULL; static int get_free_index(unsigned int size); @@ -248,11 +248,17 @@ POOL_MEMORY_POOL *pool_memory_create(void) * pool_memory_delete: * Frees all memory which is allocated in the memory pool. */ -void pool_memory_delete(POOL_MEMORY_POOL *pool_memory) +void pool_memory_delete(POOL_MEMORY_POOL *pool_memory, int reuse) { POOL_BLOCK *block, *ptr; - for (block = pool_memory->blocks; block;) + /* Reuse the first memory block */ + if (reuse && pool_memory->blocks) + block = pool_memory->blocks->next; + else + block = pool_memory->blocks; + + while (block) { ptr = block->next; free(block->block); @@ -268,7 +274,26 @@ void pool_memory_delete(POOL_MEMORY_POOL *pool_memory) block = ptr; } - free(pool_memory); + if (reuse) + { + int i; + + if (pool_memory->blocks) + { + pool_memory->blocks->allocsize = 0; + pool_memory->blocks->freepoint = pool_memory->blocks->block; + } + pool_memory->largeblocks = NULL; + for (i = 0; i < SLOT_NUM; i++) + { + pool_memory->freelist[i] = NULL; + } + } + else + { + free(pool_memory); + pool_memory = NULL; + } } /* diff --git a/parser/pool_memory.h b/parser/pool_memory.h index 7f1755c7d..3ef73663c 100644 --- a/parser/pool_memory.h +++ b/parser/pool_memory.h @@ -58,7 +58,7 @@ extern void *pool_memory_alloc(POOL_MEMORY_POOL *pool, unsigned int size); extern void pool_memory_free(POOL_MEMORY_POOL *pool, void *ptr); extern void *pool_memory_realloc(POOL_MEMORY_POOL *pool, void *ptr, unsigned int size); extern POOL_MEMORY_POOL *pool_memory_create(void); -extern void pool_memory_delete(POOL_MEMORY_POOL *pool_memory); +extern void pool_memory_delete(POOL_MEMORY_POOL *pool_memory, int reuse); extern char *pool_memory_strdup(POOL_MEMORY_POOL *pool_memory, const char *string); extern void *pool_memory_alloc_zero(POOL_MEMORY_POOL *pool_memory, unsigned int size); diff --git a/pool_process_query.c b/pool_process_query.c index bfe6b5483..43028c4de 100644 --- a/pool_process_query.c +++ b/pool_process_query.c @@ -572,7 +572,7 @@ POOL_STATUS pool_parallel_exec(POOL_CONNECTION *frontend, } /* process status reporting? */ - if (strncasecmp(sq, string, strlen(sq)) == 0) + if (IsA(node, VariableShowStmt) && strncasecmp(sq, string, strlen(sq)) == 0) { pool_debug("process reporting"); process_reporting(frontend, backend); @@ -939,7 +939,7 @@ static POOL_STATUS SimpleQuery(POOL_CONNECTION *frontend, } /* process status reporting? */ - if (strncasecmp(sq, string, strlen(sq)) == 0) + if (IsA(node, VariableShowStmt) && strncasecmp(sq, string, strlen(sq)) == 0) { StartupPacket *sp; char psbuf[1024]; @@ -1227,9 +1227,11 @@ static POOL_STATUS Execute(POOL_CONNECTION *frontend, /* load balance trick */ if (portal) { + POOL_MEMORY_POOL *pool_mem; + p_stmt = (PrepareStmt *)portal->stmt; - pool_memory = pool_memory_create(); + pool_mem = pool_memory_create(); string1 = nodeToString(p_stmt->query); if (load_balance_enabled(backend, (Node *)p_stmt->query, string1)) @@ -1254,7 +1256,7 @@ static POOL_STATUS Execute(POOL_CONNECTION *frontend, */ commit = is_commit_query((Node *)p_stmt->query); - pool_memory_delete(pool_memory); + pool_memory_delete(pool_mem, 0); } else if (MASTER_SLAVE) { @@ -3259,6 +3261,7 @@ static void process_reporting(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *b /* data row */ for (i=0;i<nrows;i++) { + pool_debug("XXX %d", i); pool_write(frontend, "D", 1); len = sizeof(len) + sizeof(nrows); len += sizeof(int) + strlen(status[i].name); @@ -4744,7 +4747,7 @@ static void reset_prepared_list(PreparedStatementList *p) free(p->portal_list[i]->portal_name); free(p->portal_list[i]); } - pool_memory_delete(prepare_memory_context); + pool_memory_delete(prepare_memory_context, 0); prepare_memory_context = NULL; free(unnamed_statement); unnamed_portal = NULL; [parent: 6064f3bbdf90]