summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-01-20 11:15:19 +0100
committerChristian Grothoff <christian@grothoff.org>2020-01-20 11:15:19 +0100
commit85f10a86ff8ea2c441783396bd2dc880a9daf3e5 (patch)
treea3ce55dce408378fb37333b0970d89e95c493208 /src
parent72293a25ac5a989d982548fceba1c8ab5b8aba07 (diff)
downloadexchange-85f10a86ff8ea2c441783396bd2dc880a9daf3e5.tar.gz
exchange-85f10a86ff8ea2c441783396bd2dc880a9daf3e5.tar.bz2
exchange-85f10a86ff8ea2c441783396bd2dc880a9daf3e5.zip
handle case where get_session() is called from main, i.e. in combination with -f option
Diffstat (limited to 'src')
-rwxr-xr-xsrc/exchange/test_taler_exchange_httpd_afl.sh2
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c42
2 files changed, 36 insertions, 8 deletions
diff --git a/src/exchange/test_taler_exchange_httpd_afl.sh b/src/exchange/test_taler_exchange_httpd_afl.sh
index ca85d26bf..cab70722a 100755
--- a/src/exchange/test_taler_exchange_httpd_afl.sh
+++ b/src/exchange/test_taler_exchange_httpd_afl.sh
@@ -47,6 +47,6 @@ export GNUNET_FORCE_LOG=";;;;ERROR"
for n in afl-tests/*
do
echo -n "Test $n "
- $PREFIX taler-exchange-httpd -c test_taler_exchange_httpd.conf -t 1 -f $n -C > /dev/null && echo "OK" || echo "FAIL $!!"
+ $PREFIX taler-exchange-httpd -c test_taler_exchange_httpd.conf -t 1 -f $n -C > /dev/null && echo "OK" || echo "FAIL"
done
exit 0
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c
index 9f330cc8c..9ccf96b54 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -134,6 +134,16 @@ struct PostgresClosure
* Which currency should we assume all amounts to be in?
*/
char *currency;
+
+ /**
+ * Session to be used if the thread is @e main_self.
+ */
+ struct TALER_EXCHANGEDB_Session *main_session;
+
+ /**
+ * Handle for the main() thread of the program.
+ */
+ pthread_t main_self;
};
@@ -223,7 +233,12 @@ postgres_get_session (void *cls)
struct GNUNET_PQ_Context *db_conn;
struct TALER_EXCHANGEDB_Session *session;
- if (NULL != (session = pthread_getspecific (pc->db_conn_threadlocal)))
+ if (pthread_equal (pc->main_self,
+ pthread_self ()))
+ session = pc->main_session;
+ else
+ session = pthread_getspecific (pc->db_conn_threadlocal);
+ if (NULL != session)
{
GNUNET_PQ_reconnect_if_down (session->conn);
return session;
@@ -1381,13 +1396,21 @@ postgres_get_session (void *cls)
return NULL;
session = GNUNET_new (struct TALER_EXCHANGEDB_Session);
session->conn = db_conn;
- if (0 != pthread_setspecific (pc->db_conn_threadlocal,
- session))
+ if (pthread_equal (pc->main_self,
+ pthread_self ()))
{
- GNUNET_break (0);
- GNUNET_PQ_disconnect (db_conn);
- GNUNET_free (session);
- return NULL;
+ pc->main_session = session;
+ }
+ else
+ {
+ if (0 != pthread_setspecific (pc->db_conn_threadlocal,
+ session))
+ {
+ GNUNET_break (0);
+ GNUNET_PQ_disconnect (db_conn);
+ GNUNET_free (session);
+ return NULL;
+ }
}
return session;
}
@@ -7195,6 +7218,7 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
const char *ec;
pg = GNUNET_new (struct PostgresClosure);
+ pg->main_self = pthread_self (); /* loaded while single-threaded! */
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_filename (cfg,
"exchangedb-postgres",
@@ -7379,6 +7403,10 @@ libtaler_plugin_exchangedb_postgres_done (void *cls)
struct TALER_EXCHANGEDB_Plugin *plugin = cls;
struct PostgresClosure *pg = plugin->cls;
+ /* If we launched a session for the main thread,
+ kill it here before we unload */
+ if (NULL != pg->main_session)
+ db_conn_destroy (pg->main_session);
GNUNET_free (pg->connection_cfg_str);
GNUNET_free (pg->sql_dir);
GNUNET_free (pg->currency);