From 483c74aaab7c20d82a48621f1dd8b300292d3404 Mon Sep 17 00:00:00 2001 From: weidai Date: Tue, 29 Jul 2003 01:18:33 +0000 Subject: fix potential threading problem with initialization of static objects git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@118 57ff6487-cd31-0410-9ec3-f628ee90f5f0 --- nbtheory.cpp | 57 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 24 deletions(-) (limited to 'nbtheory.cpp') diff --git a/nbtheory.cpp b/nbtheory.cpp index 013e441..7d857fb 100644 --- a/nbtheory.cpp +++ b/nbtheory.cpp @@ -15,36 +15,39 @@ NAMESPACE_BEGIN(CryptoPP) const word s_lastSmallPrime = 32719; -std::vector * NewPrimeTable() +struct NewPrimeTable { - const unsigned int maxPrimeTableSize = 3511; + std::vector * operator()() const + { + const unsigned int maxPrimeTableSize = 3511; - std::auto_ptr > pPrimeTable(new std::vector); - std::vector &primeTable = *pPrimeTable; - primeTable.reserve(maxPrimeTableSize); + std::auto_ptr > pPrimeTable(new std::vector); + std::vector &primeTable = *pPrimeTable; + primeTable.reserve(maxPrimeTableSize); - primeTable.push_back(2); - unsigned int testEntriesEnd = 1; - - for (unsigned int p=3; p<=s_lastSmallPrime; p+=2) - { - unsigned int j; - for (j=1; j &primeTable = StaticObject >(&NewPrimeTable); + const std::vector &primeTable = Singleton, NewPrimeTable>().Ref(); size = primeTable.size(); return &primeTable[0]; } @@ -218,13 +221,19 @@ bool IsStrongLucasProbablePrime(const Integer &n) return false; } -bool IsPrime(const Integer &p) +struct NewLastSmallPrimeSquared { - static const Integer lastSmallPrimeSquared = Integer(s_lastSmallPrime).Squared(); + Integer * operator()() const + { + return new Integer(Integer(s_lastSmallPrime).Squared()); + } +}; +bool IsPrime(const Integer &p) +{ if (p <= s_lastSmallPrime) return IsSmallPrime(p); - else if (p <= lastSmallPrimeSquared) + else if (p <= Singleton().Ref()) return SmallDivisorsTest(p); else return SmallDivisorsTest(p) && IsStrongProbablePrime(p, 3) && IsStrongLucasProbablePrime(p); -- cgit v1.2.1