On 12/03/2015 02:40 PM, e...@zusammenkunft.net wrote:
Hello,

That buffer sizing/expiring is a bit strange (the dynmic version
stranger than the old one), I do not understand the need for it. The
requests should not varry so much in size. Just reading something
like 64bytes at a time (possibly nonblocking) should be fine. No need
to look at the age of that buffer...

Admittedly I'm keeping the buffer expiring only for the possibility someone could watch the array to predict what an application could receive in random data. I have no proof this can happen, but I have to assume that was a concern given it was its original designed. If I could be sure that was not a concern, I'd eliminate it.

In cases where a large amount of random data was needed from many threads, like the end to end TLS perf testing, the larger buffer size eliminated the overheads of reading the device.

The dynamic nature of the buffer size was that I didn't feel it was best for java to consume so many random bytes, like 64K worth, if the application only consumed a few at intervals that were just beyond the expiration time. Therefore I ended up with this, a dynamic buffer that could grow and shrink as needed.

A cool implementation would be an actual single periodic refresher
thread which does not block reading (until buffer is empty)... but
that might change the semantic a bit (and could be better used with
the new DRNG api for block-free reseeding).

The locking was a big thing here. For example, in NativePRNG.implNextBytes() the cost of copying the array and doing the xor outside the the synchronized block was quicker for multithreaded performance than not doing the copy and xor'ing inside the synchronized block. I had thought about a refresher thread, but I felt the more threads competing for the buffer would make it worse.


Bernd


Reply via email to