aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--e-util/ChangeLog13
-rw-r--r--e-util/e-memory.c9
-rw-r--r--e-util/e-sexp.c6
3 files changed, 28 insertions, 0 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
index 1494b6130b..b45ffddc82 100644
--- a/e-util/ChangeLog
+++ b/e-util/ChangeLog
@@ -1,3 +1,16 @@
+2000-11-29 Not Zed <NotZed@HelixCode.com>
+
+ * e-sexp.c (term_eval_lt): Plug a memleak, need to free results
+ from term_eval().
+ (term_eval_gt):
+ (term_eval_eq):
+
+2000-11-27 Not Zed <NotZed@HelixCode.com>
+
+ * e-memory.c (e_mempool_new): Added some locking to global data.
+ This should make the interfaces mt-safe, although each object is
+ only per-thread safe.
+
2000-11-22 Not Zed <NotZed@HelixCode.com>
* e-memory.c (e_mempool_alloc): If we dont get a big enough chunk
diff --git a/e-util/e-memory.c b/e-util/e-memory.c
index e8e52fdb5c..1c3958b6f3 100644
--- a/e-util/e-memory.c
+++ b/e-util/e-memory.c
@@ -336,6 +336,9 @@ typedef struct _EMemPool {
/* a pool of mempool header blocks */
static MemChunk *mempool_memchunk;
+#ifdef G_THREADS_ENABLED
+static GStaticMutex mempool_mutex = G_STATIC_MUTEX_INIT;
+#endif
/**
* e_mempool_new:
@@ -363,10 +366,16 @@ MemPool *e_mempool_new(int blocksize, int threshold, EMemPoolFlags flags)
{
MemPool *pool;
+#ifdef G_THREADS_ENABLED
+ g_static_mutex_lock(&mempool_mutex);
+#endif
if (mempool_memchunk == NULL) {
mempool_memchunk = e_memchunk_new(8, sizeof(MemPool));
}
pool = e_memchunk_alloc(mempool_memchunk);
+#ifdef G_THREADS_ENABLED
+ g_static_mutex_unlock(&mempool_mutex);
+#endif
if (threshold >= blocksize)
threshold = blocksize * 2 / 3;
pool->blocksize = blocksize;
diff --git a/e-util/e-sexp.c b/e-util/e-sexp.c
index 2757ea2043..08b9bb6a62 100644
--- a/e-util/e-sexp.c
+++ b/e-util/e-sexp.c
@@ -320,6 +320,8 @@ term_eval_lt(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
r->type = ESEXP_RES_BOOL;
r->value.bool = strcmp(r1->value.string, r2->value.string) < 0;
}
+ e_sexp_result_free(r1);
+ e_sexp_result_free(r2);
}
return r;
}
@@ -344,6 +346,8 @@ term_eval_gt(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
r->type = ESEXP_RES_BOOL;
r->value.bool = strcmp(r1->value.string, r2->value.string) > 0;
}
+ e_sexp_result_free(r1);
+ e_sexp_result_free(r2);
}
return r;
}
@@ -368,6 +372,8 @@ term_eval_eq(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
} else if (r1->type == ESEXP_RES_STRING) {
r->value.bool = strcmp(r1->value.string, r2->value.string) == 0;
}
+ e_sexp_result_free(r1);
+ e_sexp_result_free(r2);
}
return r;
}