diff options
| author | J08nY | 2017-04-10 00:19:15 +0200 |
|---|---|---|
| committer | J08nY | 2017-04-10 00:19:15 +0200 |
| commit | 3598e2d17837e480869e472e224140ad2643c58c (patch) | |
| tree | 701b50392b63710ffdeb5c991c3c0a25bb057e4d /src/invalid/invalid.c | |
| parent | 9a9bf116e6f511e9d3c8c3e40bba4bd1920bdd99 (diff) | |
| download | ecgen-3598e2d17837e480869e472e224140ad2643c58c.tar.gz ecgen-3598e2d17837e480869e472e224140ad2643c58c.tar.zst ecgen-3598e2d17837e480869e472e224140ad2643c58c.zip | |
Diffstat (limited to 'src/invalid/invalid.c')
| -rw-r--r-- | src/invalid/invalid.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/invalid/invalid.c b/src/invalid/invalid.c index 1dd4fee..4a14ad1 100644 --- a/src/invalid/invalid.c +++ b/src/invalid/invalid.c @@ -112,7 +112,7 @@ static size_t invalid_curves(curve_t *curve, config_t *cfg, pari_ulong *primes, // whoo we have a new invalid curve if (!total && cfg->verbose) { fprintf( - debug, + verbose, "we have a new one, calculating prime order points.\n"); } total++; @@ -129,7 +129,7 @@ static size_t invalid_curves(curve_t *curve, config_t *cfg, pari_ulong *primes, for (size_t i = 0; i < nprimes; ++i) { if (curves[i] == NULL && dvdis(invalid->order, primes[i])) { if (cfg->verbose) { - fprintf(debug, "prime %lu divides curve order.\n", + fprintf(verbose, "prime %lu divides curve order.\n", primes[i]); } dprimes[j++] = primes[i]; @@ -168,10 +168,11 @@ static size_t invalid_curves(curve_t *curve, config_t *cfg, pari_ulong *primes, invalid->a = gcopy(curve->a); if (cfg->verbose) { - fprintf(debug, + fprintf(verbose, "curve saved: %lu primes from range divide order.\n", total); - fprintf(debug, "curves done: %lu out of %lu needed. %.0f%% \n", + fprintf(verbose, + "curves done: %lu out of %lu needed. %.0f%% \n", ncurves, nprimes, ((float)(ncurves) / nprimes) * 100); } } else { @@ -199,12 +200,13 @@ static size_t invalid_curves_threaded(curve_t *curve, config_t *cfg, size_t generated = 0; state_e states[nprimes]; + state_e old_states[nprimes]; curve_t *local_curves[nprimes]; for (size_t i = 0; i < nprimes; ++i) { states[i] = STATE_FREE; + old_states[i] = STATE_FREE; } pthread_mutex_t state_mutex = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_t curves_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t generated_cond = PTHREAD_COND_INITIALIZER; for (size_t i = 0; i < cfg->threads; ++i) { @@ -215,7 +217,6 @@ static size_t invalid_curves_threaded(curve_t *curve, config_t *cfg, threads[i].curves = local_curves; threads[i].generated = &generated; threads[i].mutex_state = &state_mutex; - threads[i].mutex_curves = &curves_mutex; threads[i].cond_generated = &generated_cond; threads[i].cfg = cfg; threads[i].gens = invalid_gen; @@ -224,11 +225,27 @@ static size_t invalid_curves_threaded(curve_t *curve, config_t *cfg, (GEN)&threads[i]); } + pthread_mutex_lock(&state_mutex); for (size_t i = 0; i < cfg->threads; ++i) { pthread_create(&pthreads[i], NULL, &invalid_thread, (void *)&pari_threads[i]); } + bool running = true; + do { + pthread_cond_wait(&generated_cond, &state_mutex); + debug("here %lu\n", generated); + for (size_t i = 0; i < nprimes; ++i) { + if (old_states[i] != states[i] && states[i] == STATE_GENERATED) { + output_o(local_curves[i], cfg); + old_states[i] = states[i]; + } + } + + if (generated == nprimes) running = false; + pthread_mutex_unlock(&state_mutex); + } while (running); + for (size_t i = 0; i < cfg->threads; ++i) { pthread_join(pthreads[i], NULL); } @@ -241,6 +258,8 @@ static size_t invalid_curves_threaded(curve_t *curve, config_t *cfg, for (size_t i = 0; i < cfg->threads; ++i) { pari_thread_free(&pari_threads[i]); } + pthread_mutex_destroy(&state_mutex); + pthread_cond_destroy(&generated_cond); return generated; } @@ -265,7 +284,7 @@ int invalid_do(config_t *cfg) { pari_ulong *primes; size_t nprimes = invalid_primes(curve->order, &primes); if (cfg->verbose) { - fprintf(debug, "primes upto: p_max = %lu, n = %lu\n", + fprintf(verbose, "primes upto: p_max = %lu, n = %lu\n", primes[nprimes - 1], nprimes); } |
