blocxx
src
blocxx
RandomNumber.cpp
Go to the documentation of this file.
1
/*******************************************************************************
2
* Copyright (C) 2005, Vintela, Inc. All rights reserved.
3
* Copyright (C) 2006, Novell, Inc. All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions are met:
7
*
8
* * Redistributions of source code must retain the above copyright notice,
9
* this list of conditions and the following disclaimer.
10
* * Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
* * Neither the name of
14
* Vintela, Inc.,
15
* nor Novell, Inc.,
16
* nor the names of its contributors or employees may be used to
17
* endorse or promote products derived from this software without
18
* specific prior written permission.
19
*
20
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
* POSSIBILITY OF SUCH DAMAGE.
31
*******************************************************************************/
32
33
39
#include "blocxx/BLOCXX_config.h"
40
#include "
blocxx/RandomNumber.hpp
"
41
#include "
blocxx/Assertion.hpp
"
42
#include "
blocxx/ThreadOnce.hpp
"
43
#include "
blocxx/Mutex.hpp
"
44
#include "
blocxx/MutexLock.hpp
"
45
#include "
blocxx/GlobalMutex.hpp
"
46
#include <fstream>
47
#include <sys/types.h>
48
49
#ifdef BLOCXX_HAVE_UNISTD_H
50
#include <unistd.h>
51
#endif
52
53
#ifdef BLOCXX_HAVE_SYS_TIME_H
54
#include <sys/time.h>
55
#endif
56
57
#include <stdlib.h>
58
#include <time.h>
59
60
namespace
BLOCXX_NAMESPACE
61
{
62
64
namespace
65
{
66
OnceFlag
guard
=
BLOCXX_ONCE_INIT
;
67
unsigned
int
seed
= 0;
68
}
69
71
RandomNumber::RandomNumber
(
Int32
lowVal
,
Int32
highVal
)
72
: m_lowVal(
lowVal
), m_highVal(
highVal
)
73
{
74
if
(
lowVal
>
highVal
)
75
{
76
m_lowVal
=
highVal
;
77
m_highVal
=
lowVal
;
78
}
79
callOnce
(
guard
, &
initRandomness
);
80
}
81
83
void
84
RandomNumber::initRandomness
()
85
{
86
#ifdef BLOCXX_WIN32
87
time_t
timeval
=
::time
(
NULL
);
88
seed
=
timeval
;
89
#else
90
// use the time as part of the seed
91
struct
timeval
tv
;
92
gettimeofday
(&
tv
, 0);
93
// try to get something from the kernel
94
std::ifstream
infile
(
"/dev/urandom"
, std::ios::in);
95
if
(!
infile
)
96
{
97
infile
.open(
"/dev/random"
, std::ios::in);
98
}
99
// don't initialize this, we may get random stack
100
// junk in case infile isn't usable.
101
unsigned
int
dev_rand_input
;
102
if
(
infile
)
103
{
104
infile
.read(
reinterpret_cast<
char
*
>
(&
dev_rand_input
),
sizeof
(
dev_rand_input
));
105
infile
.close();
106
}
107
// Build the seed. Take into account our pid and uid.
108
seed
=
dev_rand_input
^ (
getpid
() << 16) ^
getuid
() ^
tv
.tv_sec ^
tv
.tv_usec;
109
#endif
110
#ifdef BLOCXX_HAVE_SRANDOM
111
srandom
(
seed
);
112
#else
113
srand
(
seed
);
114
#endif
115
}
116
118
void
119
RandomNumber::saveRandomState
()
120
{
121
// Do nothing. This function is so that RandomNumber has the same interface as CryptographicRandomNumber
122
}
123
124
namespace
125
{
126
GlobalMutex
g_guard
=
BLOCXX_GLOBAL_MUTEX_INIT
();
127
}
129
Int32
130
RandomNumber::getNextNumber
()
131
{
132
MutexLock
lock(
g_guard
);
133
#ifdef BLOCXX_HAVE_RANDOM
134
return
m_lowVal
+ (
random
() % (
m_highVal
-
m_lowVal
+ 1));
135
#else
136
return
m_lowVal
+ (
rand
() % (
m_highVal
-
m_lowVal
+ 1));
137
#endif
138
}
139
140
}
// end namespace BLOCXX_NAMESPACE
141
Assertion.hpp
GlobalMutex.hpp
BLOCXX_GLOBAL_MUTEX_INIT
#define BLOCXX_GLOBAL_MUTEX_INIT()
Definition
GlobalMutex.hpp:58
Mutex.hpp
MutexLock.hpp
RandomNumber.hpp
ThreadOnce.hpp
BLOCXX_NAMESPACE::LazyGlobal
This class can be used to store a global variable that is lazily initialized in a thread safe manner.
Definition
LazyGlobal.hpp:115
BLOCXX_NAMESPACE::MutexLock
Definition
MutexLock.hpp:50
BLOCXX_NAMESPACE::RandomNumber::saveRandomState
static void saveRandomState()
Definition
RandomNumber.cpp:119
BLOCXX_NAMESPACE::RandomNumber::m_lowVal
Int32 m_lowVal
Definition
RandomNumber.hpp:62
BLOCXX_NAMESPACE::RandomNumber::m_highVal
Int32 m_highVal
Definition
RandomNumber.hpp:63
BLOCXX_NAMESPACE::RandomNumber::RandomNumber
RandomNumber(Int32 lowVal=0, Int32 highVal=RAND_MAX)
Definition
RandomNumber.cpp:71
BLOCXX_NAMESPACE::RandomNumber::initRandomness
static void initRandomness()
Definition
RandomNumber.cpp:84
BLOCXX_NAMESPACE::RandomNumber::getNextNumber
Int32 getNextNumber()
Definition
RandomNumber.cpp:130
BLOCXX_NAMESPACE
Taken from RFC 1321.
Definition
AppenderLogger.cpp:48
BLOCXX_NAMESPACE::callOnce
void BLOCXX_COMMON_API callOnce(OnceFlag &flag, FuncT F)
The first time callOnce is called with a given onceFlag argument, it calls func with no argument and ...
BLOCXX_NAMESPACE::operator==
bool operator==(const Array< T > &x, const Array< T > &y)
Definition
ArrayImpl.hpp:434
Generated by
1.10.0