osproc compiles again for haiku

This commit is contained in:
Araq 2014-03-10 17:32:50 +01:00
commit 121553d1a6
3 changed files with 96 additions and 42 deletions

View file

@ -606,7 +606,8 @@ elif not defined(useNimRtl):
optionPoParentStreams: bool optionPoParentStreams: bool
optionPoStdErrToStdOut: bool optionPoStdErrToStdOut: bool
proc startProcessAuxSpawn(data: TStartProcessData): TPid {.tags: [FExecIO, FReadEnv].} when not defined(useFork):
proc startProcessAuxSpawn(data: TStartProcessData): TPid {.tags: [FExecIO, FReadEnv].}
proc startProcessAuxFork(data: TStartProcessData): TPid {.tags: [FExecIO, FReadEnv].} proc startProcessAuxFork(data: TStartProcessData): TPid {.tags: [FExecIO, FReadEnv].}
{.push stacktrace: off, profiler: off.} {.push stacktrace: off, profiler: off.}
proc startProcessAfterFork(data: ptr TStartProcessData) {. proc startProcessAfterFork(data: ptr TStartProcessData) {.
@ -664,7 +665,8 @@ elif not defined(useNimRtl):
data.workingDir = workingDir data.workingDir = workingDir
when defined(posix_spawn) and not defined(useFork) and not defined(useClone) and not defined(linux): when defined(posix_spawn) and not defined(useFork) and
not defined(useClone) and not defined(linux):
pid = startProcessAuxSpawn(data) pid = startProcessAuxSpawn(data)
else: else:
pid = startProcessAuxFork(data) pid = startProcessAuxFork(data)
@ -694,55 +696,56 @@ elif not defined(useNimRtl):
discard close(pStdin[readIdx]) discard close(pStdin[readIdx])
discard close(pStdout[writeIdx]) discard close(pStdout[writeIdx])
proc startProcessAuxSpawn(data: TStartProcessData): TPid = when not defined(useFork):
var attr: Tposix_spawnattr proc startProcessAuxSpawn(data: TStartProcessData): TPid =
var fops: Tposix_spawn_file_actions var attr: Tposix_spawnattr
var fops: Tposix_spawn_file_actions
template chck(e: expr) = template chck(e: expr) =
if e != 0'i32: osError(osLastError()) if e != 0'i32: osError(osLastError())
chck posix_spawn_file_actions_init(fops) chck posix_spawn_file_actions_init(fops)
chck posix_spawnattr_init(attr) chck posix_spawnattr_init(attr)
var mask: Tsigset var mask: Tsigset
chck sigemptyset(mask) chck sigemptyset(mask)
chck posix_spawnattr_setsigmask(attr, mask) chck posix_spawnattr_setsigmask(attr, mask)
chck posix_spawnattr_setpgroup(attr, 0'i32) chck posix_spawnattr_setpgroup(attr, 0'i32)
chck posix_spawnattr_setflags(attr, POSIX_SPAWN_USEVFORK or chck posix_spawnattr_setflags(attr, POSIX_SPAWN_USEVFORK or
POSIX_SPAWN_SETSIGMASK or POSIX_SPAWN_SETSIGMASK or
POSIX_SPAWN_SETPGROUP) POSIX_SPAWN_SETPGROUP)
if not data.optionPoParentStreams: if not data.optionPoParentStreams:
chck posix_spawn_file_actions_addclose(fops, data.pStdin[writeIdx]) chck posix_spawn_file_actions_addclose(fops, data.pStdin[writeIdx])
chck posix_spawn_file_actions_adddup2(fops, data.pStdin[readIdx], readIdx) chck posix_spawn_file_actions_adddup2(fops, data.pStdin[readIdx], readIdx)
chck posix_spawn_file_actions_addclose(fops, data.pStdout[readIdx]) chck posix_spawn_file_actions_addclose(fops, data.pStdout[readIdx])
chck posix_spawn_file_actions_adddup2(fops, data.pStdout[writeIdx], writeIdx) chck posix_spawn_file_actions_adddup2(fops, data.pStdout[writeIdx], writeIdx)
chck posix_spawn_file_actions_addclose(fops, data.pStderr[readIdx]) chck posix_spawn_file_actions_addclose(fops, data.pStderr[readIdx])
if data.optionPoStdErrToStdOut: if data.optionPoStdErrToStdOut:
chck posix_spawn_file_actions_adddup2(fops, data.pStdout[writeIdx], 2) chck posix_spawn_file_actions_adddup2(fops, data.pStdout[writeIdx], 2)
else:
chck posix_spawn_file_actions_adddup2(fops, data.pStderr[writeIdx], 2)
var res: cint
# FIXME: chdir is global to process
if data.workingDir.len > 0:
setCurrentDir($data.workingDir)
var pid: TPid
if data.optionPoUsePath:
res = posix_spawnp(pid, data.sysCommand, fops, attr, data.sysArgs, data.sysEnv)
else: else:
chck posix_spawn_file_actions_adddup2(fops, data.pStderr[writeIdx], 2) res = posix_spawn(pid, data.sysCommand, fops, attr, data.sysArgs, data.sysEnv)
var res: cint discard posix_spawn_file_actions_destroy(fops)
# FIXME: chdir is global to process discard posix_spawnattr_destroy(attr)
if data.workingDir.len > 0: chck res
setCurrentDir($data.workingDir) return pid
var pid: TPid
if data.optionPoUsePath:
res = posix_spawnp(pid, data.sysCommand, fops, attr, data.sysArgs, data.sysEnv)
else:
res = posix_spawn(pid, data.sysCommand, fops, attr, data.sysArgs, data.sysEnv)
discard posix_spawn_file_actions_destroy(fops)
discard posix_spawnattr_destroy(attr)
chck res
return pid
proc startProcessAuxFork(data: TStartProcessData): TPid = proc startProcessAuxFork(data: TStartProcessData): TPid =
if pipe(data.pErrorPipe) != 0: if pipe(data.pErrorPipe) != 0:
osError(osLastError()) osError(osLastError())
finally: finally:
discard close(data.pErrorPipe[readIdx]) discard close(data.pErrorPipe[readIdx])

View file

@ -0,0 +1,52 @@
#! strongSpaces
discard """
output: '''35
77
(Field0: 1, Field1: 2, Field2: 2)
ha
true
tester args
all
all args
'''
"""
echo 2+5 * 5
let foo = 77
echo $foo
echo (1, 2, 2)
template `&`(a, b: int): expr = a and b
template `|`(a, b: int): expr = a - b
template `++`(a, b: int): expr = a + b == 8009
when true:
let b = 66
let c = 90
let bar = 8000
if foo+4 * 4 == 8 and b&c | 9 ++
bar:
echo "ho"
else:
echo "ha"
let booA = foo+4 * 4 - b&c | 9 +
bar
# is parsed as
let booB = ((foo+4)*4) - ((b&c) | 9) + bar
echo booA == booB
template `|`(a, b): expr = (if a.len > 0: a else: b)
const
tester = "tester"
args = "args"
echo tester & " " & args|"all"
echo "all" | tester & " " & args
echo "all"|tester & " " & args

View file

@ -1,7 +1,6 @@
version 0.9.4 version 0.9.4
============= =============
- make testament produce full JSON information
- fix gensym capture bug - fix gensym capture bug
- vm - vm
- at least try to get the basic type zoo ops right - at least try to get the basic type zoo ops right