void
isc_rng_attach(isc_rng_t *source, isc_rng_t **targetp) {
+
REQUIRE(VALID_RNG(source));
REQUIRE(targetp != NULL && *targetp == NULL);
void
isc_rng_detach(isc_rng_t **rngp) {
- isc_rng_t *rng = *rngp;
+ isc_rng_t *rng;
isc_boolean_t dest = ISC_FALSE;
- REQUIRE(VALID_RNG(rng));
+ REQUIRE(rngp != NULL && VALID_RNG(*rngp));
+
+ rng = *rngp;
+ *rngp = NULL;
LOCK(&rng->lock);
rng->references--;
if (rng->references == 0)
dest = ISC_TRUE;
+ UNLOCK(&rng->lock);
if (dest)
destroy(rngp);
- else {
- UNLOCK(&rng->lock);
- *rngp = NULL;
- }
}
static void