aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ecgen.c2
-rw-r--r--src/gen/gens.c2
-rw-r--r--src/invalid/invalid_thread.c3
-rw-r--r--src/util/timeout.c21
-rw-r--r--src/util/timeout.h36
-rw-r--r--test/src/util/test_timeout.c7
6 files changed, 55 insertions, 16 deletions
diff --git a/src/ecgen.c b/src/ecgen.c
index 4a7f94a..fbf6030 100644
--- a/src/ecgen.c
+++ b/src/ecgen.c
@@ -80,6 +80,8 @@ bool init(void) {
int quit(int status) {
pari_close();
+ timeout_quit();
+
output_quit();
input_quit();
diff --git a/src/gen/gens.c b/src/gen/gens.c
index ffa4158..ba94c64 100644
--- a/src/gen/gens.c
+++ b/src/gen/gens.c
@@ -12,7 +12,7 @@ static int gens_put(curve_t *curve, GEN generators, long len) {
for (long i = 1; i <= len; ++i) {
point_t *p = point_new();
- p->point = gel(generators, i);
+ p->point = gcopy(gel(generators, i));
p->order = ellorder(curve->curve, p->point, NULL);
p->cofactor = divii(curve->order, p->order);
curve->generators[i - 1] = p;
diff --git a/src/invalid/invalid_thread.c b/src/invalid/invalid_thread.c
index a8151c2..c9e8108 100644
--- a/src/invalid/invalid_thread.c
+++ b/src/invalid/invalid_thread.c
@@ -6,11 +6,13 @@
#include "invalid_thread.h"
#include "gen/curve.h"
#include "util/random.h"
+#include "util/timeout.h"
void *invalid_thread(void *arg) {
thread_t *thread = (thread_t *)arg;
pari_thread_start(thread->pari_thread);
random_init();
+ timeout_thread_init();
arg_t *invalid_argss[OFFSET_END] = {NULL};
exhaustive_t invalid_setup = {.generators = thread->setup->generators,
.validators = thread->setup->validators,
@@ -83,5 +85,6 @@ void *invalid_thread(void *arg) {
curve_free(&invalid);
pari_thread_close();
+ timeout_thread_quit();
return NULL;
}
diff --git a/src/util/timeout.c b/src/util/timeout.c
index d273ecb..21f9591 100644
--- a/src/util/timeout.c
+++ b/src/util/timeout.c
@@ -3,10 +3,12 @@
* Copyright (C) 2017-2018 J08nY
*/
#include "timeout.h"
+#include "util/memory.h"
__thread jmp_buf timeout_ptr;
__thread bool timeout_in = false;
-__thread timer_t timeout_timer;
+__thread timer_t *timeout_timer;
+__thread struct sigevent *sevp;
void timeout_handle(int signum, siginfo_t *siginfo, void *other) {
sigset_t mask;
@@ -17,7 +19,19 @@ void timeout_handle(int signum, siginfo_t *siginfo, void *other) {
if (timeout_in) siglongjmp(timeout_ptr, 1);
}
+void timeout_thread_init() {
+ timeout_timer = try_calloc(sizeof(timer_t));
+ sevp = try_calloc(sizeof(struct sigevent));
+}
+
+void timeout_thread_quit() {
+ try_free(timeout_timer);
+ try_free(sevp);
+}
+
bool timeout_init() {
+ // init for the main thread.
+ timeout_thread_init();
struct sigaction new_action;
new_action.sa_sigaction = timeout_handle;
@@ -26,4 +40,9 @@ bool timeout_init() {
sigaction(SIGALRM, &new_action, NULL);
return true;
+}
+
+void timeout_quit() {
+ // deinit the main thread.
+ timeout_thread_quit();
} \ No newline at end of file
diff --git a/src/util/timeout.h b/src/util/timeout.h
index 7aa3727..8f545dd 100644
--- a/src/util/timeout.h
+++ b/src/util/timeout.h
@@ -17,7 +17,8 @@
extern __thread sigjmp_buf timeout_ptr;
extern __thread bool timeout_in;
-extern __thread timer_t timeout_timer;
+extern __thread timer_t *timeout_timer;
+extern __thread struct sigevent *sevp;
/**
* @brief Start a timer that times out after <code>seconds-</code>.
@@ -31,16 +32,16 @@ extern __thread timer_t timeout_timer;
*/
#define timeout_start(seconds) \
if ((seconds) != 0) { \
- struct sigevent sevp; \
- sevp.sigev_notify = SIGEV_THREAD_ID; \
- sevp.sigev_signo = SIGALRM; \
- sevp._sigev_un._tid = (__pid_t)syscall(SYS_gettid); \
+ sevp->sigev_notify = SIGEV_THREAD_ID; \
+ sevp->sigev_signo = SIGALRM; \
+ sevp->sigev_value.sival_int = 0; \
+ sevp->_sigev_un._tid = (__pid_t)syscall(SYS_gettid); \
\
- timer_create(CLOCK_MONOTONIC, &sevp, &timeout_timer); \
+ timer_create(CLOCK_MONOTONIC, sevp, timeout_timer); \
struct itimerspec timer_time = { \
.it_interval = {.tv_sec = 0, .tv_nsec = 0}, \
.it_value = {.tv_sec = (seconds), .tv_nsec = 0}}; \
- timer_settime(timeout_timer, 0, &timer_time, NULL); \
+ timer_settime(*timeout_timer, 0, &timer_time, NULL); \
timeout_in = true; \
}; \
if ((seconds) != 0 && sigsetjmp(timeout_ptr, 1) == 1)
@@ -48,18 +49,27 @@ extern __thread timer_t timeout_timer;
/**
* @brief Stop a timer.
*/
-#define timeout_stop() \
- { \
- if (timeout_in) { \
- timeout_in = false; \
- timer_delete(timeout_timer); \
- } \
+#define timeout_stop() \
+ { \
+ if (timeout_in) { \
+ timeout_in = false; \
+ timer_delete(*timeout_timer); \
+ } \
}
+void timeout_thread_init();
+
+void timeout_thread_quit();
+
/**
* @brief Initialize the timeout system.
* @return whether the initalization was successful
*/
bool timeout_init();
+/**
+ * @brief Deinitialize the timeout system.
+ */
+void timeout_quit();
+
#endif // ECGEN_TIMEOUT_H
diff --git a/test/src/util/test_timeout.c b/test/src/util/test_timeout.c
index 21a13b0..adf9b2a 100644
--- a/test/src/util/test_timeout.c
+++ b/test/src/util/test_timeout.c
@@ -12,7 +12,12 @@ void timeout_setup(void) {
timeout_init();
}
-TestSuite(timeout, .init = timeout_setup, .fini = default_teardown);
+void timeout_teardown(void) {
+ default_teardown();
+ timeout_quit();
+}
+
+TestSuite(timeout, .init = timeout_setup, .fini = timeout_teardown);
Test(timeout, test_timeout_stop) {
bool done = false;