Changeset: c799ecb58b6f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c799ecb58b6f
Modified Files:
gdk/gdk_bbp.c
monetdb5/mal/mal.c
sql/server/sql_mvc.c
tools/mserver/mserver5.c
Branch: Jun2016
Log Message:
Fix some memory leaks.
A start and immediate exit of the server with gcc's -fsanitize=address
option now results in zero messages.
diffs (140 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1389,7 +1389,11 @@ BBPinit(void)
GDKfatal("BBPinit: cannot properly prepare process %s. Please
check whether your disk is full or write-protected", BAKDIR);
/* cleanup any leftovers (must be done after BBPrecover) */
- BBPdiskscan(GDKfilepath(0, NULL, BATDIR, NULL));
+ {
+ char *d = GDKfilepath(0, NULL, BATDIR, NULL);
+ BBPdiskscan(d);
+ GDKfree(d);
+ }
#if SIZEOF_SIZE_T == 8 && SIZEOF_OID == 8
if (oidsize == SIZEOF_INT)
@@ -4065,6 +4069,7 @@ BBPrecover_subdir(void)
struct dirent *dent;
gdk_return ret = GDK_SUCCEED;
+ GDKfree(subdirpath);
if (dirp == NULL) {
return GDK_SUCCEED; /* nothing to do */
}
@@ -4094,7 +4099,6 @@ BBPrecover_subdir(void)
if (ret != GDK_SUCCEED)
GDKerror("BBPrecover_subdir: recovery failed. Please check
whether your disk is full or write-protected.\n");
- GDKfree(subdirpath);
return ret;
}
@@ -4312,10 +4316,19 @@ BBPatom_load(int atom)
void
gdk_bbp_reset(void)
{
- memset((char*) BBP, 0, sizeof(BBP));
+ int i;
+
+ while (BBPlimit > 0) {
+ BBPlimit -= BBPINIT;
+ assert(BBPlimit >= 0);
+ GDKfree(BBP[BBPlimit >> BBPINITLOG]);
+ }
+ memset(BBP, 0, sizeof(BBP));
BBPlimit = 0;
BBPsize = 0;
- memset((char*) BBPfarms, 0, sizeof(BBPfarms));
+ for (i = 0; i < MAXFARMS; i++)
+ GDKfree((void *) BBPfarms[i].dirname); /* loose "const" */
+ memset(BBPfarms, 0, sizeof(BBPfarms));
BBP_hash = 0;
BBP_mask = 0;
stamp = 0;
@@ -4328,8 +4341,8 @@ gdk_bbp_reset(void)
locked_by = 0;
BBPunloadCnt = 0;
- memset((char*) lastused, 0, sizeof(lastused));
- memset((char*) bbptrim, 0, sizeof(bbptrim));
+ memset(lastused, 0, sizeof(lastused));
+ memset(bbptrim, 0, sizeof(bbptrim));
bbptrimfirst = BBPMAXTRIM;
bbptrimlast = 0;
bbptrimmax = BBPMAXTRIM;
diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -143,6 +143,7 @@ void mserver_reset(void)
*/
mal_factory_reset();
mal_dataflow_reset();
+ THRdel(mal_clients->mythread);
GDKreset(0); // terminate all other threads
mal_client_reset();
mal_module_reset();
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -27,37 +27,37 @@ mvc_init(int debug, store_type store, in
{
int first = 0;
- logger_settings *log_settings = (struct logger_settings *)
GDKmalloc(sizeof(struct logger_settings));
+ logger_settings log_settings;
/* Set the default WAL directory. "sql_logs" by default */
- log_settings->logdir = "sql_logs";
+ log_settings.logdir = "sql_logs";
/* Get and pass on the WAL directory location, if set */
if (GDKgetenv("gdk_logdir") != NULL) {
- log_settings->logdir = GDKgetenv("gdk_logdir");
+ log_settings.logdir = GDKgetenv("gdk_logdir");
}
/* Get and pass on the shared WAL directory location, if set */
- log_settings->shared_logdir = GDKgetenv("gdk_shared_logdir");
+ log_settings.shared_logdir = GDKgetenv("gdk_shared_logdir");
/* Get and pass on the shared WAL drift threshold, if set.
* -1 by default, meaning it should be ignored, since it is not set */
- log_settings->shared_drift_threshold =
GDKgetenv_int("gdk_shared_drift_threshold", -1);
+ log_settings.shared_drift_threshold =
GDKgetenv_int("gdk_shared_drift_threshold", -1);
/* Get and pass on the flag how many WAL files should be preserved.
* 0 by default - keeps only the current WAL file. */
- log_settings->keep_persisted_log_files =
GDKgetenv_int("gdk_keep_persisted_log_files", 0);
+ log_settings.keep_persisted_log_files =
GDKgetenv_int("gdk_keep_persisted_log_files", 0);
mvc_debug = debug&4;
if (mvc_debug) {
- fprintf(stderr, "#mvc_init logdir %s\n", log_settings->logdir);
- fprintf(stderr, "#mvc_init keep_persisted_log_files %d\n",
log_settings->keep_persisted_log_files);
- if (log_settings->shared_logdir != NULL) {
- fprintf(stderr, "#mvc_init shared_logdir %s\n",
log_settings->shared_logdir);
+ fprintf(stderr, "#mvc_init logdir %s\n", log_settings.logdir);
+ fprintf(stderr, "#mvc_init keep_persisted_log_files %d\n",
log_settings.keep_persisted_log_files);
+ if (log_settings.shared_logdir != NULL) {
+ fprintf(stderr, "#mvc_init shared_logdir %s\n",
log_settings.shared_logdir);
}
- fprintf(stderr, "#mvc_init shared_drift_threshold %d\n",
log_settings->shared_drift_threshold);
+ fprintf(stderr, "#mvc_init shared_drift_threshold %d\n",
log_settings.shared_drift_threshold);
}
keyword_init();
scanner_init_keywords();
- if ((first = store_init(debug, store, ro, su, log_settings, stk)) < 0) {
+ if ((first = store_init(debug, store, ro, su, &log_settings, stk)) < 0)
{
fprintf(stderr, "!mvc_init: unable to create system tables\n");
return -1;
}
diff --git a/tools/mserver/mserver5.c b/tools/mserver/mserver5.c
--- a/tools/mserver/mserver5.c
+++ b/tools/mserver/mserver5.c
@@ -511,6 +511,7 @@ main(int argc, char **av)
} else {
BBPaddfarm(dbpath, (1 << PERSISTENT) | (1 << TRANSIENT));
}
+ GDKfree(dbpath);
if (monet_init(set, setlen) == 0) {
mo_free_options(set, setlen);
return 0;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list