blob: b59d7ae0b52a52f6a1f3ec06895909712efe11a1 [file] [log] [blame]
// 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 _PosixMutex extends Mutex {
/// This is maximum value of `sizeof(pthread_mutex_t)` across all supported
/// platforms.
static const _sizeInBytes = 64;
final Pointer<pthread_mutex_t> _impl;
static final _finalizer = Finalizer<Pointer<pthread_mutex_t>>((ptr) {
pthread_mutex_destroy(ptr);
malloc.free(ptr);
});
_PosixMutex()
: _impl = malloc.allocate(_PosixMutex._sizeInBytes),
super._() {
if (pthread_mutex_init(_impl, nullptr) != 0) {
malloc.free(_impl);
throw StateError('Failed to initialize mutex');
}
_finalizer.attach(this, _impl);
}
_PosixMutex.fromAddress(int address)
: _impl = Pointer.fromAddress(address),
super._();
@override
void _lock() {
if (pthread_mutex_lock(_impl) != 0) {
throw StateError('Failed to lock mutex');
}
}
@override
void _unlock() {
if (pthread_mutex_unlock(_impl) != 0) {
throw StateError('Failed to unlock mutex');
}
}
@override
int get _address => _impl.address;
}
class _PosixConditionVariable extends ConditionVariable {
/// This is maximum value of `sizeof(pthread_cond_t)` across all supported
/// platforms.
static const _sizeInBytes = 64;
final Pointer<pthread_cond_t> _impl;
static final _finalizer = Finalizer<Pointer<pthread_cond_t>>((ptr) {
pthread_cond_destroy(ptr);
malloc.free(ptr);
});
_PosixConditionVariable()
: _impl = malloc.allocate(_PosixConditionVariable._sizeInBytes),
super._() {
if (pthread_cond_init(_impl, nullptr) != 0) {
malloc.free(_impl);
throw StateError('Failed to initialize condition variable');
}
_finalizer.attach(this, _impl);
}
_PosixConditionVariable.fromAddress(int address)
: _impl = Pointer.fromAddress(address),
super._();
@override
void notify() {
if (pthread_cond_signal(_impl) != 0) {
throw StateError('Failed to signal condition variable');
}
}
@override
void wait(covariant _PosixMutex mutex) {
if (pthread_cond_wait(_impl, mutex._impl) != 0) {
throw StateError('Failed to wait on a condition variable');
}
}
@override
int get _address => _impl.address;
}