[Mammoth] Create userspace mutex capability.

This commit is contained in:
Drew Galbraith 2023-10-25 19:07:36 -07:00
parent 4c04f9d561
commit 6cb0041253
3 changed files with 45 additions and 0 deletions

View File

@ -5,6 +5,7 @@ add_library(mammoth STATIC
src/endpoint_server.cpp
src/init.cpp
src/memory_region.cpp
src/mutex.cpp
src/new.cpp
src/process.cpp
src/port_client.cpp

View File

@ -0,0 +1,21 @@
#pragma once
#include <glacier/status/error_or.h>
#include <ztypes.h>
class Mutex {
public:
Mutex(const Mutex&) = delete;
Mutex(Mutex&&);
Mutex& operator=(Mutex&&);
static glcr::ErrorOr<Mutex> Create();
glcr::ErrorCode Lock();
glcr::ErrorCode Release();
private:
z_cap_t mutex_cap_;
Mutex(z_cap_t mutex_cap) : mutex_cap_(mutex_cap) {}
};

23
lib/mammoth/src/mutex.cpp Normal file
View File

@ -0,0 +1,23 @@
#include "mammoth/mutex.h"
#include <zcall.h>
Mutex::Mutex(Mutex&& other) : mutex_cap_(other.mutex_cap_) {
other.mutex_cap_ = 0;
}
Mutex& Mutex::operator=(Mutex&& other) {
// TODO: Release existing mutex if it exists.
mutex_cap_ = other.mutex_cap_;
other.mutex_cap_ = 0;
return *this;
}
glcr::ErrorOr<Mutex> Mutex::Create() {
z_cap_t mutex_cap;
RET_ERR(ZMutexCreate(&mutex_cap));
return Mutex(mutex_cap);
}
glcr::ErrorCode Mutex::Lock() { return ZMutexLock(mutex_cap_); }
glcr::ErrorCode Mutex::Release() { return ZMutexRelease(mutex_cap_); }