Skip to content

Commit

Permalink
Make Process::Status Windows-compatible.
Browse files Browse the repository at this point in the history
Skip the bitmasks/signal handling.

Co-Authored-By: Stephanie Hobbs <steph@rx14.co.uk>
  • Loading branch information
oprypin and RX14 committed Apr 8, 2020
1 parent 3efa459 commit 0b68044
Showing 1 changed file with 43 additions and 16 deletions.
59 changes: 43 additions & 16 deletions src/process/status.cr
Original file line number Diff line number Diff line change
@@ -1,38 +1,65 @@
# The status of a terminated process.
# The status of a terminated process. Returned by `Process#wait`.
class Process::Status
# Platform-specific exit status code, which usually contains either the exit code or a termination signal.
# The other `Process::Status` methods extract the values from `exit_status`.
getter exit_status : Int32

def initialize(@exit_status : Int32)
def exit_status : Int32
@exit_status.to_i32
end

{% if flag?(:win32) %}
# :nodoc:
def initialize(@exit_status : UInt32)
end
{% else %}
# :nodoc:
def initialize(@exit_status : Int32)
end
{% end %}

# Returns `true` if the process was terminated by a signal.
def signal_exit?
# define __WIFSIGNALED(status) (((signed char) (((status) & 0x7f) + 1) >> 1) > 0)
((LibC::SChar.new(@exit_status & 0x7f) + 1) >> 1) > 0
def signal_exit? : Bool
{% if flag?(:unix) %}
# define __WIFSIGNALED(status) (((signed char) (((status) & 0x7f) + 1) >> 1) > 0)
((LibC::SChar.new(@exit_status & 0x7f) + 1) >> 1) > 0
{% else %}
false
{% end %}
end

# Returns `true` if the process terminated normally.
def normal_exit?
# define __WIFEXITED(status) (__WTERMSIG(status) == 0)
signal_code == 0
def normal_exit? : Bool
{% if flag?(:unix) %}
# define __WIFEXITED(status) (__WTERMSIG(status) == 0)
signal_code == 0
{% else %}
true
{% end %}
end

# If `signal_exit?` is `true`, returns the *Signal* the process
# received and didn't handle. Will raise if `signal_exit?` is `false`.
def exit_signal
Signal.from_value(signal_code)
#
# Available only on Unix-like operating systems.
def exit_signal : Signal
{% if flag?(:unix) %}
Signal.from_value(signal_code)
{% else %}
raise NotImplementedError.new("Process::Status#exit_signal")
{% end %}
end

# If `normal_exit?` is `true`, returns the exit code of the process.
def exit_code
# define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
(@exit_status & 0xff00) >> 8
def exit_code : Int32
{% if flag?(:unix) %}
# define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
(@exit_status & 0xff00) >> 8
{% else %}
exit_status
{% end %}
end

# Returns `true` if the process exited normally with an exit code of `0`.
def success?
def success? : Bool
normal_exit? && exit_code == 0
end

Expand Down

0 comments on commit 0b68044

Please sign in to comment.