widl: support optional output for random state debugging

Signed-off-by: Marko Semet <marko@marko10-000.de>
feature/deterministic_pub1
Marko Semet 2020-06-23 20:32:09 +02:00
parent 0b12b506b8
commit 8e9e45d8ee
1 changed files with 28 additions and 0 deletions

View File

@ -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);