1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
This commit is contained in:
stefanocasazza 2018-07-03 14:21:21 +02:00
parent fd941c38c0
commit b1094e9481
18 changed files with 115 additions and 88 deletions

View File

@ -182,20 +182,77 @@ static inline uint32_t u_nextPowerOfTwo(uint32_t n)
#endif #endif
} }
/* Random number generator */ /**
* Random number generator
U_EXPORT double u_get_uniform(void); *
U_EXPORT uint32_t u_get_num_random(uint32_t range); * We use George Marsaglia's MWC algorithm to produce an unsigned integer
*
* see http://www.bobwheeler.com/statistics/Password/MarsagliaPost.txt
*/
static inline void u_set_seed_random(uint32_t u, uint32_t v) static inline void u_set_seed_random(uint32_t u, uint32_t v)
{ {
U_INTERNAL_TRACE("u_set_seed_random(%u,%u)", u, v) U_INTERNAL_TRACE("u_set_seed_random(%u,%u)", u, v)
if (u != 0) u_m_w = u; U_INTERNAL_ASSERT_MAJOR(u, 0)
if (v != 0) u_m_z = v; U_INTERNAL_ASSERT_MAJOR(v, 0)
u_m_w = u;
u_m_z = v;
}
static inline uint32_t u_get_num_random(void)
{
U_INTERNAL_TRACE("u_get_num_random()")
U_INTERNAL_ASSERT_MAJOR(u_m_w, 0) U_INTERNAL_ASSERT_MAJOR(u_m_w, 0)
U_INTERNAL_ASSERT_MAJOR(u_m_z, 0) U_INTERNAL_ASSERT_MAJOR(u_m_z, 0)
u_m_z = 36969 * (u_m_z & 65535) + (u_m_z >> 16);
u_m_w = 18000 * (u_m_w & 65535) + (u_m_w >> 16);
return (u_m_z << 16) + u_m_w; /* 0 <= u < 2^32 */
}
static inline uint32_t u_get_num_random_range0(uint32_t range)
{
uint32_t result;
U_INTERNAL_TRACE("u_get_num_random_range0(%u)", range)
U_INTERNAL_ASSERT_MAJOR(range, 1)
result = u_get_num_random() % range;
U_INTERNAL_ASSERT_MINOR(result,range)
return result;
}
static inline uint32_t u_get_num_random_range1(uint32_t range)
{
uint32_t result;
U_INTERNAL_TRACE("u_get_num_random_range1(%u)", range)
U_INTERNAL_ASSERT_MAJOR(range, 2)
result = (u_get_num_random() % (range-1))+1;
U_INTERNAL_ASSERT_RANGE(1,result,range-1)
return result;
}
/* Produce a uniform random sample from the open interval (0, 1). The method will not return either end point */
static inline double u_get_uniform(void)
{
U_INTERNAL_TRACE("u_get_uniform()")
/* The magic number below is 1/(2^32 + 2). The result is strictly between 0 and 1 */
return (u_get_num_random() + 1.0) * 2.328306435454494e-10;
} }
U_EXPORT const char* u_get_mimetype(const char* restrict suffix, int* pmime_index); U_EXPORT const char* u_get_mimetype(const char* restrict suffix, int* pmime_index);

View File

@ -176,7 +176,10 @@ struct U_EXPORT UServices {
UString code(len); UString code(len);
char* ptr = code.data(); char* ptr = code.data();
for (uint32_t i = 0; i < len; ++i, ++ptr) *ptr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[u_get_num_random(64 - 3)]; for (uint32_t i = 0; i < len; ++i, ++ptr)
{
*ptr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[u_get_num_random_range0(U_CONSTANT_SIZE("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"))];
}
code.size_adjust(len); code.size_adjust(len);

View File

@ -514,7 +514,7 @@ void u_initRandom(void)
/* seed the random generator */ /* seed the random generator */
u_set_seed_random(u_seed_hash >> 16, u_seed_hash % 4294967296); u_set_seed_random(1+(u_seed_hash >> 16), 1+(u_seed_hash % 4294967296));
} }
time_t u_getLocalNow(time_t sec) time_t u_getLocalNow(time_t sec)

