') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Passing Io.Duration to io.async as an arg when using FixedBufferAllocator causes thread to panic. · Issue #25900 · ziglang/zig · GitHub
Skip to content

Passing Io.Duration to io.async as an arg when using FixedBufferAllocator causes thread to panic. #25900

Description

@D-Berg

Zig Version

0.16.0-dev.1272+f3309a96a

Steps to Reproduce and Observed Behavior

Example program crashes when using FBA and works when using DBA with the following output. The panic is triggered when Io.Duration is passed as an argument but works fine otherwise.

zig run io_sleep.zig
f1 won
thread 188397274 panic: incorrect alignment
/Users/orion/.local/share/zigup/0.16.0-dev.1272+f3309a96a/files/lib/std/Io.zig:1534:46: 0x1026a54f7 in start (io_
sleep)
const args_casted: *const Args = @ptrCast(@alignCast(context));
^
/Users/orion/.local/share/zigup/0.16.0-dev.1272+f3309a96a/files/lib/std/Io/Threaded.zig:405:16: 0x10260aac3 in st
art (io_sleep)
ac.func(ac.contextPointer(), ac.resultPointer());
^
/Users/orion/.local/share/zigup/0.16.0-dev.1272+f3309a96a/files/lib/std/Io/Threaded.zig:188:26: 0x10265ebb7 in wo
rker (io_sleep)
closure.start(closure);
^
/Users/orion/.local/share/zigup/0.16.0-dev.1272+f3309a96a/files/lib/std/Thread.zig:558:13: 0x1026463db in callFn_
_anon_15412 (io_sleep)
@call(.auto, f, args);
^
/Users/orion/.local/share/zigup/0.16.0-dev.1272+f3309a96a/files/lib/std/Thread.zig:830:30: 0x10262a907 in entryFn
(io_sleep)
return callFn(f, args_ptr.*);
^
???:?:?: 0x18591ec0b in __pthread_cond_wait (/usr/lib/system/libsystem_pthread.dylib)
???:?:?: 0x185919b7f in _pthread_cond_broadcast (/usr/lib/system/libsystem_pthread.dylib)
zsh: abort zig run io_sleep.zig
conststd=@import("std");
constIo=std.Io;
varglobal_buf: [4*1024*1024]u8=undefined;
varfba_impl: std.heap.FixedBufferAllocator= .init(&global_buf);
vardebug_allocator: std.heap.DebugAllocator(.{}) =.init;
pubfnmain() !void {
constuse_heap=false;
constgpa=blk: {
break :blkswitch (use_heap) {
true=>debug_allocator.allocator(),
false=>fba_impl.threadSafeAllocator(),
};
};
deferif (use_heap) {
_=debug_allocator.deinit();
};
varthreaded_io: Io.Threaded= .init(gpa);
deferthreaded_io.deinit();
constio=threaded_io.io();
tryworksWithFba(io);
trybreaksWithFba(io);
}
fnbreaksWithFba(io: Io) !void {
varf1=io.async(Io.sleep, .{ io, Io.Duration.fromSeconds(1), .real });
deferf1.cancel(io) catch {};
varf2=io.async(Io.sleep, .{ io, Io.Duration.fromSeconds(2), .real });
deferf2.cancel(io) catch {};
switch (tryio.select(.{ .f1=&f1, .f2=&f2 })) {
.f1=>std.debug.print("f1 won\n", .{}),
.f2=>std.debug.print("f2 won\n", .{}),
}
}
fnworksWithFba(io: Io) !void {
varf1=io.async(sleep, .{ io, 1, .real });
deferf1.cancel(io) catch {};
varf2=io.async(sleep, .{ io, 2, .real });
deferf2.cancel(io) catch {};
switch (tryio.select(.{ .f1=&f1, .f2=&f2 })) {
.f1=>std.debug.print("f1 won\n", .{}),
.f2=>std.debug.print("f2 won\n", .{}),
}
}
fnsleep(io: Io, seconds: i64, clock: Io.Clock) !void {
tryio.sleep(.fromSeconds(seconds), clock);
}

Expected Behavior

I would assume it should work given any allocator.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behavior

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions