Updating to work on Windows.

This commit is contained in:
Eric Holk
2011-07-28 10:41:48 -07:00
parent 9618ab67ae
commit 3d7016ae95
5 changed files with 16 additions and 7 deletions

View File

@@ -42,7 +42,7 @@ fn send[T](c: chan[T], v: &T) { c <| v; }
fn recv[T](p: port[T]) -> T { let v; p |> v; v }
fn set_min_stack(uint stack_size) {
fn set_min_stack(stack_size : uint) {
rustrt::set_min_stack(stack_size);
}

View File

@@ -2,6 +2,8 @@
#define KLOG_(...) \
KLOG(this, kern, __VA_ARGS__)
#define KLOG_ERR_(field, ...) \
KLOG_LVL(this, field, log_err, __VA_ARGS__)
rust_kernel::rust_kernel(rust_srv *srv, size_t num_threads) :
_region(srv, true),
@@ -284,9 +286,9 @@ rust_kernel::win32_require(LPCTSTR fn, BOOL ok) {
NULL, err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &buf, 0, NULL );
DLOG_ERR(sched, dom, "%s failed with error %ld: %s", fn, err, buf);
KLOG_ERR_(dom, "%s failed with error %ld: %s", fn, err, buf);
LocalFree((HLOCAL)buf);
I(sched, ok);
I(this, ok);
}
}
#endif

View File

@@ -91,6 +91,12 @@ struct rust_scheduler : public kernel_owned<rust_scheduler>,
rust_task *create_task(rust_task *spawner, const char *name);
virtual void run();
#ifdef __WIN32__
inline void win32_require(LPCTSTR fn, BOOL ok) {
kernel->win32_require(fn, ok);
}
#endif
};
inline rust_log &

View File

@@ -135,15 +135,15 @@ isaac_init(sched_or_kernel *sched, randctx *rctx)
#ifdef __WIN32__
{
HCRYPTPROV hProv;
sched->kernel->win32_require
sched->win32_require
(_T("CryptAcquireContext"),
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT|CRYPT_SILENT));
sched->kernel->win32_require
sched->win32_require
(_T("CryptGenRandom"),
CryptGenRandom(hProv, sizeof(rctx->randrsl),
(BYTE*)(&rctx->randrsl)));
sched->kernel->win32_require
sched->win32_require
(_T("CryptReleaseContext"),
CryptReleaseContext(hProv, 0));
}

View File

@@ -73,7 +73,8 @@ bool lock_and_signal::timed_wait(size_t timeout_in_ns) {
bool rv = true;
#if defined(__WIN32__)
LeaveCriticalSection(&_cs);
WaitForSingleObject(_event, INFINITE);
DWORD timeout = timeout_in_ns == 0 ? INFINITE : timeout_in_ns / 1000000;
rv = WaitForSingleObject(_event, timeout) != WAIT_TIMEOUT;
EnterCriticalSection(&_cs);
_holding_thread = GetCurrentThreadId();
#else