From f11531bc3f94ab4a9746b12bea595b1e43d82bc9 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 29 Apr 2022 18:49:36 -0700 Subject: [PATCH] libuv: add Cond, Mutex --- src/libuv/Cond.zig | 39 +++++++++++++++++++++++++++++++++++++++ src/libuv/Mutex.zig | 35 +++++++++++++++++++++++++++++++++++ src/libuv/main.zig | 4 ++++ 3 files changed, 78 insertions(+) create mode 100644 src/libuv/Cond.zig create mode 100644 src/libuv/Mutex.zig diff --git a/src/libuv/Cond.zig b/src/libuv/Cond.zig new file mode 100644 index 000000000..269a24ebc --- /dev/null +++ b/src/libuv/Cond.zig @@ -0,0 +1,39 @@ +//! Condition variables implemented via libuv. +const Cond = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const testing = std.testing; +const c = @import("c.zig"); +const errors = @import("error.zig"); + +cond: *c.uv_cond_t, + +pub fn init(alloc: Allocator) !Cond { + const cond = try alloc.create(c.uv_cond_t); + try errors.convertError(c.uv_cond_init(cond)); + return Cond{ .cond = cond }; +} + +pub fn deinit(self: *Cond, alloc: Allocator) void { + c.uv_cond_destroy(self.cond); + alloc.destroy(self.cond); + self.* = undefined; +} + +pub fn signal(self: Cond) void { + c.uv_cond_signal(self.cond); +} + +pub fn broadcast(self: Cond) void { + c.uv_cond_broadcast(self.cond); +} + +pub fn wait(self: Cond) void { + c.uv_cond_wait(self.cond); +} + +test { + var cond = try init(testing.allocator); + defer cond.deinit(testing.allocator); +} diff --git a/src/libuv/Mutex.zig b/src/libuv/Mutex.zig new file mode 100644 index 000000000..dfcf1fcc1 --- /dev/null +++ b/src/libuv/Mutex.zig @@ -0,0 +1,35 @@ +//! Mutexes implemented via libuv. +const Mutex = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const testing = std.testing; +const c = @import("c.zig"); +const errors = @import("error.zig"); + +mutex: *c.uv_mutex_t, + +pub fn init(alloc: Allocator) !Mutex { + const mutex = try alloc.create(c.uv_mutex_t); + try errors.convertError(c.uv_mutex_init(mutex)); + return Mutex{ .mutex = mutex }; +} + +pub fn deinit(self: *Mutex, alloc: Allocator) void { + c.uv_mutex_destroy(self.mutex); + alloc.destroy(self.mutex); + self.* = undefined; +} + +pub fn lock(self: Mutex) void { + c.uv_mutex_lock(self.mutex); +} + +pub fn unlock(self: Mutex) void { + c.uv_mutex_unlock(self.mutex); +} + +test { + var mutex = try init(testing.allocator); + defer mutex.deinit(testing.allocator); +} diff --git a/src/libuv/main.zig b/src/libuv/main.zig index 422e3fb55..7e594e260 100644 --- a/src/libuv/main.zig +++ b/src/libuv/main.zig @@ -5,6 +5,8 @@ pub const Async = @import("Async.zig"); pub const Pipe = @import("Pipe.zig"); pub const Timer = @import("Timer.zig"); pub const Tty = @import("Tty.zig"); +pub const Cond = @import("Cond.zig"); +pub const Mutex = @import("Mutex.zig"); pub const Sem = @import("Sem.zig"); pub const Thread = @import("Thread.zig"); pub const WriteReq = stream.WriteReq; @@ -22,6 +24,8 @@ test { _ = Pipe; _ = Timer; _ = Tty; + _ = Cond; + _ = Mutex; _ = Sem; _ = Thread;