Home | History | Annotate | Download | only in ffsb-6.0-rc2
      1 /*
      2  *   Copyright (c) International Business Machines Corp., 2001-2004
      3  *
      4  *   This program is free software;  you can redistribute it and/or modify
      5  *   it under the terms of the GNU General Public License as published by
      6  *   the Free Software Foundation; either version 2 of the License, or
      7  *   (at your option) any later version.
      8  *
      9  *   This program is distributed in the hope that it will be useful,
     10  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     12  *   the GNU General Public License for more details.
     13  *
     14  *   You should have received a copy of the GNU General Public License
     15  *   along with this program;  if not, write to the Free Software
     16  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     17  */
     18 #ifndef _MTINT_H_
     19 #define _MTINT_H_
     20 
     21 #include "config.h"
     22 
     23 #include <stdlib.h>
     24 #include <sys/types.h>
     25 #include <inttypes.h>
     26 
     27 /* A guess of how many random bytes (not bits) */
     28 /* will be consumed per iteration */
     29 /* This is multiplied by the iteration count */
     30 /* to get the size of the array in init_random() */
     31 #define AVG_ITR_RNDBTS 2
     32 
     33 /* Set a cap on the size of the array, note this */
     34 /* is multiplied by AVG_ITR_RNDBTS */
     35 #define MAX_RANDBUF_SIZE (10 * 1024)
     36 
     37 #define MIN_RANDBUF_SIZE 1024
     38 
     39 
     40 typedef struct randdata {
     41 	int size;
     42 	uint8_t *mt; /* the array of random bits  */
     43 	int mti; /* mti==N+1 means mt[N] is not initialized */
     44 
     45 	/* fallback random source, lrand48_r() */
     46 #ifdef HAVE_LRAND48_R
     47 	struct drand48_data data;
     48 #endif
     49 } randdata_t;
     50 
     51 uint32_t getrandom(randdata_t *rd, uint32_t mod);
     52 uint64_t getllrandom(randdata_t *rd, uint64_t mod);
     53 
     54 /* pass in thread-local state, and est. number of "uses" */
     55 /* pass in 0 for size if size is unknown/not important */
     56 void init_random(randdata_t *state, uint32_t size);
     57 void destroy_random(randdata_t *rd);
     58 void randcleanup(void);
     59 
     60 #endif
     61