Skip to content

Commit

Permalink
add signal stubs in runtime
Browse files Browse the repository at this point in the history
Signed-off-by: leongross <[email protected]>
  • Loading branch information
leongross committed Jul 31, 2024
1 parent 6184a6c commit 4dcef18
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 0 deletions.
1 change: 1 addition & 0 deletions GNUmakefile
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@ TEST_PACKAGES_FAST = \
net/http/internal/ascii \
net/mail \
os \
os/signal \
path \
reflect \
sync \
Expand Down
4 changes: 4 additions & 0 deletions src/os/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
54 changes: 54 additions & 0 deletions src/os/signal/signal_linux.go
Original file line number Diff line number Diff line change
@@ -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))
}
30 changes: 30 additions & 0 deletions src/os/signal/signal_linux_test.go
Original file line number Diff line number Diff line change
@@ -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)
}
26 changes: 26 additions & 0 deletions src/runtime/sigqueue.go
Original file line number Diff line number Diff line change
@@ -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 }

0 comments on commit 4dcef18

Please sign in to comment.