diff options
Diffstat (limited to 'xf86drmRandom.c')
-rw-r--r-- | xf86drmRandom.c | 78 |
1 files changed, 4 insertions, 74 deletions
diff --git a/xf86drmRandom.c b/xf86drmRandom.c index 94922ad7..b3a4be94 100644 --- a/xf86drmRandom.c +++ b/xf86drmRandom.c | |||
@@ -74,45 +74,17 @@ | |||
74 | #include <stdio.h> | 74 | #include <stdio.h> |
75 | #include <stdlib.h> | 75 | #include <stdlib.h> |
76 | 76 | ||
77 | #define RANDOM_MAIN 0 | 77 | #include "xf86drm.h" |
78 | 78 | #include "xf86drmRandom.h" | |
79 | #if !RANDOM_MAIN | ||
80 | # include "xf86drm.h" | ||
81 | #endif | ||
82 | 79 | ||
83 | #define RANDOM_MAGIC 0xfeedbeef | 80 | #define RANDOM_MAGIC 0xfeedbeef |
84 | #define RANDOM_DEBUG 0 | 81 | #define RANDOM_DEBUG 0 |
85 | 82 | ||
86 | #if RANDOM_MAIN | ||
87 | #define RANDOM_ALLOC malloc | ||
88 | #define RANDOM_FREE free | ||
89 | #else | ||
90 | #define RANDOM_ALLOC drmMalloc | ||
91 | #define RANDOM_FREE drmFree | ||
92 | #endif | ||
93 | |||
94 | typedef struct RandomState { | ||
95 | unsigned long magic; | ||
96 | unsigned long a; | ||
97 | unsigned long m; | ||
98 | unsigned long q; /* m div a */ | ||
99 | unsigned long r; /* m mod a */ | ||
100 | unsigned long check; | ||
101 | unsigned long seed; | ||
102 | } RandomState; | ||
103 | |||
104 | #if RANDOM_MAIN | ||
105 | extern void *drmRandomCreate(unsigned long seed); | ||
106 | extern int drmRandomDestroy(void *state); | ||
107 | extern unsigned long drmRandom(void *state); | ||
108 | extern double drmRandomDouble(void *state); | ||
109 | #endif | ||
110 | |||
111 | void *drmRandomCreate(unsigned long seed) | 83 | void *drmRandomCreate(unsigned long seed) |
112 | { | 84 | { |
113 | RandomState *state; | 85 | RandomState *state; |
114 | 86 | ||
115 | state = RANDOM_ALLOC(sizeof(*state)); | 87 | state = drmMalloc(sizeof(*state)); |
116 | if (!state) return NULL; | 88 | if (!state) return NULL; |
117 | state->magic = RANDOM_MAGIC; | 89 | state->magic = RANDOM_MAGIC; |
118 | #if 0 | 90 | #if 0 |
@@ -140,7 +112,7 @@ void *drmRandomCreate(unsigned long seed) | |||
140 | 112 | ||
141 | int drmRandomDestroy(void *state) | 113 | int drmRandomDestroy(void *state) |
142 | { | 114 | { |
143 | RANDOM_FREE(state); | 115 | drmFree(state); |
144 | return 0; | 116 | return 0; |
145 | } | 117 | } |
146 | 118 | ||
@@ -164,45 +136,3 @@ double drmRandomDouble(void *state) | |||
164 | 136 | ||
165 | return (double)drmRandom(state)/(double)s->m; | 137 | return (double)drmRandom(state)/(double)s->m; |
166 | } | 138 | } |
167 | |||
168 | #if RANDOM_MAIN | ||
169 | static void check_period(unsigned long seed) | ||
170 | { | ||
171 | unsigned long count = 0; | ||
172 | unsigned long initial; | ||
173 | void *state; | ||
174 | |||
175 | state = drmRandomCreate(seed); | ||
176 | initial = drmRandom(state); | ||
177 | ++count; | ||
178 | while (initial != drmRandom(state)) { | ||
179 | if (!++count) break; | ||
180 | } | ||
181 | printf("With seed of %10lu, period = %10lu (0x%08lx)\n", | ||
182 | seed, count, count); | ||
183 | drmRandomDestroy(state); | ||
184 | } | ||
185 | |||
186 | int main(void) | ||
187 | { | ||
188 | RandomState *state; | ||
189 | int i; | ||
190 | unsigned long rand; | ||
191 | |||
192 | state = drmRandomCreate(1); | ||
193 | for (i = 0; i < 10000; i++) { | ||
194 | rand = drmRandom(state); | ||
195 | } | ||
196 | printf("After 10000 iterations: %lu (%lu expected): %s\n", | ||
197 | rand, state->check, | ||
198 | rand - state->check ? "*INCORRECT*" : "CORRECT"); | ||
199 | drmRandomDestroy(state); | ||
200 | |||
201 | printf("Checking periods...\n"); | ||
202 | check_period(1); | ||
203 | check_period(2); | ||
204 | check_period(31415926); | ||
205 | |||
206 | return 0; | ||
207 | } | ||
208 | #endif | ||