From 1bef1b1dca999de49f79a050970f2e87098ee5c5 Mon Sep 17 00:00:00 2001 From: Evan Miller Date: Thu, 12 Nov 2020 11:20:05 -0500 Subject: [PATCH 1/2] Use re-entrant functions in a couple of places Replace strtok and gmtime with their re-entrant versions. More to come. --- src/libmdb/options.c | 5 +++-- src/sql/mdbsql.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libmdb/options.c b/src/libmdb/options.c index 56c550f..68ba32d 100644 --- a/src/libmdb/options.c +++ b/src/libmdb/options.c @@ -50,9 +50,10 @@ load_options() { char *opt; char *s; + char *ctx; if (!optset && (s=getenv("MDBOPTS"))) { - opt = strtok(s, ":"); + opt = strtok_r(s, ":", &ctx); while (opt) { if (!strcmp(opt, "use_index")) opts |= MDB_USE_INDEX; if (!strcmp(opt, "no_memo")) opts |= MDB_NO_MEMO; @@ -70,7 +71,7 @@ load_options() opts |= MDB_DEBUG_ROW; opts |= MDB_DEBUG_PROPS; } - opt = strtok(NULL,":"); + opt = strtok_r(NULL,":", &ctx); } } optset = 1; diff --git a/src/sql/mdbsql.c b/src/sql/mdbsql.c index 3a365b4..17e3e47 100644 --- a/src/sql/mdbsql.c +++ b/src/sql/mdbsql.c @@ -760,8 +760,9 @@ int mdb_sql_find_sargcol(MdbSargNode *node, gpointer data) * Plain integers are UNIX timestamps for backwards compatibility of parser */ if (col->col_type == MDB_DATETIME && node->val_type == MDB_INT) { - struct tm *tm = gmtime((time_t*)&node->value.i); - mdb_tm_to_date(tm, &node->value.d); + struct tm tm; + gmtime_r((time_t*)&node->value.i, &tm); + mdb_tm_to_date(&tm, &node->value.d); node->val_type = MDB_DOUBLE; } } From df48fcb284328c329c883e9fb3f140d2efae533a Mon Sep 17 00:00:00 2001 From: Evan Miller Date: Thu, 12 Nov 2020 13:38:32 -0500 Subject: [PATCH 2/2] Use thread-local storage to cache run-time options --- src/libmdb/options.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libmdb/options.c b/src/libmdb/options.c index 68ba32d..f8ef468 100644 --- a/src/libmdb/options.c +++ b/src/libmdb/options.c @@ -24,8 +24,8 @@ #define DEBUG 1 -static unsigned long opts; -static int optset; +static __thread unsigned long opts; +static __thread int optset; static void load_options(void);