@zigc/lib 0.16.0-dev.3061 → 0.16.0-dev.3066
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/std/Thread.zig +6 -1
- package/std/os/linux.zig +5 -0
package/package.json
CHANGED
package/std/Thread.zig
CHANGED
|
@@ -1147,6 +1147,11 @@ const LinuxThreadImpl = struct {
|
|
|
1147
1147
|
/// Ported over from musl libc's pthread detached implementation:
|
|
1148
1148
|
/// https://github.com/ifduyue/musl/search?q=__unmapself
|
|
1149
1149
|
fn freeAndExit(self: *ThreadCompletion) noreturn {
|
|
1150
|
+
// If we do not reset the child_tidptr to null here, the kernel would later write the
|
|
1151
|
+
// value zero to that address, which is inside the block we're unmapping below, after
|
|
1152
|
+
// our thread exits. This can sometimes corrupt memory in other mmap blocks from
|
|
1153
|
+
// unrelated concurrent threads.
|
|
1154
|
+
_ = linux.set_tid_address(null);
|
|
1150
1155
|
// If a signal were delivered between SYS_munmap and SYS_exit, any installed signal
|
|
1151
1156
|
// handler would immediately segfault due to the stack being unmapped. To avoid this,
|
|
1152
1157
|
// we need to mask all signals before entering the inline asm.
|
|
@@ -1484,7 +1489,7 @@ const LinuxThreadImpl = struct {
|
|
|
1484
1489
|
}
|
|
1485
1490
|
|
|
1486
1491
|
// Prepare the TLS segment and prepare a user_desc struct when needed on x86
|
|
1487
|
-
var tls_ptr = linux.tls.prepareArea(mapped[tls_offset..]);
|
|
1492
|
+
var tls_ptr = linux.tls.prepareArea(mapped[tls_offset..][0..linux.tls.area_desc.size]);
|
|
1488
1493
|
var user_desc: if (target.cpu.arch == .x86) linux.user_desc else void = undefined;
|
|
1489
1494
|
if (target.cpu.arch == .x86) {
|
|
1490
1495
|
defer tls_ptr = @intFromPtr(&user_desc);
|
package/std/os/linux.zig
CHANGED
|
@@ -1584,6 +1584,11 @@ pub fn clone2(flags: u32, child_stack_ptr: usize) usize {
|
|
|
1584
1584
|
return syscall2(.clone, flags, child_stack_ptr);
|
|
1585
1585
|
}
|
|
1586
1586
|
|
|
1587
|
+
/// This call cannot fail, and the return value is the caller's thread id
|
|
1588
|
+
pub fn set_tid_address(tidptr: ?*pid_t) pid_t {
|
|
1589
|
+
return @intCast(@as(u32, @truncate(syscall1(.set_tid_address, @intFromPtr(tidptr)))));
|
|
1590
|
+
}
|
|
1591
|
+
|
|
1587
1592
|
pub fn close(fd: fd_t) usize {
|
|
1588
1593
|
return syscall1(.close, @as(usize, @bitCast(@as(isize, fd))));
|
|
1589
1594
|
}
|