fixed repeated allocation of RNG on each theRNG() call (thanks to barjenbr for the patch)

This commit is contained in:
Vadim Pisarevsky 2011-04-26 12:20:42 +00:00
parent 0cfcb48796
commit 4b2f9e78fc

View File

@ -689,19 +689,22 @@ RNG& theRNG()
#else #else
static pthread_key_t tlsRNGKey = 0; static pthread_key_t tlsRNGKey = 0;
static pthread_once_t tlsRNGKeyOnce = PTHREAD_ONCE_INIT;
static void deleteRNG(void* data) static void deleteRNG(void* data)
{ {
delete (RNG*)data; delete (RNG*)data;
} }
static void makeRNGKey()
{
int errcode = pthread_key_create(&tlsRNGKey, deleteRNG);
CV_Assert(errcode == 0);
}
RNG& theRNG() RNG& theRNG()
{ {
if( !tlsRNGKey ) pthread_once(&tlsRNGKeyOnce, makeRNGKey);
{
int errcode = pthread_key_create(&tlsRNGKey, deleteRNG);
CV_Assert(errcode == 0);
}
RNG* rng = (RNG*)pthread_getspecific(tlsRNGKey); RNG* rng = (RNG*)pthread_getspecific(tlsRNGKey);
if( !rng ) if( !rng )
{ {