Giter Site home page Giter Site logo

Comments (14)

bakpakin avatar bakpakin commented on May 26, 2024 1

An aside - a quick check on my machine seems to indicate that using :term SIGTERM instead of :int SIGINT will have the desired effect.

EDIT: nevermind, it works trivially because sigint handler is never called.

from janet.

bakpakin avatar bakpakin commented on May 26, 2024 1

Looking into this some more, I think the issue is some undefined behavior of what happens when you called exit in a program with pthread "detached" threads, of which all Janet's threads are. This is certainly an issue that needs some careful consideration - by default, calling exit will run atexit registered functions in each thread. One "fix" for this issue is to replace exit in janet's source code with _exit, which bypasses this atexit functionality that pthread presumably uses for cleanup.

I'm not sure this is an ideal solution, though.

from janet.

iacore avatar iacore commented on May 26, 2024

a signal is send to a random thread of the process group.
use sigmask on the other threads.

from janet.

amano-kenji avatar amano-kenji commented on May 26, 2024

How can I use sigmask?

from janet.

iacore avatar iacore commented on May 26, 2024
man sigprocmask
man sigwait

you can mask the selected signals on every thread, and use sigwait to listen for new signals

from janet.

amano-kenji avatar amano-kenji commented on May 26, 2024

So, you are saying this isn't an issue? Or?

from janet.

bakpakin avatar bakpakin commented on May 26, 2024

There is definitely some improvement to be made here - we can probably have better behavior by default, and possibly expose sigprocmask for control over which threads handle signals. Regardless, the current behavior isn't great.

from janet.

iacore avatar iacore commented on May 26, 2024

some undefined behavior

On Linux, the process group is killed together. The atexit is a libc feature.

Does janet use atexit at all?

from janet.

iacore avatar iacore commented on May 26, 2024

I found another issue while playing around with signal handler.

During the signal handler, the process signal mask is not changed (deviation from the POSIX behavior). So if you send SIGINT inside the Janet signal handler, the expected behavior is to not intercept the program.

Current behavior:
Pressing Ctrl+C makes the following program go into a loop.

(import spork/sh)

(def kill (ffi/lookup (ffi/native) "kill"))
(def signature (ffi/signature :default :int :int :int))


(defn action []
  (sh/rm "test")
  (print "Handled SIGINT!")
  (ffi/call kill signature 0 2)
  (print "unreachable"))

(ev/spawn-thread
  (let [server (net/listen :unix "test" :stream)]
    (forever
      (with [conn (net/accept server)]
        (print (ev/read conn :all))))))

(ev/spawn-thread
  (forever
    (print (file/read stdin :line))))

(defn main [_]
  (os/sigaction :int action)
  (forever
    (ev/sleep 1)))

from janet.

iacore avatar iacore commented on May 26, 2024

@amano-kenji here's a janky workaround you can use for now (on Linux)

(def kill (ffi/lookup (ffi/native) "kill"))
(def signature (ffi/signature :default :int :int :int))


(defn action []
  (sh/rm "test")
  (print "Handled SIGINT!")
  (ffi/call kill signature 0 15))

from janet.

bakpakin avatar bakpakin commented on May 26, 2024

This has been fixed on the latest master with the addition of a force argument to exit that calls _exit instead. The cause of this is just that exit() flushed stdio streams before exiting, as per the C standard, so this is not an issue with the interpreter.

from janet.

sogaiu avatar sogaiu commented on May 26, 2024

So since f6df8ff, os/exit has the docstring:

    (os/exit &opt x force)

    Exit from janet with an exit code equal to x. If x is not an 
    integer, the exit with status equal the hash of x. If `force` is 
    truthy will exit immediately and skip cleanup code.

from janet.

amano-kenji avatar amano-kenji commented on May 26, 2024

skip cleanup code

Does this mean os/sigaction will be skippped? Does this mean files and streams aren't closed?

from janet.

amano-kenji avatar amano-kenji commented on May 26, 2024

I just tested the latest commit.

(os/exit 1 true) can be called in signal handlers, but (os/exit 1) skips signal handlers.

from janet.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.