authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-29 16:26:47 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-29 16:26:47 -07:00
log44eb2a081f6da179f726f85c393cab7f8690cc1a
tree68cb2dd0516995b05a7e5fb0339d85209129050c
parenta6446c21167ef9dce941ce2ea0aa673880b93358
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

add lots of pthread functions


2 files changed, 211 insertions(+), 1 deletions(-)

mod.zig+192-1
...@@ -2162,10 +2162,63 @@ pub const libc = struct {...@@ -2162,10 +2162,63 @@ pub const libc = struct {
2162 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/powl.html2162 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/powl.html
2163 pub extern fn powl(x: c_longdouble, y: c_longdouble) c_longdouble;2163 pub extern fn powl(x: c_longdouble, y: c_longdouble) c_longdouble;
21642164
2165 /// int pthread_attr_destroy(pthread_attr_t *attr);
2166 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_attr_destroy.html
2167 pub extern fn pthread_attr_destroy(attr: *pthread_attr_t) c_int;
2168
2169 /// int pthread_attr_init(pthread_attr_t *attr);
2170 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_attr_init.html
2171 pub extern fn pthread_attr_init(attr: *pthread_attr_t) c_int;
2172
2173 /// int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
2174 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_attr_setguardsize.html
2175 pub extern fn pthread_attr_setguardsize(attr: *pthread_attr_t, guardsize: usize) c_int;
2176
2177 /// int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
2178 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_attr_setstacksize.html
2179 pub extern fn pthread_attr_setstacksize(attr: *pthread_attr_t, stacksize: usize) c_int;
2180
2165 /// int pthread_cancel(pthread_t thread);2181 /// int pthread_cancel(pthread_t thread);
2166 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_cancel.html2182 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_cancel.html
2167 pub extern fn pthread_cancel(thread: pthread_t) c_int;2183 pub extern fn pthread_cancel(thread: pthread_t) c_int;
21682184
2185 /// int pthread_cond_broadcast(pthread_cond_t *cond);
2186 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_cond_broadcast.html
2187 pub extern fn pthread_cond_broadcast(cond: *pthread_cond_t) c_int;
2188
2189 /// int pthread_cond_destroy(pthread_cond_t *cond);
2190 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_cond_destroy.html
2191 pub extern fn pthread_cond_destroy(cond: *pthread_cond_t) c_int;
2192
2193 /// int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
2194 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_cond_init.html
2195 pub extern fn pthread_cond_init(noalias cond: *pthread_cond_t, noalias attr: ?*const pthread_condattr_t) c_int;
2196
2197 /// int pthread_cond_signal(pthread_cond_t *cond);
2198 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_cond_signal.html
2199 pub extern fn pthread_cond_signal(cond: *pthread_cond_t) c_int;
2200
2201 /// int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
2202 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_cond_timedwait.html
2203 pub extern fn pthread_cond_timedwait(noalias cond: *pthread_cond_t, noalias mutex: *pthread_mutex_t, noalias abstime: *const struct_timespec) c_int;
2204
2205 /// int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
2206 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_cond_wait.html
2207 pub extern fn pthread_cond_wait(noalias cond: *pthread_cond_t, noalias mutex: *pthread_mutex_t) c_int;
2208
2209 /// int pthread_condattr_destroy(pthread_condattr_t *attr);
2210 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_condattr_destroy.html
2211 pub extern fn pthread_condattr_destroy(attr: *pthread_condattr_t) c_int;
2212
2213
2214 /// int pthread_condattr_init(pthread_condattr_t *attr);
2215 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_condattr_init.html
2216 pub extern fn pthread_condattr_init(attr: *pthread_condattr_t) c_int;
2217
2218 /// int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
2219 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_create.html
2220 pub extern fn pthread_create(noalias newthread: *pthread_t, noalias attr: *const pthread_attr_t, start_routine: *const fn (*anyopaque) callconv(.C) ?*anyopaque, noalias arg: *anyopaque) c_int;
2221
2169 /// int pthread_detach(pthread_t thread);2222 /// int pthread_detach(pthread_t thread);
2170 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_detach.html2223 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_detach.html
2171 pub extern fn pthread_detach(thread: pthread_t) c_int;2224 pub extern fn pthread_detach(thread: pthread_t) c_int;
...@@ -2178,10 +2231,42 @@ pub const libc = struct {...@@ -2178,10 +2231,42 @@ pub const libc = struct {
2178 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_getconcurrency.html2231 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_getconcurrency.html
2179 pub extern fn pthread_getconcurrency() c_int;2232 pub extern fn pthread_getconcurrency() c_int;
21802233
2234 /// int pthread_join(pthread_t thread, void **value_ptr);
2235 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_join.html
2236 pub extern fn pthread_join(thread: pthread_t, retval: ?*?*anyopaque) c_int;
2237
2181 /// int pthread_kill(pthread_t thread, int sig);2238 /// int pthread_kill(pthread_t thread, int sig);
2182 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_kill.html2239 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_kill.html
2183 pub extern fn pthread_kill(thread: pthread_t, sig: c_int) c_int;2240 pub extern fn pthread_kill(thread: pthread_t, sig: c_int) c_int;
21842241
2242 /// int pthread_mutex_destroy(pthread_mutex_t *mutex);
2243 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_mutex_destroy.html
2244 pub extern fn pthread_mutex_destroy(mutex: *pthread_mutex_t) c_int;
2245
2246 /// int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
2247 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_mutex_init.html
2248 pub extern fn pthread_mutex_init(mutex: *pthread_mutex_t, attr: ?*const pthread_mutexattr_t) c_int;
2249
2250 /// int pthread_mutex_lock(pthread_mutex_t *mutex);
2251 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_mutex_lock.html
2252 pub extern fn pthread_mutex_lock(mutex: *pthread_mutex_t) c_int;
2253
2254 /// int pthread_mutex_trylock(pthread_mutex_t *mutex);
2255 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_mutex_trylock.html
2256 pub extern fn pthread_mutex_trylock(mutex: *pthread_mutex_t) c_int;
2257
2258 /// int pthread_mutex_unlock(pthread_mutex_t *mutex);
2259 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_mutex_unlock.html
2260 pub extern fn pthread_mutex_unlock(mutex: *pthread_mutex_t) c_int;
2261
2262 /// int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
2263 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_mutexattr_destroy.html
2264 pub extern fn pthread_mutexattr_destroy(attr: *pthread_mutexattr_t) c_int;
2265
2266 /// int pthread_mutexattr_init(pthread_mutexattr_t *attr);
2267 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_mutexattr_init.html
2268 pub extern fn pthread_mutexattr_init(attr: *pthread_mutexattr_t) c_int;
2269
2185 /// pthread_t pthread_self(void);2270 /// pthread_t pthread_self(void);
2186 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_self.html2271 /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/pthread_self.html
2187 pub extern fn pthread_self() pthread_t;2272 pub extern fn pthread_self() pthread_t;
...@@ -2663,6 +2748,7 @@ pub const libc = struct {...@@ -2663,6 +2748,7 @@ pub const libc = struct {
2663 pub extern fn memfd_create(name: [*:0]const u8, flags: c_uint) c_int;2748 pub extern fn memfd_create(name: [*:0]const u8, flags: c_uint) c_int;
2664 pub extern fn sendfile(out_fd: c_int, in_fd: c_int, offset: ?*const off_t, count: usize) isize;2749 pub extern fn sendfile(out_fd: c_int, in_fd: c_int, offset: ?*const off_t, count: usize) isize;
2665 pub extern fn getdents(dirfd: c_int, buf: [*]u8, nbytes: usize) c_int;2750 pub extern fn getdents(dirfd: c_int, buf: [*]u8, nbytes: usize) c_int;
2751 pub extern fn sched_getaffinity(pid: pid_t, cpusetsize: usize, mask: *cpu_set_t) c_int;
2666};2752};
26672753
2668pub const clock_t = c_long;2754pub const clock_t = c_long;
...@@ -2679,7 +2765,7 @@ pub const struct_utmpx = opaque {};...@@ -2679,7 +2765,7 @@ pub const struct_utmpx = opaque {};
2679pub const wint_t = c_uint;2765pub const wint_t = c_uint;
2680pub const struct_if_nameindex = opaque {};2766pub const struct_if_nameindex = opaque {};
2681pub const struct_lconv = opaque {};2767pub const struct_lconv = opaque {};
2682pub const pthread_t = c_ulong;2768pub const pthread_t = *opaque {};
2683pub const FILE = opaque {};2769pub const FILE = opaque {};
2684pub const locale_t = *const opaque {};2770pub const locale_t = *const opaque {};
2685pub const nl_catd = *const opaque {};2771pub const nl_catd = *const opaque {};
...@@ -2708,6 +2794,16 @@ pub const struct_sockaddr_in6 = extern struct { family: AF = .INET6, port: in_po...@@ -2708,6 +2794,16 @@ pub const struct_sockaddr_in6 = extern struct { family: AF = .INET6, port: in_po
2708pub const struct_sockaddr_un = extern struct { family: AF = .UNIX, path: [108]u8 };2794pub const struct_sockaddr_un = extern struct { family: AF = .UNIX, path: [108]u8 };
2709pub const struct_addrinfo = extern struct { flags: c_int, family: c_int, socktype: c_int, protocol: c_int, addrlen: socklen_t, addr: ?*struct_sockaddr, canonname: ?[*:0]u8, next: ?*struct_addrinfo };2795pub const struct_addrinfo = extern struct { flags: c_int, family: c_int, socktype: c_int, protocol: c_int, addrlen: socklen_t, addr: ?*struct_sockaddr, canonname: ?[*:0]u8, next: ?*struct_addrinfo };
2710pub const struct_dirent = extern struct { ino: ino_t, off: off_t, reclen: c_ushort, type: DT, name: [NAME_MAX + 1]u8 };2796pub const struct_dirent = extern struct { ino: ino_t, off: off_t, reclen: c_ushort, type: DT, name: [NAME_MAX + 1]u8 };
2797pub const cpu_set_t = [1024 / 8 / @sizeOf(c_ulong)]c_ulong;
2798
2799const impdef = @cImport({
2800 @cInclude("pthread.h");
2801});
2802pub const pthread_attr_t = impdef.pthread_attr_t;
2803pub const pthread_mutexattr_t = impdef.pthread_mutexattr_t;
2804pub const pthread_mutex_t = impdef.pthread_mutex_t;
2805pub const pthread_condattr_t = impdef.pthread_condattr_t;
2806pub const pthread_cond_t = impdef.pthread_cond_t;
27112807
2712pub const AT = struct {2808pub const AT = struct {
2713 pub const FDCWD = -100;2809 pub const FDCWD = -100;
...@@ -3290,3 +3386,98 @@ pub fn munmap(addr: *const anyopaque, len: usize) errno.Error!void {...@@ -3290,3 +3386,98 @@ pub fn munmap(addr: *const anyopaque, len: usize) errno.Error!void {
3290 if (rc == -1) return errno.fromInt(errno.fromLibC());3386 if (rc == -1) return errno.fromInt(errno.fromLibC());
3291 std.debug.assert(rc == 0);3387 std.debug.assert(rc == 0);
3292}3388}
3389pub fn pthread_attr_init(attr: *pthread_attr_t) void {
3390 const rc = libc.pthread_attr_init(attr);
3391 std.debug.assert(rc == 0);
3392}
3393pub fn pthread_attr_destroy(attr: *pthread_attr_t) void {
3394 const rc = libc.pthread_attr_destroy(attr);
3395 std.debug.assert(rc == 0);
3396}
3397pub fn pthread_attr_setstacksize(attr: *pthread_attr_t, size: usize) !void {
3398 const rc = libc.pthread_attr_setstacksize(attr, size);
3399 if (rc != 0) return errno.fromInt(rc);
3400 std.debug.assert(rc == 0);
3401}
3402pub fn pthread_attr_setguardsize(attr: *pthread_attr_t, size: usize) !void {
3403 const rc = libc.pthread_attr_setguardsize(attr, size);
3404 if (rc != 0) return errno.fromInt(rc);
3405 std.debug.assert(rc == 0);
3406}
3407pub fn pthread_create(noalias newthread: *pthread_t, noalias attr: *const pthread_attr_t, start_routine: *const fn (*anyopaque) callconv(.C) ?*anyopaque, noalias arg: *anyopaque) !void {
3408 const rc = libc.pthread_create(newthread, attr, start_routine, arg);
3409 if (rc != 0) return errno.fromInt(rc);
3410 std.debug.assert(rc == 0);
3411}
3412pub fn pthread_detach(thread: pthread_t) !void {
3413 const rc = libc.pthread_detach(thread);
3414 if (rc != 0) return errno.fromInt(rc);
3415 std.debug.assert(rc == 0);
3416}
3417pub fn pthread_join(thread: pthread_t, retval: ?*?*anyopaque) !void {
3418 const rc = libc.pthread_join(thread, retval);
3419 if (rc != 0) return errno.fromInt(rc);
3420 std.debug.assert(rc == 0);
3421}
3422pub fn sched_getaffinity(pid: pid_t) !cpu_set_t {
3423 var cpuset: cpu_set_t = undefined;
3424 const rc = libc.sched_getaffinity(pid, @sizeOf(cpu_set_t), &cpuset);
3425 if (rc == -1) return errno.fromInt(errno.fromLibC());
3426 std.debug.assert(rc == 0);
3427 return cpuset;
3428}
3429pub fn pthread_mutex_init(mutex: *pthread_mutex_t, attr: ?*const pthread_mutexattr_t) !void {
3430 const rc = libc.pthread_mutex_init(mutex, attr);
3431 if (rc != 0) return errno.fromInt(rc);
3432 std.debug.assert(rc == 0);
3433}
3434pub fn pthread_mutex_destroy(mutex: *pthread_mutex_t) !void {
3435 const rc = libc.pthread_mutex_destroy(mutex);
3436 if (rc != 0) return errno.fromInt(rc);
3437 std.debug.assert(rc == 0);
3438}
3439pub fn pthread_mutex_trylock(mutex: *pthread_mutex_t) !void {
3440 const rc = libc.pthread_mutex_trylock(mutex);
3441 if (rc != 0) return errno.fromInt(rc);
3442 std.debug.assert(rc == 0);
3443}
3444pub fn pthread_mutex_lock(mutex: *pthread_mutex_t) !void {
3445 const rc = libc.pthread_mutex_lock(mutex);
3446 if (rc != 0) return errno.fromInt(rc);
3447 std.debug.assert(rc == 0);
3448}
3449pub fn pthread_mutex_unlock(mutex: *pthread_mutex_t) !void {
3450 const rc = libc.pthread_mutex_unlock(mutex);
3451 if (rc != 0) return errno.fromInt(rc);
3452 std.debug.assert(rc == 0);
3453}
3454pub fn pthread_cond_init(noalias cond: *pthread_cond_t, noalias attr: ?*const pthread_condattr_t) !void {
3455 const rc = libc.pthread_cond_init(cond, attr);
3456 if (rc != 0) return errno.fromInt(rc);
3457 std.debug.assert(rc == 0);
3458}
3459pub fn pthread_cond_destroy(cond: *pthread_cond_t) !void {
3460 const rc = libc.pthread_cond_destroy(cond);
3461 if (rc != 0) return errno.fromInt(rc);
3462 std.debug.assert(rc == 0);
3463}
3464pub fn pthread_cond_wait(noalias cond: *pthread_cond_t, noalias mutex: *pthread_mutex_t) !void {
3465 const rc = libc.pthread_cond_wait(cond, mutex);
3466 if (rc != 0) return errno.fromInt(rc);
3467 std.debug.assert(rc == 0);
3468}
3469pub fn pthread_cond_timedwait(noalias cond: *pthread_cond_t, noalias mutex: *pthread_mutex_t, noalias abstime: *const struct_timespec) !void {
3470 const rc = libc.pthread_cond_timedwait(cond, mutex, abstime);
3471 if (rc != 0) return errno.fromInt(rc);
3472 std.debug.assert(rc == 0);
3473}
3474pub fn pthread_cond_signal(cond: *pthread_cond_t) !void {
3475 const rc = libc.pthread_cond_signal(cond);
3476 if (rc != 0) return errno.fromInt(rc);
3477 std.debug.assert(rc == 0);
3478}
3479pub fn pthread_cond_broadcast(cond: *pthread_cond_t) !void {
3480 const rc = libc.pthread_cond_broadcast(cond);
3481 if (rc != 0) return errno.fromInt(rc);
3482 std.debug.assert(rc == 0);
3483}
test.zig+19
...@@ -39,4 +39,23 @@ test {...@@ -39,4 +39,23 @@ test {
39 _ = &linux.mmap;39 _ = &linux.mmap;
40 _ = &linux.munmap;40 _ = &linux.munmap;
41 _ = &linux.openat4;41 _ = &linux.openat4;
42 _ = &linux.pthread_attr_init;
43 _ = &linux.pthread_attr_destroy;
44 _ = &linux.pthread_attr_setstacksize;
45 _ = &linux.pthread_attr_setguardsize;
46 _ = &linux.pthread_create;
47 _ = &linux.pthread_detach;
48 _ = &linux.pthread_join;
49 _ = &linux.sched_getaffinity;
50 _ = &linux.pthread_mutex_init;
51 _ = &linux.pthread_mutex_destroy;
52 _ = &linux.pthread_mutex_trylock;
53 _ = &linux.pthread_mutex_lock;
54 _ = &linux.pthread_mutex_unlock;
55 _ = &linux.pthread_cond_init;
56 _ = &linux.pthread_cond_destroy;
57 _ = &linux.pthread_cond_wait;
58 _ = &linux.pthread_cond_timedwait;
59 _ = &linux.pthread_cond_signal;
60 _ = &linux.pthread_cond_broadcast;
42}61}