Browse Source

initial win32 ARC4_LOCK/UNLOCK implementation.

It may make sense to later replace this with a Critical Section later.
ok guenther@
OPENBSD_5_6
bcook 10 years ago
parent
commit
5fcb913dfe
2 changed files with 42 additions and 2 deletions
  1. +21
    -1
      src/lib/libcrypto/arc4random/arc4random_win.h
  2. +21
    -1
      src/lib/libcrypto/crypto/arc4random_win.h

+ 21
- 1
src/lib/libcrypto/arc4random/arc4random_win.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_win.h,v 1.2 2014/07/19 00:08:43 deraadt Exp $ */
/* $OpenBSD: arc4random_win.h,v 1.3 2014/07/20 16:59:31 bcook Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,6 +22,26 @@
* Stub functions for portability.
*/
#include <windows.h>
static volatile HANDLE arc4random_mtx = NULL;
/*
* Initialize the mutex on the first lock attempt. On collision, each thread
* will attempt to allocate a mutex and compare-and-swap it into place as the
* global mutex. On failure to swap in the global mutex, the mutex is closed.
*/
#define _ARC4_LOCK() { \
if (!arc4random_mtx) { \
HANDLE p = CreateMutex(NULL, FALSE, NULL); \
if (InterlockedCompareExchangePointer((void **)&arc4random_mtx, (void *)p, NULL)) \
CloseHandle(p); \
} \
WaitForSingleObject(arc4random_mtx, INFINITE); \
} \
#define _ARC4_UNLOCK() ReleaseMutex(arc4random_mtx)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{


+ 21
- 1
src/lib/libcrypto/crypto/arc4random_win.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_win.h,v 1.2 2014/07/19 00:08:43 deraadt Exp $ */
/* $OpenBSD: arc4random_win.h,v 1.3 2014/07/20 16:59:31 bcook Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,6 +22,26 @@
* Stub functions for portability.
*/
#include <windows.h>
static volatile HANDLE arc4random_mtx = NULL;
/*
* Initialize the mutex on the first lock attempt. On collision, each thread
* will attempt to allocate a mutex and compare-and-swap it into place as the
* global mutex. On failure to swap in the global mutex, the mutex is closed.
*/
#define _ARC4_LOCK() { \
if (!arc4random_mtx) { \
HANDLE p = CreateMutex(NULL, FALSE, NULL); \
if (InterlockedCompareExchangePointer((void **)&arc4random_mtx, (void *)p, NULL)) \
CloseHandle(p); \
} \
WaitForSingleObject(arc4random_mtx, INFINITE); \
} \
#define _ARC4_UNLOCK() ReleaseMutex(arc4random_mtx)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{


Loading…
Cancel
Save