forked from Mirrors/wine-wine
widl: support optional output for random state debugging
Signed-off-by: Marko Semet <marko@marko10-000.de>feature/deterministic_pub1
parent
0b12b506b8
commit
8e9e45d8ee
|
@ -477,6 +477,8 @@ void align_output( unsigned int align )
|
|||
|
||||
/* xorshift* random generator. Source: https://en.wikipedia.org/wiki/Xorshift#xorshift* */
|
||||
static uint64_t pseudorandom_state = 1;
|
||||
static const char* pseudorandom_source = NULL;
|
||||
static size_t pseudorandom_source_size = 0;
|
||||
|
||||
static uint64_t pseudorandom_algo(uint64_t* generator_state, uint64_t add_to_state)
|
||||
{
|
||||
|
@ -543,6 +545,16 @@ int pseudorandom_tempfile(char* file)
|
|||
sleep(5);
|
||||
counter++;
|
||||
} while (counter <= 12);
|
||||
|
||||
/* add deebug info */
|
||||
if ((result != -1) && (getenv("SOURCE_RANDOM_DEBUG") != NULL))
|
||||
{
|
||||
debug_filename = strmake("%s.random_debug", file);
|
||||
debug_file = fopen(debug_filename, "wb");
|
||||
fwrite(pseudorandom_source, 1, pseudorandom_source_size, debug_file);
|
||||
fclose(debug_file);
|
||||
free(debug_filename);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -625,6 +637,22 @@ void init_random_generator(int argc, char **argv)
|
|||
pseudorandom_algo(&generator_state, ((unsigned char*) argv_data)[j]);
|
||||
}
|
||||
|
||||
/* add debug if required */
|
||||
if (getenv("SOURCE_RANDOM_DEBUG") != NULL)
|
||||
{
|
||||
/* gen field */
|
||||
pseudorandom_source_size = env_size + argv_size + sizeof(generator_state);
|
||||
buffer_pos = malloc(sizeof(char) * pseudorandom_source_size);
|
||||
pseudorandom_source = buffer_pos;
|
||||
|
||||
/* copy data into it */
|
||||
memcpy(buffer_pos, env_data, env_size);
|
||||
buffer_pos += env_size;
|
||||
memcpy(buffer_pos, argv_data, argv_size);
|
||||
buffer_pos += argv_size;
|
||||
memcpy(buffer_pos, &generator_state, sizeof(generator_state));
|
||||
}
|
||||
|
||||
/* set state and free rest */
|
||||
free(env_data);
|
||||
free(argv_data);
|
||||
|
|
Loading…
Reference in New Issue