diff options
| -rw-r--r-- | src/ecgen.c | 2 | ||||
| -rw-r--r-- | src/gen/gens.c | 2 | ||||
| -rw-r--r-- | src/invalid/invalid_thread.c | 3 | ||||
| -rw-r--r-- | src/util/timeout.c | 21 | ||||
| -rw-r--r-- | src/util/timeout.h | 36 | ||||
| -rw-r--r-- | test/src/util/test_timeout.c | 7 |
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; |
