[llvm] r200767 - Implemented support for Process::GetRandomNumber on Windows.

Aaron Ballman aaron at aaronballman.com
Mon Feb 10 19:46:46 PST 2014


This is hopefully resolved in r201124; I reimplemented the original
patch using CryptGenRandom, which is effectively what rand_s() uses
internally anyway.

~Aaron

On Mon, Feb 10, 2014 at 8:52 PM, Aaron Ballman <aaron at aaronballman.com> wrote:
> It appears there is no rand_s() implementation for MinGW 32, so the
> question becomes whether we back this change out, or fall back on
> rand(). Unfortunately, r185126 is relying on this, and I'm loathe to
> start backing out other people's work because of this. So instead, I
> will gin up a replacement for MinGW 32 and hopefully Stephan can
> either come up with a better fix, or mine will be sufficient for the
> task.
>
> ~Aaron
>
> On Mon, Feb 10, 2014 at 2:15 PM, Aaron Ballman <aaron at aaronballman.com> wrote:
>> Thank you for pointing this out, Galina and sorry for the difficulties!
>>
>> Stephan, would you be able to look into this?
>>
>> ~Aaron
>>
>> On Mon, Feb 10, 2014 at 2:05 PM, Galina Kistanova <gkistanova at gmail.com> wrote:
>>> Hi Aaron,
>>>
>>> Seems this revision broke clang-native-mingw32-win7 builder:
>>> http://lab.llvm.org:8011/builders/clang-native-mingw32-win7/builds/5557
>>>
>>> The last successful build was for revision 200765:
>>> http://lab.llvm.org:8011/builders/clang-native-mingw32-win7/builds/5578
>>> Please have a look at it.
>>>
>>> Thanks
>>>
>>> Galina
>>>
>>>
>>>
>>> On Tue, Feb 4, 2014 at 6:49 AM, Aaron Ballman <aaron at aaronballman.com>
>>> wrote:
>>>>
>>>> Author: aaronballman
>>>> Date: Tue Feb  4 08:49:21 2014
>>>> New Revision: 200767
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=200767&view=rev
>>>> Log:
>>>> Implemented support for Process::GetRandomNumber on Windows.
>>>>
>>>> Patch thanks to Stephan Tolksdorf!
>>>>
>>>> Modified:
>>>>     llvm/trunk/lib/Support/Process.cpp
>>>>     llvm/trunk/lib/Support/Windows/Process.inc
>>>>     llvm/trunk/unittests/Support/ProcessTest.cpp
>>>>
>>>> Modified: llvm/trunk/lib/Support/Process.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Process.cpp?rev=200767&r1=200766&r2=200767&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/Support/Process.cpp (original)
>>>> +++ llvm/trunk/lib/Support/Process.cpp Tue Feb  4 08:49:21 2014
>>>> @@ -12,6 +12,11 @@
>>>>
>>>> //===----------------------------------------------------------------------===//
>>>>
>>>>  #include "llvm/Config/config.h"
>>>> +#if LLVM_ON_WIN32
>>>> +  // This define makes stdlib.h declare the rand_s function.
>>>> +#define _CRT_RAND_S
>>>> +#include <stdlib.h>
>>>> +#endif
>>>>  #include "llvm/Support/ErrorHandling.h"
>>>>  #include "llvm/Support/Process.h"
>>>>
>>>>
>>>> Modified: llvm/trunk/lib/Support/Windows/Process.inc
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Process.inc?rev=200767&r1=200766&r2=200767&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/Support/Windows/Process.inc (original)
>>>> +++ llvm/trunk/lib/Support/Windows/Process.inc Tue Feb  4 08:49:21 2014
>>>> @@ -360,3 +360,10 @@ const char *Process::ResetColor() {
>>>>    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
>>>> defaultColors());
>>>>    return 0;
>>>>  }
>>>> +
>>>> +unsigned Process::GetRandomNumber() {
>>>> +  unsigned int result;
>>>> +  const errno_t ec = rand_s(&result);
>>>> +  assert(ec == 0 && "rand_s failed");
>>>> +  return result;
>>>> +}
>>>>
>>>> Modified: llvm/trunk/unittests/Support/ProcessTest.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ProcessTest.cpp?rev=200767&r1=200766&r2=200767&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/unittests/Support/ProcessTest.cpp (original)
>>>> +++ llvm/trunk/unittests/Support/ProcessTest.cpp Tue Feb  4 08:49:21 2014
>>>> @@ -39,6 +39,13 @@ TEST(ProcessTest, SelfProcess) {
>>>>    EXPECT_GT(TimeValue::MaxTime, process::get_self()->get_wall_time());
>>>>  }
>>>>
>>>> +TEST(ProcessTest, GetRandomNumberTest) {
>>>> +  const unsigned r1 = Process::GetRandomNumber();
>>>> +  const unsigned r2 = Process::GetRandomNumber();
>>>> +  // It should be extremely unlikely that both r1 and r2 are 0.
>>>> +  EXPECT_NE((r1 | r2), 0);
>>>> +}
>>>> +
>>>>  #ifdef _MSC_VER
>>>>  #define setenv(name, var, ignore) _putenv_s(name, var)
>>>>  #endif
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>>
>>>
>>>
>>> --
>>> Thanks
>>>
>>> Galina



More information about the llvm-commits mailing list