From 4dcef185606e94de5b7af571af7ad21834d5a8d8 Mon Sep 17 00:00:00 2001 From: leongross Date: Fri, 28 Jun 2024 10:32:28 +0200 Subject: [PATCH] add signal stubs in runtime Signed-off-by: leongross --- GNUmakefile | 1 + src/os/exec.go | 4 +++ src/os/signal/signal_linux.go | 54 ++++++++++++++++++++++++++++++ src/os/signal/signal_linux_test.go | 30 +++++++++++++++++ src/runtime/sigqueue.go | 26 ++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 src/os/signal/signal_linux.go create mode 100644 src/os/signal/signal_linux_test.go create mode 100644 src/runtime/sigqueue.go diff --git a/GNUmakefile b/GNUmakefile index f06f28a18c..d3982e8976 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -338,6 +338,7 @@ TEST_PACKAGES_FAST = \ net/http/internal/ascii \ net/mail \ os \ + os/signal \ path \ reflect \ sync \ diff --git a/src/os/exec.go b/src/os/exec.go index cf295e6fb7..fada70f479 100644 --- a/src/os/exec.go +++ b/src/os/exec.go @@ -47,6 +47,10 @@ func (p *ProcessState) Sys() interface{} { return nil // TODO } +func (p *ProcessState) Exited() bool { + return false // TODO +} + // ExitCode returns the exit code of the exited process, or -1 // if the process hasn't exited or was terminated by a signal. func (p *ProcessState) ExitCode() int { diff --git a/src/os/signal/signal_linux.go b/src/os/signal/signal_linux.go new file mode 100644 index 0000000000..391fb5c7d9 --- /dev/null +++ b/src/os/signal/signal_linux.go @@ -0,0 +1,54 @@ +// Copyright 2012 The Go 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 !plan9 && !windows && !js && !wasm && !wasip1 && !wasip2 +// +build !plan9,!windows,!js,!wasm,!wasip1,!wasip2 + +package signal + +import ( + "os" + "syscall" +) + +const ( + numSig = 65 // max across all systems +) + +type Signal interface { + String() string + Signal() // to distinguish from other Stringers +} + +// Defined by the runtime package and used by syscall/sigqueue.go. +func signal_disable(uint32) +func signal_enable(uint32) +func signal_ignore(uint32) +func signal_ignored(uint32) bool +func signal_recv() uint32 + +func signum(sig os.Signal) int { + switch sig := sig.(type) { + case syscall.Signal: + i := int(sig) + if i < 0 || i >= numSig { + return -1 + } + return i + default: + return -1 + } +} + +func enableSignal(sig int) { + signal_enable(uint32(sig)) +} + +func disableSignal(sig int) { + signal_disable(uint32(sig)) +} + +func ignoreSignal(sig int) { + signal_ignore(uint32(sig)) +} diff --git a/src/os/signal/signal_linux_test.go b/src/os/signal/signal_linux_test.go new file mode 100644 index 0000000000..9c58cafd35 --- /dev/null +++ b/src/os/signal/signal_linux_test.go @@ -0,0 +1,30 @@ +//go:build !plan9 && !windows && !js && !wasm && !wasip1 && !wasip2 +// +build !plan9,!windows,!js,!wasm,!wasip1,!wasip2 + +package signal + +import ( + "runtime" + "testing" +) + +// The file sigqueue.go contains preliminary stubs for signal handling. +// Since tinygo ultimately lacks support for signals, these stubs are +// placeholders for future work. +// There might be userland applications that rely on these functions +// from the upstream go package os/signal that we want to enable +// building and linking. + +func TestSignalHandling(t *testing.T) { + if runtime.GOOS == "wasip1" || runtime.GOOS == "wasip2" { + t.Skip() + } + + // This test is a placeholder for future work. + // It is here to ensure that the stubs in sigqueue.go + // are correctly linked and can be called from userland + // applications. + enableSignal(0) + disableSignal(0) + ignoreSignal(0) +} diff --git a/src/runtime/sigqueue.go b/src/runtime/sigqueue.go new file mode 100644 index 0000000000..ff789a605f --- /dev/null +++ b/src/runtime/sigqueue.go @@ -0,0 +1,26 @@ +// Copyright 2009 The Go 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 !plan9 +// +build !plan9 + +package runtime + +// Stub definitions copied from upstream golang +// TODO: implement a minimal functional version of these functions + +// go: linkname os/signal.signal_disable signal_disable +func signal_disable(_ uint32) {} + +// go: linkname os/signal.signal_enable signal_enable +func signal_enable(_ uint32) {} + +// go: linkname os/signal.signal_ignore signal_ignore +func signal_ignore(_ uint32) {} + +// go: linkname os/signal.signal_ignored signal_ignored +func signal_ignored(_ uint32) bool { return true } + +// go: linkname os/signal.signal_recv signal_recv +func signal_recv() uint32 { return 0 }