blob: b15da7e62372fe8b150f167a423c0c823c54b9e9 [file] [edit]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of 'primitives.dart';
class _WindowsMutex extends Mutex {
static const _sizeInBytes = 8; // `sizeof(SRWLOCK)`
final Pointer<SRWLOCK> _impl;
static final _finalizer = Finalizer<Pointer<SRWLOCK>>((ptr) {
malloc.free(ptr);
});
_WindowsMutex()
: _impl = malloc.allocate(_WindowsMutex._sizeInBytes),
super._() {
InitializeSRWLock(_impl);
_finalizer.attach(this, _impl);
}
_WindowsMutex.fromAddress(int address)
: _impl = Pointer.fromAddress(address),
super._();
@override
void _lock() => AcquireSRWLockExclusive(_impl);
@override
void _unlock() => ReleaseSRWLockExclusive(_impl);
@override
int get _address => _impl.address;
}
class _WindowsConditionVariable extends ConditionVariable {
static const _sizeInBytes = 8; // `sizeof(CONDITION_VARIABLE)`
final Pointer<CONDITION_VARIABLE> _impl;
static final _finalizer = Finalizer<Pointer<CONDITION_VARIABLE>>((ptr) {
malloc.free(ptr);
});
_WindowsConditionVariable()
: _impl = malloc.allocate(_WindowsConditionVariable._sizeInBytes),
super._() {
InitializeConditionVariable(_impl);
_finalizer.attach(this, _impl);
}
_WindowsConditionVariable.fromAddress(int address)
: _impl = Pointer.fromAddress(address),
super._();
@override
void notify() {
WakeConditionVariable(_impl);
}
@override
void wait(covariant _WindowsMutex mutex) {
const infinite = 0xFFFFFFFF;
const exclusive = 0;
if (SleepConditionVariableSRW(_impl, mutex._impl, infinite, exclusive) ==
0) {
throw StateError('Failed to wait on a condition variable');
}
}
@override
int get _address => _impl.address;
}