Files
kyle 2f9d3d97e6 p2: digest with in-sift FIFO, SQLite caches, Honcho context, recover
Dixie is capped (max_inflight 2, queue_depth 8, queue_wait 20s) and
never queued on llama-server. Streaming chat, thinking off, 45s
fallback to clean. Digest and chunk-embedding caches are
content-addressed SQLite (Honcho context is not cached). Recover
uses the guarded Fetcher. guardian-star is refused in code.
2026-09-22 23:54:49 -07:00

155 lines
4.8 KiB
Go

// Copyright 2024 The Libc Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build linux && (amd64 || arm64 || loong64 || ppc64le || s390x || riscv64 || 386 || arm)
package libc // import "modernc.org/libc"
import (
"golang.org/x/sys/unix"
"runtime"
)
func ___syscall_cp(tls *TLS, n, a, b, c, d, e, f long) long {
switch n {
case SYS_nanosleep:
// int nanosleep(const struct timespec *req, struct timespec *rem)
return sleepSyscall(tls, n, [6]long{a, b, c, d, e, f}, 0, 1, 0)
case SYS_clock_nanosleep, sysClockNanosleepTime64:
// int clock_nanosleep(clockid_t clk, int flags,
// const struct timespec *req, struct timespec *rem)
return sleepSyscall(tls, n, [6]long{a, b, c, d, e, f}, 2, 3, b)
}
r1, _, err := (unix.Syscall6(uintptr(n), uintptr(a), uintptr(b), uintptr(c), uintptr(d), uintptr(e), uintptr(f)))
if err != 0 {
return long(-err)
}
return long(r1)
}
// sleepScratchSize is the size of the buffer sleepSyscall gives the kernel to
// report the time remaining in. It must be at least the size of the widest
// struct timespec the sleep syscalls use, which is the 64-bit one - two 64-bit
// words - also on 32-bit targets, where it is what the time64 variants take.
const sleepScratchSize = 16
// sleepSyscall issues one of the sleep syscalls and restarts it when a signal
// interrupts it.
//
// A program translated to Go by ccgo shares its process with the Go runtime,
// which signals threads with SIGURG to preempt goroutines asynchronously. The
// translated C code never installed that handler and cannot reasonably cope
// with the EINTR it causes: musl reports the interruption faithfully, but
// callers commonly discard the return value - SQLite's unixSleep() does - so
// the sleep silently comes up short and timing-dependent code misbehaves, e.g.
// a busy handler that gives up before its timeout. Restarting the sleep for the
// time remaining hides the runtime's own signals from the C program, which is
// also how the hand-written darwin, freebsd, netbsd and openbsd ports behave:
// their Xnanosleep sleeps in Go and cannot be interrupted at all.
//
// iReq and iRem are the indices in args of the req and rem arguments and flags
// is the clock_nanosleep(2) flags argument, zero for nanosleep(2).
func sleepSyscall(tls *TLS, n long, args [6]long, iReq, iRem int, flags long) long {
if args[iRem] == 0 && flags&TIMER_ABSTIME == 0 && tls != nil {
// The caller does not want the remaining time reported, but restarting
// an interrupted sleep needs it. The kernel writes it in the same
// layout it reads the request in, so it can be passed back as the next
// request unchanged.
p := tls.Alloc(sleepScratchSize)
defer tls.Free(sleepScratchSize)
args[iRem] = long(p)
}
for {
r1, _, err := unix.Syscall6(uintptr(n), uintptr(args[0]), uintptr(args[1]), uintptr(args[2]), uintptr(args[3]), uintptr(args[4]), uintptr(args[5]))
switch {
case err == 0:
return long(r1)
case err != unix.EINTR:
return long(-err)
case flags&TIMER_ABSTIME != 0:
// Waiting for an absolute deadline: the original request is still
// the right one and the kernel reports no remaining time.
continue
case args[iRem] == 0:
// Nowhere for the kernel to report the remaining time, so the sleep
// cannot be restarted without overshooting. Report the
// interruption.
return long(-err)
}
args[iReq] = args[iRem]
}
}
func X__syscall0(tls *TLS, n long) long {
switch n {
case __NR_sched_yield:
runtime.Gosched()
return 0
default:
r1, _, err := unix.Syscall(uintptr(n), 0, 0, 0)
if err != 0 {
return long(-err)
}
return long(r1)
}
}
func X__syscall1(tls *TLS, n, a1 long) long {
r1, _, err := unix.Syscall(uintptr(n), uintptr(a1), 0, 0)
if err != 0 {
return long(-err)
}
return long(r1)
}
func X__syscall2(tls *TLS, n, a1, a2 long) long {
r1, _, err := unix.Syscall(uintptr(n), uintptr(a1), uintptr(a2), 0)
if err != 0 {
return long(-err)
}
return long(r1)
}
func X__syscall3(tls *TLS, n, a1, a2, a3 long) long {
r1, _, err := unix.Syscall(uintptr(n), uintptr(a1), uintptr(a2), uintptr(a3))
if err != 0 {
return long(-err)
}
return long(r1)
}
func X__syscall4(tls *TLS, n, a1, a2, a3, a4 long) long {
r1, _, err := unix.Syscall6(uintptr(n), uintptr(a1), uintptr(a2), uintptr(a3), uintptr(a4), 0, 0)
if err != 0 {
return long(-err)
}
return long(r1)
}
func X__syscall5(tls *TLS, n, a1, a2, a3, a4, a5 long) long {
r1, _, err := unix.Syscall6(uintptr(n), uintptr(a1), uintptr(a2), uintptr(a3), uintptr(a4), uintptr(a5), 0)
if err != 0 {
return long(-err)
}
return long(r1)
}
func X__syscall6(tls *TLS, n, a1, a2, a3, a4, a5, a6 long) long {
r1, _, err := unix.Syscall6(uintptr(n), uintptr(a1), uintptr(a2), uintptr(a3), uintptr(a4), uintptr(a5), uintptr(a6))
if err != 0 {
return long(-err)
}
return long(r1)
}