From 989d9579b300404f81b09f50ba1271d2d591a033 Mon Sep 17 00:00:00 2001 From: tiagosoares Date: Tue, 6 Jun 2006 14:11:36 +0000 Subject: [PATCH] MYDDAS: Fix a bug on memory dealocation on MYDDAS_STATS module git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1669 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/exec.c | 4 +- C/init.c | 2 +- H/Yapproto.h | 26 ++++--- MYDDAS/myddas.h | 42 +++++++++++ MYDDAS/myddas_initialization.c | 69 ++++++++++++------ MYDDAS/myddas_mysql.c | 47 ++++++------ MYDDAS/myddas_shared.c | 81 +++++++++++++++++---- MYDDAS/myddas_statistics.c | 113 +++++++++++++++++++++++++---- MYDDAS/myddas_statistics.h | 21 +----- MYDDAS/myddas_statistics_structs.h | 2 +- MYDDAS/myddas_structs.h | 40 +++------- MYDDAS/myddas_util.c | 21 +++--- Makefile.in | 6 +- library/MYDDAS/myddas.ypp | 4 + 14 files changed, 329 insertions(+), 149 deletions(-) diff --git a/C/exec.c b/C/exec.c index 35ebf52e6..b3aa48313 100644 --- a/C/exec.c +++ b/C/exec.c @@ -1807,8 +1807,8 @@ Yap_InitYaamRegs(void) #ifdef CUT_C cut_c_initialize(); #endif -#if defined CUT_C && (defined MYDDAS_ODBC || defined MYDDAS_MYSQL) - Yap_REGS.MYDDAS_GLOBAL_POINTER = myddas_util_initialize_myddas(); +#if defined MYDDAS_MYSQL || defined MYDDAS_ODBC + Yap_REGS.MYDDAS_GLOBAL_POINTER = NULL; #endif } diff --git a/C/init.c b/C/init.c index 901dce680..4ae102ad5 100644 --- a/C/init.c +++ b/C/init.c @@ -1376,7 +1376,7 @@ Yap_exit (int value) remove("PROFILING"); #endif #if defined MYDDAS_MYSQL || defined MYDDAS_ODBC - Yap_MyDDAS_delete_all_myddas_structs(); + Yap_MYDDAS_delete_all_myddas_structs(); #endif if (! (Yap_PrologMode & BootMode) ) Yap_ShutdownLoadForeign(); diff --git a/H/Yapproto.h b/H/Yapproto.h index a51d6a38d..75848f546 100644 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -10,7 +10,7 @@ * File: Yap.proto * * mods: * * comments: Function declarations for YAP * -* version: $Id: Yapproto.h,v 1.73 2006-04-24 12:04:21 tiagosoares Exp $ * +* version: $Id: Yapproto.h,v 1.74 2006-06-06 14:09:09 tiagosoares Exp $ * *************************************************************************/ /* prototype file for Yap */ @@ -324,25 +324,27 @@ void STD_PROTO(Yap_InitUtilCPreds,(void)); #if defined MYDDAS_MYSQL || defined MYDDAS_ODBC /* myddas_initialization.c */ -MYDDAS_GLOBAL STD_PROTO(myddas_util_initialize_myddas,(void)); +MYDDAS_GLOBAL STD_PROTO(myddas_init_initialize_myddas,(void)); +MYDDAS_UTIL_CONNECTION STD_PROTO(myddas_init_initialize_connection,(void *,void *,MYDDAS_UTIL_CONNECTION)); +MYDDAS_UTIL_PREDICATE STD_PROTO(myddas_init_initialize_predicate,(char *, int, char *,MYDDAS_UTIL_PREDICATE)); + +#ifdef MYDDAS_STATS +/* myddas_statistics.c */ +MYDDAS_GLOBAL STD_PROTO(myddas_stats_initialize_global_stats,(MYDDAS_GLOBAL)); +MYDDAS_STATS_STRUCT STD_PROTO(myddas_stats_initialize_connection_stats,(void)); +void STD_PROTO(myddas_stats_delete_stats_list,(MYDDAS_STATS_STRUCT)); +#endif /* MYDDAS_STATS */ #ifdef MYDDAS_MYSQL /* myddas_util.c */ void STD_PROTO(myddas_util_table_write,(MYSQL_RES *)); #endif -/* Returns the connection type (mysql -> 1 or odbc -> 2) */ Short STD_PROTO(myddas_util_connection_type,(void *)); -/* Adds a connection identifier to the MYDDAS connections list*/ MYDDAS_UTIL_CONNECTION STD_PROTO(myddas_util_add_connection,(void *,void *)); -/* Search for the node of the specified connection*/ MYDDAS_UTIL_CONNECTION STD_PROTO(myddas_util_search_connection,(void *)); -/* Deletes a connection node from the MYDDAS connections list*/ void STD_PROTO(myddas_util_delete_connection,(void *)); -/* Adds a new predicate to it's connection node list*/ MYDDAS_UTIL_CONNECTION STD_PROTO(myddas_util_add_predicate,(char * ,Int , char *,void *)); -/* Search for a predicate node*/ MYDDAS_UTIL_PREDICATE STD_PROTO(myddas_util_search_predicate,(char * ,Int , char *)); -/* Deletes predicate from the prediate list */ void STD_PROTO(myddas_util_delete_predicate,(MYDDAS_UTIL_PREDICATE)); /* Get's the number of queries to save */ @@ -357,9 +359,9 @@ void * STD_PROTO(myddas_util_get_list_pred,(MYDDAS_UTIL_CONNECTI void * STD_PROTO(myddas_util_get_pred_next,(void *)); char * STD_PROTO(myddas_util_get_pred_module,(void *)); char * STD_PROTO(myddas_util_get_pred_name,(void *)); -Int STD_PROTO(myddas_util_get_pred_arity,(void *)); +MyddasInt STD_PROTO(myddas_util_get_pred_arity,(void *)); //DELETE THIS WHEN DB_STATS IS COMPLETED -Int STD_PROTO(get_myddas_top,(void)); +MyddasInt STD_PROTO(get_myddas_top,(void)); #ifdef DEBUG void check_int(void); @@ -381,7 +383,7 @@ void STD_PROTO(Yap_InitBackMYDDAS_ODBCPreds,(void)); /* myddas_shared.c */ #if defined MYDDAS_ODBC || defined MYDDAS_MYSQL -void STD_PROTO(Yap_MyDDAS_delete_all_myddas_structs,(void)); +void STD_PROTO(Yap_MYDDAS_delete_all_myddas_structs,(void)); void STD_PROTO(Yap_InitMYDDAS_SharedPreds,(void)); void STD_PROTO(Yap_InitBackMYDDAS_SharedPreds,(void)); #endif diff --git a/MYDDAS/myddas.h b/MYDDAS/myddas.h index bd06696af..7487dfa8d 100644 --- a/MYDDAS/myddas.h +++ b/MYDDAS/myddas.h @@ -114,4 +114,46 @@ typedef struct myddas_global_stats *MYDDAS_GLOBAL_STATS; typedef struct myddas_stats_struct *MYDDAS_STATS_STRUCT; #endif +#ifdef DEBUG +#define MYDDAS_MALLOC(POINTER,TYPE) \ + { \ + POINTER = (TYPE *) malloc(sizeof(TYPE)); \ + Yap_REGS.MYDDAS_GLOBAL_POINTER->memory_allocated+=sizeof(TYPE); \ + /*printf ("MALLOC %p %s %d\n",POINTER,__FILE__,__LINE__);*/ \ + Yap_REGS.MYDDAS_GLOBAL_POINTER->malloc_called++; \ + } +#else +#define MYDDAS_MALLOC(POINTER,TYPE) \ + { \ + POINTER = (TYPE *) malloc(sizeof(TYPE)); \ + } +#endif + +#ifdef DEBUG +#define MYDDAS_FREE(POINTER,TYPE) \ + { \ + Yap_REGS.MYDDAS_GLOBAL_POINTER->memory_freed+=sizeof(TYPE); \ + Yap_REGS.MYDDAS_GLOBAL_POINTER->free_called++; \ + /*printf ("FREE %p %s %d\n",POINTER,__FILE__,__LINE__);*/ \ + free(POINTER); \ + } +#else +#define MYDDAS_FREE(POINTER,TYPE) \ + { \ + free(POINTER); \ + } +#endif + +#ifdef DEBUG +#define MYDDAS_MEMORY_MALLOC_NR(NUMBER) \ + NUMBER = Yap_REGS.MYDDAS_GLOBAL_POINTER->malloc_called; +#define MYDDAS_MEMORY_MALLOC_SIZE(NUMBER) \ + NUMBER = Yap_REGS.MYDDAS_GLOBAL_POINTER->memory_allocated; +#define MYDDAS_MEMORY_FREE_NR(NUMBER) \ + NUMBER = Yap_REGS.MYDDAS_GLOBAL_POINTER->free_called; +#define MYDDAS_MEMORY_FREE_SIZE(NUMBER) \ + NUMBER = Yap_REGS.MYDDAS_GLOBAL_POINTER->memory_freed; +#endif + + #endif /*__MYDDAS_H__*/ diff --git a/MYDDAS/myddas_initialization.c b/MYDDAS/myddas_initialization.c index e52e42a08..035b1fa76 100644 --- a/MYDDAS/myddas_initialization.c +++ b/MYDDAS/myddas_initialization.c @@ -1,42 +1,60 @@ -//* Initializes a new connection node for the MYDDAS list*/ -static MYDDAS_UTIL_CONNECTION -myddas_util_initialize_connection(void *,void *, - MYDDAS_UTIL_CONNECTION); +#if defined MYDDAS_ODBC || defined MYDDAS_MYSQL -/* Initializes a new predicate node for the MYDDAS list */ -static MYDDAS_UTIL_PREDICATE -myddas_util_initialize_predicate(char *, int,char *, - MYDDAS_UTIL_PREDICATE); +#include "Yap.h" +#include +#include +#include "myddas.h" +#include "myddas_structs.h" +#ifdef MYDDAS_STATS +#include "myddas_statistics.h" +#endif MYDDAS_GLOBAL -myddas_util_initialize_myddas(void){ +myddas_init_initialize_myddas(void){ MYDDAS_GLOBAL global = NULL; + /* We cannot call MYDDAS_MALLOC were because the global + register isn't yet initialized */ global = (MYDDAS_GLOBAL) malloc (sizeof(struct myddas_global)); - +#ifdef DEBUG + printf ("MALLOC %p %s %d\n",global,__FILE__,__LINE__); +#endif global->myddas_top_connections = NULL; #ifdef MYDDAS_TOP_LEVEL global->myddas_top_level_connection = NULL; #endif #ifdef MYDDAS_STATS global->myddas_statistics = (MYDDAS_GLOBAL_STATS) malloc (sizeof(struct myddas_global_stats)); +#ifdef DEBUG + printf ("MALLOC %p %s %d\n",global->myddas_statistics,__FILE__,__LINE__); +#endif global->myddas_statistics->stats = NULL; - MYDDAS_STATS_INITIALIZE_GLOBAL_STATS(global->myddas_statistics->stats); - //MYDDAS_STATS_INITIALIZE_TIME_STRUCT(global->myddas_statistics->total_db_row,time_final); - //MYDDAS_STATS_INITIALIZE_TIME_STRUCT(global->myddas_statistics->total_translate,time_final); - #endif + +#ifdef DEBUG + /* We first malloc for this struct and the stats struct */ +#ifdef MYDDAS_STATS + global->malloc_called = 2; + global->memory_allocated = sizeof(struct myddas_global) + sizeof(struct myddas_global_stats); +#else + global->malloc_called = 1; + global->memory_allocated = sizeof(struct myddas_global); +#endif /* MYDDAS_STATS */ + global->free_called = 0; + global->memory_freed = 0; +#endif + return global; } - - /* Inserts the new node on the front of the list */ -static MYDDAS_UTIL_CONNECTION -myddas_util_initialize_connection(void *conn,void *enviromment, +MYDDAS_UTIL_CONNECTION +myddas_init_initialize_connection(void *conn,void *enviromment, MYDDAS_UTIL_CONNECTION next){ - MYDDAS_UTIL_CONNECTION new = malloc (sizeof(struct myddas_list_connection)); + MYDDAS_UTIL_CONNECTION new = NULL; + MYDDAS_MALLOC(new,struct myddas_list_connection); + if (new == NULL) { return NULL; @@ -60,16 +78,18 @@ myddas_util_initialize_connection(void *conn,void *enviromment, #ifdef MYDDAS_STATS new->stats = NULL; - MYDDAS_STATS_INITIALIZE_CONNECTION_STATS(new->stats); + new->stats = myddas_stats_initialize_connection_stats(); #endif - return new; } -static MYDDAS_UTIL_PREDICATE -myddas_util_initialize_predicate(char *pred_name, int pred_arity, +MYDDAS_UTIL_PREDICATE +myddas_init_initialize_predicate(char *pred_name, int pred_arity, char *pred_module, MYDDAS_UTIL_PREDICATE next){ - MYDDAS_UTIL_PREDICATE new = malloc (sizeof(struct myddas_list_preds)); + + MYDDAS_UTIL_PREDICATE new = NULL; + MYDDAS_MALLOC(new,struct myddas_list_preds); + if (new == NULL) { return NULL; @@ -89,3 +109,4 @@ myddas_util_initialize_predicate(char *pred_name, int pred_arity, return new; } +#endif diff --git a/MYDDAS/myddas_mysql.c b/MYDDAS/myddas_mysql.c index 1d8dae36b..c3af78b2b 100755 --- a/MYDDAS/myddas_mysql.c +++ b/MYDDAS/myddas_mysql.c @@ -187,8 +187,8 @@ c_db_my_query(void) { MYDDAS_STATS_CON_GET_NUMBER_QUERIES_MADE_COUNT(node,count); MYDDAS_STATS_CON_SET_NUMBER_QUERIES_MADE_COUNT(node,++count); - /* Measure time spent by the MySQL Server - processing the SQL Query */ + /* Measure time spent by the MySQL Server + processing the SQL Query */ MYDDAS_STATS_TIME start,end,total_time,diff; start = myddas_stats_walltime(); #endif @@ -211,8 +211,8 @@ c_db_my_query(void) { myddas_stats_subtract_time(diff,end,start); diff = myddas_stats_time_copy_to_final(diff); - free(end); - free(start); + MYDDAS_FREE(end,struct myddas_stats_time_struct); + MYDDAS_FREE(start,struct myddas_stats_time_struct); MYDDAS_STATS_CON_GET_TOTAL_TIME_DBSERVER(node,total_time); /* Automacally updates the MYDDAS_STRUCTURE */ @@ -249,8 +249,8 @@ c_db_my_query(void) { myddas_stats_subtract_time(diff,end,start); diff = myddas_stats_time_copy_to_final(diff); - free(end); - free(start); + MYDDAS_FREE(end,struct myddas_stats_time_struct); + MYDDAS_FREE(start,struct myddas_stats_time_struct); MYDDAS_STATS_CON_GET_TOTAL_TIME_TRANSFERING(node,total_time); /* Automacally updates the MYDDAS_STRUCTURE */ @@ -259,11 +259,11 @@ c_db_my_query(void) { MYDDAS_STATS_CON_SET_TOTAL_TIME_TRANSFERING_COUNT(node,++count); time = NULL; - MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING(node,time); - MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING_COUNT(node,count); - MYDDAS_STATS_CON_SET_LAST_TIME_TRANSFERING_COUNT(node,++count); + MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING(node,time); + MYDDAS_STATS_CON_GET_LAST_TIME_TRANSFERING_COUNT(node,count); + MYDDAS_STATS_CON_SET_LAST_TIME_TRANSFERING_COUNT(node,++count); myddas_stats_move_time(diff,time); - + /* Measure the number of Rows returned from the server */ if (res_set != NULL) { @@ -483,8 +483,8 @@ c_db_my_row_cut(void) { static Int c_db_my_row(void) { #ifdef MYDDAS_STATS - /* Measure time used by the - c_db_my_row function */ +/* Measure time used by the */ +/* c_db_my_row function */ MYDDAS_STATS_TIME start,end,total_time,diff; MyddasULInt count = 0; start = myddas_stats_walltime(); @@ -503,8 +503,8 @@ c_db_my_row(void) { Int i, arity; arity = IntegerOfTerm(arg_arity); - - while(TRUE) + + while(TRUE) { if ((row = mysql_fetch_row(res_set)) != NULL) { @@ -551,22 +551,21 @@ c_db_my_row(void) { myddas_stats_subtract_time(diff,end,start); diff = myddas_stats_time_copy_to_final(diff); - free(end); - free(start); + MYDDAS_FREE(end,struct myddas_stats_time_struct); + MYDDAS_FREE(start,struct myddas_stats_time_struct); MYDDAS_STATS_GET_DB_ROW_FUNCTION(total_time); myddas_stats_add_time(total_time,diff,total_time); MYDDAS_STATS_GET_DB_ROW_FUNCTION_COUNT(count); MYDDAS_STATS_SET_DB_ROW_FUNCTION_COUNT(++count); - free(diff); + MYDDAS_FREE(diff,struct myddas_stats_time_struct); #endif /* MYDDAS_STATS */ return TRUE; } else { mysql_free_result(res_set); - cut_fail(); #ifdef MYDDAS_STATS end = myddas_stats_walltime(); @@ -574,19 +573,21 @@ c_db_my_row(void) { myddas_stats_subtract_time(diff,end,start); diff = myddas_stats_time_copy_to_final(diff); - free(end); - free(start); + MYDDAS_FREE(end,struct myddas_stats_time_struct); + MYDDAS_FREE(start,struct myddas_stats_time_struct); MYDDAS_STATS_GET_DB_ROW_FUNCTION(total_time); myddas_stats_add_time(total_time,diff,total_time); MYDDAS_STATS_GET_DB_ROW_FUNCTION_COUNT(count); MYDDAS_STATS_SET_DB_ROW_FUNCTION_COUNT(++count); - free(diff); + MYDDAS_FREE(diff,struct myddas_stats_time_struct); #endif /* MYDDAS_STATS */ - return FALSE; + cut_fail(); /* This macro already does a return FALSE */ } + } + } static Int @@ -714,4 +715,4 @@ c_db_my_change_database(void) { return TRUE; } -#endif /*MYDDAS_MYSQL*/ +#endif /* MYDDAS_MYSQL */ diff --git a/MYDDAS/myddas_shared.c b/MYDDAS/myddas_shared.c index 374943442..f35c52211 100644 --- a/MYDDAS/myddas_shared.c +++ b/MYDDAS/myddas_shared.c @@ -27,7 +27,7 @@ #include "myddas_statistics.h" #endif -//STATIC_PROTO(Int c_db_get_new_table_name,(void)); +STATIC_PROTO(Int c_db_initialize_myddas,(void)); STATIC_PROTO(Int c_db_connection_type,(void)); STATIC_PROTO(Int c_db_add_preds,(void)); STATIC_PROTO(Int c_db_preds_conn_start ,(void)); @@ -49,6 +49,9 @@ STATIC_PROTO(Int c_db_check,(void)); void Yap_InitMYDDAS_SharedPreds(void) { + /* c_db_initialize_myddas */ + Yap_InitCPred("c_db_initialize_myddas",0,c_db_initialize_myddas, 0); + /* c_db_connection_type: Connection x Type */ Yap_InitCPred("c_db_connection_type",2,c_db_connection_type, 0); @@ -97,6 +100,17 @@ void Yap_InitBackMYDDAS_SharedPreds(void) } +/* Initialize all of the MYDDAS global structures */ +static Int +c_db_initialize_myddas(void){ + Yap_REGS.MYDDAS_GLOBAL_POINTER = myddas_init_initialize_myddas(); +#ifdef MYDDAS_STATS + Yap_REGS.MYDDAS_GLOBAL_POINTER = myddas_stats_initialize_global_stats(Yap_REGS.MYDDAS_GLOBAL_POINTER); +#endif /* MYDDAS_STATS */ + return TRUE; +} + + /* Gives the type of a given connection, in other words, type will be mysql or odbc @@ -357,7 +371,9 @@ c_db_stats_translate(void){ MYDDAS_STATS_GET_TRANSLATE_COUNT(count); MYDDAS_STATS_SET_TRANSLATE_COUNT(++count); - free(diff); + MYDDAS_FREE(diff,struct myddas_stats_time_struct); + MYDDAS_FREE(start, struct myddas_stats_time_struct); + MYDDAS_FREE(end, struct myddas_stats_time_struct); return TRUE; #ifdef DEBUG @@ -614,7 +630,20 @@ c_db_stats(void) { MYDDAS_STATS_PRINT_TIME_STRUCT(time); printf ("\n\n"); #endif + + /* Memory management */ +#ifdef DEBUG + MyddasULInt nr; + MYDDAS_MEMORY_MALLOC_NR(nr); + printf ("Number of times malloc was called in MYDDAS: %lu \n",nr); + MYDDAS_MEMORY_FREE_NR(nr); + printf ("Number of times free was called in MYDDAS : %lu \n",nr); + MYDDAS_MEMORY_MALLOC_SIZE(nr); + printf ("Total memory allocated in MYDDAS: %lu \n",nr); + MYDDAS_MEMORY_FREE_SIZE(nr); + printf ("Total memory freed in MYDDAS : %lu \n",nr); +#endif return TRUE; } @@ -624,20 +653,44 @@ c_db_stats(void) { /* Function to delete all the temporary tables */ /* from the mysql server */ -void Yap_MyDDAS_delete_all_myddas_structs(void) +void Yap_MYDDAS_delete_all_myddas_structs(void) { - //char *table_name; - //char query[500]; - - /* NAO ESQUECER DE FAZER ISTO TB PARA O DB_CLOSE*/ -/* for(;(table_name = myddas_util_delete_all_temp_table()) != NULL ;) { */ -/* printf ("%s\n",table_name); */ -/* sprintf (query,"DROP TABLE IF EXISTS %s",table_name); */ -/* printf ("%s\n",query); */ -/* free(table_name); */ -/* query[0]=0; */ -/* } */ + /* NAO ESQUECER DE FAZER ISTO TB PARA O DB_CLOSE*/ + MYDDAS_GLOBAL global = + Yap_REGS.MYDDAS_GLOBAL_POINTER; + + /* In case that the MYDDAS module isn't loaded */ + if (global == NULL) + return; + + MYDDAS_UTIL_CONNECTION connections = + global->myddas_top_connections; + + /* Delete all connections */ + for(;connections!=NULL;connections=connections->next) + myddas_util_delete_connection(connections->connection); + +#ifdef MYDDAS_STATS + myddas_stats_delete_stats_list(global->myddas_statistics->stats); + MYDDAS_FREE(global->myddas_statistics,struct myddas_global_stats); +#endif + + MYDDAS_FREE(global,struct myddas_global); + +#ifdef DEBUG + MyddasULInt nr; + MYDDAS_MEMORY_MALLOC_NR(nr); + printf ("Number of times malloc was called in MYDDAS: %lu \n",nr); + MYDDAS_MEMORY_FREE_NR(nr); + printf ("Number of times free was called in MYDDAS : %lu \n",nr); + + MYDDAS_MEMORY_MALLOC_SIZE(nr); + printf ("Total memory allocated in MYDDAS: %lu \n",nr); + MYDDAS_MEMORY_FREE_SIZE(nr); + printf ("Total memory freed in MYDDAS : %lu \n",nr); +#endif + } diff --git a/MYDDAS/myddas_statistics.c b/MYDDAS/myddas_statistics.c index f8b433fe3..2269d0812 100644 --- a/MYDDAS/myddas_statistics.c +++ b/MYDDAS/myddas_statistics.c @@ -65,15 +65,19 @@ myddas_stats_integrity_of_time(MYDDAS_STATS_TIME); MYDDAS_STATS_TIME myddas_stats_walltime(void) { - MYDDAS_STATS_TIME myddas_time; - myddas_time = (MYDDAS_STATS_TIME) malloc (sizeof(struct timeval)); + MYDDAS_STATS_TIME myddas_time = NULL; + MYDDAS_MALLOC(myddas_time,struct myddas_stats_time_struct); myddas_time->type = time_copy; - struct timeval time; - gettimeofday(&time,NULL); - - myddas_time->u.time_copy.tv_sec = time.tv_sec; - myddas_time->u.time_copy.tv_usec = time.tv_usec; + struct timeval *time = NULL; + MYDDAS_MALLOC(time,struct timeval); + + gettimeofday(time,NULL); + + myddas_time->u.time_copy.tv_sec = time->tv_sec; + myddas_time->u.time_copy.tv_usec = time->tv_usec; + + MYDDAS_FREE(time,struct timeval); return myddas_time; } @@ -146,7 +150,7 @@ myddas_stats_move_time(MYDDAS_STATS_TIME from, to->u.time_final.miliseconds = from->u.time_final.miliseconds; to->u.time_final.microseconds = from->u.time_final.microseconds; } - free(from); + MYDDAS_FREE(from,struct myddas_stats_time_struct); } MYDDAS_STATS_TIME @@ -158,7 +162,8 @@ myddas_stats_time_copy_to_final(MYDDAS_STATS_TIME t_copy){ myddas_stats_add_seconds_time(t_final, t_copy->u.time_copy.tv_sec, t_copy->u.time_copy.tv_usec); - free(t_copy); + + MYDDAS_FREE(t_copy,struct myddas_stats_time_struct); return t_final; } @@ -233,6 +238,62 @@ myddas_stats_integrity_of_time(MYDDAS_STATS_TIME myddas_time){ } } +MYDDAS_GLOBAL +myddas_stats_initialize_global_stats(MYDDAS_GLOBAL global){ + + MYDDAS_STATS_STRUCT stats = NULL; + + short i; + + /* For the time statistics */ + /* + Stats [1] - Total Time spent on the db_row function + Stats [2] - Total Time spent on the translate/3 predicate + */ + + /* First */ + stats = myddas_stats_initialize_stat(stats,time_str); + (global->myddas_statistics)->stats = stats; + for(i=0;i<1;i++){ + myddas_stats_initialize_stat(stats,time_str); + } + + return global; +} + +MYDDAS_STATS_STRUCT +myddas_stats_initialize_connection_stats(){ + /* + Stats [1] - Total of Time Spent by the DB Server processing all the SQL Querys + Stats [2] - Total of Time Spent by the DB Server processing the last SQL Query + Stats [3] - Total of Time Spent by the DB Server transfering all the results of the SQL Querys + Stats [4] - Total of Time Spent by the DB Server transfering the result of the last SQL Query + + Stats [5] - Total number of Rows returned by the server + Stats [6] - Total of Bytes Transfered by the DB Server on all SQL Querys + Stats [7] - Total of Bytes Transfered by the DB Server on the last SQL Query + Stats [8] - Number of querys made to the DBserver + */ + + short i; + MYDDAS_STATS_STRUCT new = NULL ; + MYDDAS_STATS_STRUCT first; + /* For the time statistics */ + + /* First */ + new = myddas_stats_initialize_stat(new,time_str); + first = new; + for(i=0;i<3;i++){ + new = myddas_stats_initialize_stat(new,time_str); + } + + /* For number statistics*/ + for (i=0;i<4;i++){ + new = myddas_stats_initialize_stat(new,integer); + } + + return first; +} MYDDAS_STATS_STRUCT myddas_stats_initialize_stat(MYDDAS_STATS_STRUCT stat,int type){ @@ -240,12 +301,12 @@ myddas_stats_initialize_stat(MYDDAS_STATS_STRUCT stat,int type){ MYDDAS_STATS_STRUCT temp_str = stat; if (stat == NULL){ - stat = (MYDDAS_STATS_STRUCT) malloc (sizeof(struct myddas_stats_struct)); + MYDDAS_MALLOC(stat,struct myddas_stats_struct); temp_str = stat; } else { - for (;temp_str->next != NULL;temp_str = temp_str->next); - temp_str->next = (MYDDAS_STATS_STRUCT) malloc (sizeof(struct myddas_stats_struct)); - temp_str = temp_str->next; + for (;temp_str->nxt != NULL;temp_str = temp_str->nxt); + MYDDAS_MALLOC(temp_str->nxt,struct myddas_stats_struct); + temp_str = temp_str->nxt; } if (type == time_str){ @@ -255,7 +316,7 @@ myddas_stats_initialize_stat(MYDDAS_STATS_STRUCT stat,int type){ } temp_str->type = type; temp_str->count = 0; - temp_str->next = NULL; + temp_str->nxt = NULL; return temp_str; } @@ -265,9 +326,31 @@ myddas_stats_get_stat(MYDDAS_STATS_STRUCT stat,int index){ MYDDAS_STATS_STRUCT temp = stat; for (;index>1;index--){ - temp = temp->next; + temp = temp->nxt; } return temp; } + +void +myddas_stats_delete_stats_list(MYDDAS_STATS_STRUCT list){ + + MYDDAS_STATS_STRUCT to_delete = list; + + for (;to_delete!=NULL;){ + list = list->nxt; + + + if (to_delete->type == time_str){ + MYDDAS_FREE(to_delete->u.time_str.time_str,struct myddas_stats_time_struct); + } + + MYDDAS_FREE(to_delete,struct myddas_stats_struct); + + to_delete = list; + } + +} + + #endif /* MYDDAS_STATS || MYDDAS_TOP_LEVEL */ diff --git a/MYDDAS/myddas_statistics.h b/MYDDAS/myddas_statistics.h index 5958ec1d9..1cb810abb 100644 --- a/MYDDAS/myddas_statistics.h +++ b/MYDDAS/myddas_statistics.h @@ -26,7 +26,7 @@ #endif #define MYDDAS_STATS_INITIALIZE_TIME_STRUCT(TIME,TYPE) \ - TIME = (MYDDAS_STATS_TIME) malloc (sizeof(struct myddas_stats_time_struct)); \ + MYDDAS_MALLOC(TIME,struct myddas_stats_time_struct); \ \ if (TYPE == time_copy){ \ TIME->type = TYPE; \ @@ -41,22 +41,6 @@ TIME->u.time_final.microseconds = 0; \ } -/* - Stats [1] - Total Time spent on the db_row function - Stats [2] - Total Time spent on the translate/3 predicate -*/ -#define MYDDAS_STATS_INITIALIZE_GLOBAL_STATS(STATS) \ - short i; \ - \ - /* For the time statistics */ \ - \ - /* First */ \ - STATS = myddas_stats_initialize_stat(STATS,time_str); \ - for(i=0;i<1;i++){ \ - myddas_stats_initialize_stat(STATS,time_str); \ - } - - /* Stats [1] - Total of Time Spent by the DB Server processing all the SQL Querys Stats [2] - Total of Time Spent by the DB Server processing the last SQL Query @@ -82,7 +66,8 @@ /* For number statistics*/ \ for (i=0;i<4;i++){ \ myddas_stats_initialize_stat(STATS,integer); \ - } \ + } + #define MYDDAS_STATS_CON_GET_TOTAL_TIME_DBSERVER(NODE,TIME) \ TIME = myddas_stats_get_stat(NODE->stats,1)->u.time_str.time_str; diff --git a/MYDDAS/myddas_statistics_structs.h b/MYDDAS/myddas_statistics_structs.h index e7c7a7ccc..45da12996 100644 --- a/MYDDAS/myddas_statistics_structs.h +++ b/MYDDAS/myddas_statistics_structs.h @@ -21,7 +21,7 @@ struct myddas_stats_struct{ } integer; } u; MyddasULInt count; - MYDDAS_STATS_STRUCT next; + MYDDAS_STATS_STRUCT nxt; }; /* Time structure for the MYDDAS Interface */ diff --git a/MYDDAS/myddas_structs.h b/MYDDAS/myddas_structs.h index 89676faf6..1fc81e2a8 100644 --- a/MYDDAS/myddas_structs.h +++ b/MYDDAS/myddas_structs.h @@ -14,6 +14,17 @@ struct myddas_global { #ifdef MYDDAS_STATS MYDDAS_GLOBAL_STATS myddas_statistics; #endif +#ifdef DEBUG + /* Number times malloc was called */ + MyddasULInt malloc_called; + /* Memory allocated by MYDDAS */ + MyddasULInt memory_allocated; + + /* Number times free was called */ + MyddasULInt free_called; + /* Memory freed by MYDDAS */ + MyddasULInt memory_freed; +#endif }; struct myddas_list_preds { @@ -27,7 +38,7 @@ struct myddas_list_preds { struct myddas_list_connection { void *connection; - + /*If variable env is NULL, then it's a MySQL connection, if not then it as the pointer to the ODBC enviromment variable */ @@ -36,33 +47,6 @@ struct myddas_list_connection { #ifdef MYDDAS_STATS MYDDAS_STATS_STRUCT stats; #endif -/* #ifdef MYDDAS_STATS */ -/* /\* Total number of Rows returnes from the DataBase Server *\/ */ -/* unsigned long totalNumberOfRows; */ - -/* /\* Total Time spent by the DataBase Server */ -/* processing all querys *\/ */ -/* MYDDAS_STATS_TIME totalTimeofDBServer; */ -/* /\* Time spent by the DataBase Server, processing */ -/* the last query *\/ */ -/* MYDDAS_STATS_TIME lastTimeofDBServer; */ - -/* /\* Total Time spent by the DataBase Server, */ -/* transfering all the data to the client *\/ */ -/* MYDDAS_STATS_TIME totalFromDBServer; */ -/* /\* Time spent by the DataBase Server, */ -/* transfering the data of the last query *\/ */ -/* MYDDAS_STATS_TIME lastFromDBServer; */ - -/* /\* Last bytes transfered from the server *\/ */ -/* unsigned long totalBytesTransfered; */ -/* /\* Total bytes transfered from the server *\/ */ -/* unsigned long lastBytesTransfered; */ - -/* /\* Number of querys made to the Server*\/ */ -/* unsigned long total_querys_made; */ - -/* #endif */ MYDDAS_UTIL_PREDICATE predicates; /* Multi Queries Section */ diff --git a/MYDDAS/myddas_util.c b/MYDDAS/myddas_util.c index 7c0fdbc75..3d482a55c 100755 --- a/MYDDAS/myddas_util.c +++ b/MYDDAS/myddas_util.c @@ -9,7 +9,6 @@ #ifdef MYDDAS_STATS #include "myddas_statistics.h" #endif -#include "myddas_initialization.c" #ifdef MYDDAS_ODBC #include #endif /*MYDDAS_ODBC*/ @@ -78,7 +77,7 @@ myddas_util_add_predicate(char *pred_name, Int pred_arity, myddas_util_search_connection(con); MYDDAS_UTIL_PREDICATE new = - myddas_util_initialize_predicate(pred_name,pred_arity,pred_module,node_con->predicates); + myddas_init_initialize_predicate(pred_name,pred_arity,pred_module,node_con->predicates); if (new == NULL) { @@ -105,8 +104,7 @@ myddas_util_delete_predicate(MYDDAS_UTIL_PREDICATE to_delete){ break; con_node->predicates = to_delete->next; } - - free(to_delete); + MYDDAS_FREE(to_delete,struct myddas_list_preds); } void @@ -121,6 +119,10 @@ myddas_util_delete_connection(void *conn){ /* Removes the predicates list */ myddas_util_delete_predicate_list(to_delete->predicates); +#ifdef MYDDAS_STATS + /* Removes the stats list */ + myddas_stats_delete_stats_list(to_delete->stats); +#endif /* List Integrety */ /* Is the last element of the list */ if ((to_delete->next) != NULL) @@ -132,7 +134,7 @@ myddas_util_delete_connection(void *conn){ else to_delete->previous->next=to_delete->next; - free(to_delete); + MYDDAS_FREE(to_delete,struct myddas_list_connection); return; } } @@ -164,7 +166,7 @@ myddas_util_add_connection(void *conn, void *enviromment){ return node; } //put the new connection node on the top of the list - temp = myddas_util_initialize_connection(conn,enviromment,Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections); + temp = myddas_init_initialize_connection(conn,enviromment,Yap_REGS.MYDDAS_GLOBAL_POINTER->myddas_top_connections); if (temp == NULL) { #ifdef DEBUG @@ -243,12 +245,11 @@ myddas_util_delete_predicate_list(MYDDAS_UTIL_PREDICATE preds_list){ to_delete = preds_list; preds_list = preds_list->next; - free(to_delete); + MYDDAS_FREE(to_delete,struct myddas_list_preds); } return; } - #ifdef MYDDAS_MYSQL void myddas_util_table_write(MYSQL_RES *res_set){ @@ -319,7 +320,7 @@ myddas_util_table_write(MYSQL_RES *res_set){ #endif //DELETE THIS WHEN DB_STATS IS COMPLETED -Int +MyddasInt get_myddas_top(){ if (Yap_REGS.MYDDAS_GLOBAL_POINTER == NULL) return 0; @@ -332,7 +333,7 @@ myddas_util_get_pred_next(void *pointer){ return (void *) (temp->next); } -Int +MyddasInt myddas_util_get_pred_arity(void *pointer){ MYDDAS_UTIL_PREDICATE temp = (MYDDAS_UTIL_PREDICATE) pointer; return temp->pred_arity; diff --git a/Makefile.in b/Makefile.in index 1fc9254e8..39f92cfcb 100644 --- a/Makefile.in +++ b/Makefile.in @@ -173,6 +173,7 @@ C_SOURCES= \ $(srcdir)/MYDDAS/myddas_mysql.c \ $(srcdir)/MYDDAS/myddas_odbc.c \ $(srcdir)/MYDDAS/myddas_util.c \ + $(srcdir)/MYDDAS/myddas_initialization.c \ $(srcdir)/MYDDAS/myddas_shared.c \ $(srcdir)/MYDDAS/myddas_statistics.c \ $(srcdir)/MYDDAS/myddas_top_level.c @@ -211,7 +212,7 @@ ENGINE_OBJECTS = \ exec.o gprof.o grow.o \ heapgc.o index.o init.o inlines.o \ iopreds.o depth_bound.o mavar.o \ - myddas_mysql.o myddas_odbc.o myddas_shared.o \ + myddas_mysql.o myddas_odbc.o myddas_shared.o myddas_initialization.o \ myddas_util.o myddas_statistics.o myddas_top_level.o modules.o other.o \ parser.o save.o scanner.o sort.o stdpreds.o sysbits.o threads.o \ tracer.o \ @@ -436,6 +437,9 @@ myddas_shared.o: $(srcdir)/MYDDAS/myddas_shared.c myddas_util.o: $(srcdir)/MYDDAS/myddas_util.c $(CC) -c $(CFLAGS) $(srcdir)/MYDDAS/myddas_util.c -o $@ +myddas_initialization.o: $(srcdir)/MYDDAS/myddas_initialization.c + $(CC) -c $(CFLAGS) $(srcdir)/MYDDAS/myddas_initialization.c -o $@ + myddas_top_level.o: $(srcdir)/MYDDAS/myddas_top_level.c $(CC) -c $(CFLAGS) $(srcdir)/MYDDAS/myddas_top_level.c -o $@ diff --git a/library/MYDDAS/myddas.ypp b/library/MYDDAS/myddas.ypp index 459c83fd3..ce89bbb49 100755 --- a/library/MYDDAS/myddas.ypp +++ b/library/MYDDAS/myddas.ypp @@ -15,6 +15,10 @@ * * *************************************************************************/ + +/* Initialize MYDDAS GLOBAL STRUCTURES */ +:- c_db_initialize_myddas. + :- module(myddas,[ db_open/5, db_open/4,