View File

@ -2671,53 +2671,6 @@ int u_splitCommand(char* restrict s, uint32_t n, char** restrict argv, char* res
return result; return result;
} }
/**
* We use George Marsaglia's MWC algorithm to produce an unsigned integer.
*
* see http://www.bobwheeler.com/statistics/Password/MarsagliaPost.txt
*/
uint32_t u_get_num_random(uint32_t range)
{
uint32_t result;
U_INTERNAL_TRACE("u_get_num_random(%u)", range)
U_INTERNAL_ASSERT_MAJOR(u_m_w, 0)
U_INTERNAL_ASSERT_MAJOR(u_m_z, 0)
u_m_z = 36969 * (u_m_z & 65535) + (u_m_z >> 16);
u_m_w = 18000 * (u_m_w & 65535) + (u_m_w >> 16);
result = (u_m_z << 16) + u_m_w;
if (range)
{
result = (result % range)+1;
U_INTERNAL_ASSERT(result <= range)
}
return result;
}
/* Produce a uniform random sample from the open interval (0, 1). The method will not return either end point */
double u_get_uniform(void)
{
uint32_t u;
U_INTERNAL_TRACE("u_get_uniform()")
/* 0 <= u < 2^32 */
u = u_get_num_random(0);
/* The magic number below is 1/(2^32 + 2). The result is strictly between 0 and 1 */
return (u + 1.0) * 2.328306435454494e-10;
}
/** /**
* Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. Compares a filename or pathname to a pattern * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. Compares a filename or pathname to a pattern
*/ */

View File

@ -126,7 +126,7 @@ void* USimulationError::checkForMatch(const char* call_name)
uint32_t range = (uint32_t) strtol(file_ptr, &file_ptr, 10); uint32_t range = (uint32_t) strtol(file_ptr, &file_ptr, 10);
if (range > 0) match = (u_get_num_random(range) == (range / 2)); if (range > 0) match = (u_get_num_random_range1(range) == (range / 2));
break; break;
} }

View File

@ -32,7 +32,7 @@ static void usp_fork_db()
<!--#code <!--#code
World::initOneResult(); World::initOneResult();
World::pworld_query->id = World::rnumber[u_now->tv_usec % 500]; World::pworld_query->id = World::rnumber[0];
#ifdef U_STATIC_ORM_DRIVER_PGSQL #ifdef U_STATIC_ORM_DRIVER_PGSQL
if (pdrv) if (pdrv)

View File

@ -9,12 +9,21 @@ static void usp_fork_query() { World::handlerForkSql(); }
--> -->
<!--#header <!--#header
--> -->
<!--#code <!--#vcode
(void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql); uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
/*
if (num_queries >= 20 &&
UServer_Base::startParallelization())
{
return;
}
*/
-->
<!--#code
World::initResult(); World::initResult();
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500); (void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql);
for (uint32_t i = 0; i < num_queries; ++i) for (uint32_t i = 0; i < num_queries; ++i)
{ {

View File

@ -51,7 +51,7 @@ if (UOrmDriver::isAsyncPipelineModeAvaliable() == false)
World::pstmt_query->execute(); World::pstmt_query->execute();
World::pworld_query->randomNumber = u_get_num_random(10000-1); World::pworld_query->randomNumber = u_get_num_random_range1(10000);
pstmt_update->execute(); pstmt_update->execute();
@ -76,7 +76,7 @@ else
*pquery++ = ','; *pquery++ = ',';
pquery = u_num2str32(World::pworld_query->randomNumber = u_get_num_random(10000-1), pquery); pquery = u_num2str32(World::pworld_query->randomNumber = u_get_num_random_range1(10000), pquery);
u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',',')); u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',','));
pquery += 2; pquery += 2;

View File

@ -239,7 +239,7 @@ public:
{ {
U_TRACE_NO_PARAM(0, "World::handlerFork()") U_TRACE_NO_PARAM(0, "World::handlerFork()")
if (rnumber[0] == 0) for (uint32_t i = 0; i < 500; ++i) rnumber[i] = u_get_num_random(10000-1); if (rnumber[0] == 0) for (uint32_t i = 0; i < 500; ++i) rnumber[i] = u_get_num_random_range1(10000);
} }
static void handlerForkSql() static void handlerForkSql()

