155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* 255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Copyright (c) International Business Machines Corp., 2001-2004 355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * This program is free software; you can redistribute it and/or modify 555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * it under the terms of the GNU General Public License as published by 655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * the Free Software Foundation; either version 2 of the License, or 755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * (at your option) any later version. 855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * This program is distributed in the hope that it will be useful, 1055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * but WITHOUT ANY WARRANTY; without even the implied warranty of 1155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 1255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * the GNU General Public License for more details. 1355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 1455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * You should have received a copy of the GNU General Public License 1555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * along with this program; if not, write to the Free Software 164548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 1755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 1855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#ifndef _MTINT_H_ 1955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define _MTINT_H_ 2055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 2155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "config.h" 2255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 2355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <stdlib.h> 2455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <sys/types.h> 2555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <inttypes.h> 2655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 2755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* A guess of how many random bytes (not bits) */ 2855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* will be consumed per iteration */ 2955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* This is multiplied by the iteration count */ 3055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* to get the size of the array in init_random() */ 3155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define AVG_ITR_RNDBTS 2 3255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 3355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Set a cap on the size of the array, note this */ 3455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* is multiplied by AVG_ITR_RNDBTS */ 3555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define MAX_RANDBUF_SIZE (10 * 1024) 3655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 3755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define MIN_RANDBUF_SIZE 1024 3855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 3955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 4055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modaktypedef struct randdata { 4155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int size; 4255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint8_t *mt; /* the array of random bits */ 4355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int mti; /* mti==N+1 means mt[N] is not initialized */ 4455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 4555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* fallback random source, lrand48_r() */ 4655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#ifdef HAVE_LRAND48_R 4755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct drand48_data data; 4855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#endif 4955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak} randdata_t; 5055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 5155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint32_t getrandom(randdata_t *rd, uint32_t mod); 5255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint64_t getllrandom(randdata_t *rd, uint64_t mod); 5355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 5455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* pass in thread-local state, and est. number of "uses" */ 5555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* pass in 0 for size if size is unknown/not important */ 5655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid init_random(randdata_t *state, uint32_t size); 5755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid destroy_random(randdata_t *rd); 5855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid randcleanup(void); 5955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 6055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#endif 61