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