Ignore:
Timestamp:
Jan 13, 2022, 10:53:25 AM (4 years ago)
Author:
caparsons <caparson@…>
Branches:
ADT, ast-experimental, enum, forall-pointer-decay, master, pthread-emulation, qualifiedEnum
Children:
3eaa689
Parents:
3bb12921 (diff), 00f5fde (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/stdlib.hfa

    r3bb12921 r42daeb4  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Jan  2 22:53:57 2022
    13 // Update Count     : 594
     12// Last Modified On : Wed Jan 12 18:56:13 2022
     13// Update Count     : 621
    1414//
    1515
     
    2121#include <stdlib.h>                                                                             // *alloc, strto*, ato*
    2222#include <heap.hfa>
     23
    2324
    2425// Reduce includes by explicitly defining these routines.
     
    385386//---------------------------------------
    386387
     388// Sequential Pseudo Random-Number Generator : generate repeatable sequence of values that appear random.
     389//
     390// Declaration :
     391//   PRNG sprng = { 1009 } - set starting seed versus random seed
     392//   
     393// Interface :
     394//   set_seed( sprng, 1009 ) - set starting seed for ALL kernel threads versus random seed
     395//   get_seed( sprng ) - read seed
     396//   prng( sprng ) - generate random value in range [0,UINT_MAX]
     397//   prng( sprng, u ) - generate random value in range [0,u)
     398//   prng( sprng, l, u ) - generate random value in range [l,u]
     399//   calls( sprng ) - number of generated random value so far
     400//
     401// Examples : generate random number between 5-21
     402//   prng( sprng ) % 17 + 5;    values 0-16 + 5 = 5-21
     403//   prng( sprng, 16 + 1 ) + 5;
     404//   prng( sprng, 5, 21 );
     405//   calls( sprng );
     406
    387407struct PRNG {
    388408        uint32_t callcnt;                                                                       // call count
     
    391411}; // PRNG
    392412
    393 extern uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]
     413void set_seed( PRNG & prng, uint32_t seed_ );
     414uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]
    394415static inline {
    395         void set_seed( PRNG & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; } // set seed
    396416        void ?{}( PRNG & prng ) { set_seed( prng, rdtscl() ); } // random seed
    397417        void ?{}( PRNG & prng, uint32_t seed ) { set_seed( prng, seed ); } // fixed seed
     
    402422} // distribution
    403423
    404 extern void set_seed( uint32_t seed );                                  // set per thread seed
    405 extern uint32_t get_seed();                                                             // get seed
    406 extern uint32_t prng( void ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]
     424// Concurrent Pseudo Random-Number Generator : generate repeatable sequence of values that appear random.
     425//
     426// Interface :
     427//   set_seed( 1009 ) - fixed seed for all kernel threads versus random seed
     428//   get_seed() - read seed
     429//   prng() - generate random value in range [0,UINT_MAX]
     430//   prng( u ) - generate random value in range [0,u)
     431//   prng( l, u ) - generate random value in range [l,u]
     432//
     433// Examples : generate random number between 5-21
     434//   prng() % 17 + 5;   values 0-16 + 5 = 5-21
     435//   prng( 16 + 1 ) + 5;
     436//   prng( 5, 21 );
     437
     438void set_seed( uint32_t seed_ ) OPTIONAL_THREAD;
     439uint32_t get_seed() __attribute__(( warn_unused_result ));
     440uint32_t prng( void ) __attribute__(( warn_unused_result )) OPTIONAL_THREAD; // [0,UINT_MAX]
    407441static inline {
    408         uint32_t prng( uint32_t u ) __attribute__(( warn_unused_result ));
    409         uint32_t prng( uint32_t u ) { return prng() % u; }      // [0,u)
    410         uint32_t prng( uint32_t l, uint32_t u ) __attribute__(( warn_unused_result ));
    411         uint32_t prng( uint32_t l, uint32_t u ) { return prng( u - l + 1 ) + l; } // [l,u]
     442        uint32_t prng( uint32_t u ) __attribute__(( warn_unused_result )) { return prng() % u; } // [0,u)
     443        uint32_t prng( uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( u - l + 1 ) + l; } // [l,u]
    412444} // distribution
    413445
Note: See TracChangeset for help on using the changeset viewer.