Changeset: 7163d447038e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7163d447038e
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        monetdb5/modules/kernel/mmath.c
        monetdb5/modules/kernel/mmath.h
        monetdb5/modules/kernel/mmath.mal
Branch: default
Log Message:

Use xoshiro256starstar.h for generating pseudo random numbers.
We have one global pseudo random number state variable that is
protected by a lock.


diffs (131 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -10671,6 +10671,7 @@ Ready.
 [ "mmath",     "pi",   "command mmath.pi():dbl ",      "MATHpi;",      "return 
an important mathematical value"        ]
 [ "mmath",     "pow",  "command mmath.pow(x:dbl, y:dbl):dbl ", 
"MATHbinary_POWdbl;",   "The pow(x,y) function  returns the value of x raised 
to the power of y."       ]
 [ "mmath",     "pow",  "command mmath.pow(x:flt, y:flt):flt ", 
"MATHbinary_POWflt;",   ""      ]
+[ "mmath",     "prelude",      "command mmath.prelude():void ",        
"MATHprelude;", "initilize mmath module"        ]
 [ "mmath",     "radians",      "command mmath.radians(x:dbl):dbl ",    
"MATHunary_RADIANSdbl;",        "The radians() function converts degrees into 
radians"  ]
 [ "mmath",     "radians",      "command mmath.radians(x:flt):flt ",    
"MATHunary_RADIANSflt;",        ""      ]
 [ "mmath",     "rand", "unsafe command mmath.rand():int ",     "MATHrandint;", 
"return a random number"        ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -14901,6 +14901,7 @@ Ready.
 [ "mmath",     "pi",   "command mmath.pi():dbl ",      "MATHpi;",      "return 
an important mathematical value"        ]
 [ "mmath",     "pow",  "command mmath.pow(x:dbl, y:dbl):dbl ", 
"MATHbinary_POWdbl;",   "The pow(x,y) function  returns the value of x raised 
to the power of y."       ]
 [ "mmath",     "pow",  "command mmath.pow(x:flt, y:flt):flt ", 
"MATHbinary_POWflt;",   ""      ]
+[ "mmath",     "prelude",      "command mmath.prelude():void ",        
"MATHprelude;", "initilize mmath module"        ]
 [ "mmath",     "radians",      "command mmath.radians(x:dbl):dbl ",    
"MATHunary_RADIANSdbl;",        "The radians() function converts degrees into 
radians"  ]
 [ "mmath",     "radians",      "command mmath.radians(x:flt):flt ",    
"MATHunary_RADIANSflt;",        ""      ]
 [ "mmath",     "rand", "unsafe command mmath.rand():int ",     "MATHrandint;", 
"return a random number"        ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1362,6 +1362,7 @@ str MATHbinary_POWflt(flt *res, const fl
 str MATHbinary_ROUNDdbl(dbl *res, const dbl *a, const int *b);
 str MATHbinary_ROUNDflt(flt *res, const flt *a, const int *b);
 str MATHpi(dbl *pi);
+str MATHprelude(void *ret);
 str MATHrandint(int *res);
 str MATHrandintarg(int *res, const int *dummy);
 str MATHsqlrandint(int *res, const int *seed);
diff --git a/monetdb5/modules/kernel/mmath.c b/monetdb5/modules/kernel/mmath.c
--- a/monetdb5/modules/kernel/mmath.c
+++ b/monetdb5/modules/kernel/mmath.c
@@ -219,6 +219,23 @@ MATHunary_FINITE(bit *res, const dbl *a)
        return MAL_SUCCEED;
 }
 
+#include "xoshiro256starstar.h"
+
+/* global pseudo random generator state */
+static random_state_engine mmath_rse;
+/* serialize access to state */
+static MT_Lock mmath_rse_lock MT_LOCK_INITIALIZER("mmath_rse_lock");
+
+str
+MATHprelude(void *ret)
+{
+       (void) ret;
+#ifdef NEED_MT_LOCK_INIT
+       MT_lock_init(&mmath_rse_lock, "mmath_rse_lock");
+#endif
+       init_random_state_engine(mmath_rse, (uint64_t) GDKusec());
+       return MAL_SUCCEED;
+}
 
 str
 MATHrandint(int *res)
@@ -226,7 +243,9 @@ MATHrandint(int *res)
 #ifdef STATIC_CODE_ANALYSIS
        *res = 0;
 #else
-       *res = rand();
+       MT_lock_set(&mmath_rse_lock);
+       *res = (int) (next(mmath_rse) >> 33);
+       MT_lock_unset(&mmath_rse_lock);
 #endif
        return MAL_SUCCEED;
 }
@@ -238,7 +257,9 @@ MATHrandintarg(int *res, const int *dumm
 #ifdef STATIC_CODE_ANALYSIS
        *res = 0;
 #else
-       *res = rand();
+       MT_lock_set(&mmath_rse_lock);
+       *res = (int) (next(mmath_rse) >> 33);
+       MT_lock_unset(&mmath_rse_lock);
 #endif
        return MAL_SUCCEED;
 }
@@ -247,18 +268,22 @@ str
 MATHsrandint(void *ret, const int *seed)
 {
        (void) ret;
-       srand(*seed);
+       MT_lock_set(&mmath_rse_lock);
+       init_random_state_engine(mmath_rse, (uint64_t) *seed);
+       MT_lock_unset(&mmath_rse_lock);
        return MAL_SUCCEED;
 }
 
 str
 MATHsqlrandint(int *res, const int *seed)
 {
-       srand(*seed);
 #ifdef STATIC_CODE_ANALYSIS
        *res = 0;
 #else
-       *res = rand();
+       MT_lock_set(&mmath_rse_lock);
+       init_random_state_engine(mmath_rse, (uint64_t) *seed);
+       *res = (int) (next(mmath_rse) >> 33);
+       MT_lock_unset(&mmath_rse_lock);
 #endif
        return MAL_SUCCEED;
 }
diff --git a/monetdb5/modules/kernel/mmath.h b/monetdb5/modules/kernel/mmath.h
--- a/monetdb5/modules/kernel/mmath.h
+++ b/monetdb5/modules/kernel/mmath.h
@@ -62,4 +62,6 @@ mal_export str MATHrandintarg(int *res, 
 mal_export str MATHsrandint(void *ret, const int *seed);
 mal_export str MATHsqlrandint(int *res, const int *seed);
 mal_export str MATHpi(dbl *pi);
+mal_export str MATHprelude(void *ret);
+
 #endif /* __MMATH_H__ */
diff --git a/monetdb5/modules/kernel/mmath.mal 
b/monetdb5/modules/kernel/mmath.mal
--- a/monetdb5/modules/kernel/mmath.mal
+++ b/monetdb5/modules/kernel/mmath.mal
@@ -209,3 +209,9 @@ comment "initialize the rand() function 
 command pi():dbl
 address MATHpi
 comment "return an important mathematical value";
+
+command prelude() :void
+address MATHprelude
+comment "initilize mmath module";
+
+mmath.prelude();
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to