View File

@ -75,11 +75,9 @@ public:
World::initOneResult(); World::initOneResult();
uint32_t i = u_now->tv_usec % 500; handlerQuery(World::rnumber[0]);
handlerQuery(World::rnumber[i]); handlerOneResult(World::rnumber[0]);
handlerOneResult(World::rnumber[i]);
World::endOneResult(); World::endOneResult();
} }
@ -138,7 +136,7 @@ public:
# ifdef USE_MONGODB # ifdef USE_MONGODB
(void) mc->findOne(World::rnumber[i], query); (void) mc->findOne(World::rnumber[i], query);
(void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random(10000-1)); (void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random_range1(10000));
# endif # endif
} }
@ -206,7 +204,7 @@ public:
(void) rc->get(start, ptr-start); (void) rc->get(start, ptr-start);
*ptr = ' '; *ptr = ' ';
ptr = u_num2str32(World::rnum = u_get_num_random(10000-1), ptr+1); ptr = u_num2str32(World::rnum = u_get_num_random_range1(10000), ptr+1);
(void) rc->mset(start, ptr-start); (void) rc->mset(start, ptr-start);
} }
@ -262,7 +260,7 @@ public:
U_TRACE(0, "WorldNoSql::handlerUpdateElasticSearch(%u)", i) U_TRACE(0, "WorldNoSql::handlerUpdateElasticSearch(%u)", i)
uint32_t len1 = u__snprintf(pbuffer1, 100, U_CONSTANT_TO_PARAM("%u/_update"), World::rnumber[i]), uint32_t len1 = u__snprintf(pbuffer1, 100, U_CONSTANT_TO_PARAM("%u/_update"), World::rnumber[i]),
len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random(10000-1)); len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random_range1(10000));
(void) es->sendPOST(es_buffer1, len1+U_CONSTANT_SIZE("/tfb/world/"), es_buffer2, len2+U_CONSTANT_SIZE("{\"doc\":{\"_id\":\"")); (void) es->sendPOST(es_buffer1, len1+U_CONSTANT_SIZE("/tfb/world/"), es_buffer2, len2+U_CONSTANT_SIZE("{\"doc\":{\"_id\":\""));
} }

View File

@ -701,7 +701,7 @@ UString UServices::createToken(int alg)
U_TRACE(0, "UServices::createToken(%d)", alg) U_TRACE(0, "UServices::createToken(%d)", alg)
UString output(80U); UString output(80U);
uint32_t u = u_get_num_random(0); uint32_t u = u_get_num_random();
u_dgst_init(alg, U_NULLPTR, 0); u_dgst_init(alg, U_NULLPTR, 0);

View File

