/* Process-global state. */
CRYPTO_MUTEX *gm; /* global mutex */
LHASH_OF(RADIX_OBJ) *objs; /* protected by gm */
- OSSL_TIME time_slip; /* protected by gm */
BIO *keylog_out; /* protected by gm */
+ CRYPTO_MUTEX *time_m;
+ OSSL_TIME base_time; /* set once at init, constant thereafter */
+ OSSL_TIME time_slip; /* protected by time_m */
+
int done_join_all_threads;
/*
#if defined(OPENSSL_THREADS)
if (!TEST_ptr(rp->gm = ossl_crypto_mutex_new()))
goto err;
+ if (!TEST_ptr(rp->time_m = ossl_crypto_mutex_new()))
+ goto err;
#endif
if (!TEST_ptr(rp->objs = lh_RADIX_OBJ_new(RADIX_OBJ_hash, RADIX_OBJ_cmp)))
rp->process_idx = process_idx;
rp->done_join_all_threads = 0;
rp->next_thread_idx = 0;
+ rp->base_time = ossl_time_now();
+ rp->time_slip = ossl_time_zero();
return 1;
err:
lh_RADIX_OBJ_free(rp->objs);
rp->objs = NULL;
ossl_crypto_mutex_free(&rp->gm);
+ ossl_crypto_mutex_free(&rp->time_m);
return 0;
}
BIO_free_all(rp->keylog_out);
rp->keylog_out = NULL;
ossl_crypto_mutex_free(&rp->gm);
+ ossl_crypto_mutex_free(&rp->time_m);
}
static RADIX_OBJ *RADIX_PROCESS_get_obj(RADIX_PROCESS *rp, const char *name)
{
OSSL_TIME time_slip;
- ossl_crypto_mutex_lock(RP()->gm);
+ ossl_crypto_mutex_lock(RP()->time_m);
time_slip = RP()->time_slip;
- ossl_crypto_mutex_unlock(RP()->gm);
+ ossl_crypto_mutex_unlock(RP()->time_m);
- return ossl_time_add(ossl_time_now(), time_slip);
+ return ossl_time_add(RP()->base_time, time_slip);
}
-ossl_unused static void radix_skip_time(OSSL_TIME t)
+static OSSL_TIME terp_now(void *arg)
{
- ossl_crypto_mutex_lock(RP()->gm);
+ return ossl_time_now();
+}
+
+static void radix_skip_time(OSSL_TIME t)
+{
+ ossl_crypto_mutex_lock(RP()->time_m);
RP()->time_slip = ossl_time_add(RP()->time_slip, t);
- ossl_crypto_mutex_unlock(RP()->gm);
+ ossl_crypto_mutex_unlock(RP()->time_m);
}
static void per_op_tick_obj(RADIX_OBJ *obj)
static int do_per_op(TERP *terp, void *arg)
{
+ radix_skip_time(ossl_ms2time(1));
lh_RADIX_OBJ_doall(RP()->objs, per_op_tick_obj);
return 1;
}
static int bindings_adjust_terp_config(TERP_CONFIG *cfg)
{
- cfg->now_cb = get_time;
+ cfg->now_cb = terp_now;
cfg->per_op_cb = do_per_op;
+
+ cfg->max_execution_time = ossl_ms2time(60000);
return 1;
}