@ -593,7 +593,7 @@ bool UWebSocket::sendData(USocket* socket, int type, const char* data, uint32_t
UString tmp(ncount); UString tmp(ncount);
unsigned char* header = (unsigned char*)tmp.data(); unsigned char* header = (unsigned char*)tmp.data();
*((uint32_t*)masking_key) = u_get_num_random(0); *((uint32_t*)masking_key) = u_get_num_random();
switch (type) switch (type)
{ {
@ -665,7 +665,7 @@ bool UWebSocket::sendControlFrame(USocket* socket, int opcode, const unsigned ch
UString tmp(ncount); UString tmp(ncount);
unsigned char* header = (unsigned char*)tmp.data(); unsigned char* header = (unsigned char*)tmp.data();
*((uint32_t*)masking_key) = u_get_num_random(0); *((uint32_t*)masking_key) = u_get_num_random();
header[0] = ( opcode | 0x80); header[0] = ( opcode | 0x80);
header[1] = (payload_length | 0x80); header[1] = (payload_length | 0x80);

View File

@ -1 +1 @@
0181 0188

View File

@ -32,7 +32,7 @@ static void usp_fork_db()
<!--#code <!--#code
World::initOneResult(); World::initOneResult();
World::pworld_query->id = World::rnumber[u_now->tv_usec % 500]; World::pworld_query->id = World::rnumber[0];
#ifdef U_STATIC_ORM_DRIVER_PGSQL #ifdef U_STATIC_ORM_DRIVER_PGSQL
if (pdrv) if (pdrv)

View File

@ -9,12 +9,21 @@ static void usp_fork_query() { World::handlerForkSql(); }
--> -->
<!--#header <!--#header
--> -->
<!--#code <!--#vcode
(void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql); uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
/*
if (num_queries >= 20 &&
UServer_Base::startParallelization())
{
return;
}
*/
-->
<!--#code
World::initResult(); World::initResult();
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500); (void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql);
for (uint32_t i = 0; i < num_queries; ++i) for (uint32_t i = 0; i < num_queries; ++i)
{ {

View File

@ -51,7 +51,7 @@ if (UOrmDriver::isAsyncPipelineModeAvaliable() == false)
World::pstmt_query->execute(); World::pstmt_query->execute();
World::pworld_query->randomNumber = u_get_num_random(10000-1); World::pworld_query->randomNumber = u_get_num_random_range1(10000);
pstmt_update->execute(); pstmt_update->execute();
@ -76,7 +76,7 @@ else
*pquery++ = ','; *pquery++ = ',';
pquery = u_num2str32(World::pworld_query->randomNumber = u_get_num_random(10000-1), pquery); pquery = u_num2str32(World::pworld_query->randomNumber = u_get_num_random_range1(10000), pquery);
u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',',')); u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',','));
pquery += 2; pquery += 2;

View File

@ -239,7 +239,7 @@ public:
{ {
U_TRACE_NO_PARAM(0, "World::handlerFork()") U_TRACE_NO_PARAM(0, "World::handlerFork()")
if (rnumber[0] == 0) for (uint32_t i = 0; i < 500; ++i) rnumber[i] = u_get_num_random(10000-1); if (rnumber[0] == 0) for (uint32_t i = 0; i < 500; ++i) rnumber[i] = u_get_num_random_range1(10000);
} }
static void handlerForkSql() static void handlerForkSql()

View File

@ -75,11 +75,9 @@ public:
World::initOneResult(); World::initOneResult();
uint32_t i = u_now->tv_usec % 500; handlerQuery(World::rnumber[0]);
handlerQuery(World::rnumber[i]); handlerOneResult(World::rnumber[0]);
handlerOneResult(World::rnumber[i]);
World::endOneResult(); World::endOneResult();
} }
@ -138,7 +136,7 @@ public:
# ifdef USE_MONGODB # ifdef USE_MONGODB
(void) mc->findOne(World::rnumber[i], query); (void) mc->findOne(World::rnumber[i], query);
(void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random(10000-1)); (void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random_range1(10000));
# endif # endif
} }
@ -206,7 +204,7 @@ public:
(void) rc->get(start, ptr-start); (void) rc->get(start, ptr-start);
*ptr = ' '; *ptr = ' ';
ptr = u_num2str32(World::rnum = u_get_num_random(10000-1), ptr+1); ptr = u_num2str32(World::rnum = u_get_num_random_range1(10000), ptr+1);
(void) rc->mset(start, ptr-start); (void) rc->mset(start, ptr-start);
} }
@ -262,7 +260,7 @@ public:
U_TRACE(0, "WorldNoSql::handlerUpdateElasticSearch(%u)", i) U_TRACE(0, "WorldNoSql::handlerUpdateElasticSearch(%u)", i)
uint32_t len1 = u__snprintf(pbuffer1, 100, U_CONSTANT_TO_PARAM("%u/_update"), World::rnumber[i]), uint32_t len1 = u__snprintf(pbuffer1, 100, U_CONSTANT_TO_PARAM("%u/_update"), World::rnumber[i]),
len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random(10000-1)); len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random_range1(10000));
(void) es->sendPOST(es_buffer1, len1+U_CONSTANT_SIZE("/tfb/world/"), es_buffer2, len2+U_CONSTANT_SIZE("{\"doc\":{\"_id\":\"")); (void) es->sendPOST(es_buffer1, len1+U_CONSTANT_SIZE("/tfb/world/"), es_buffer2, len2+U_CONSTANT_SIZE("{\"doc\":{\"_id\":\""));
} }