mirror of
https://github.com/holub/mame
synced 2025-06-03 19:36:26 +03:00
85 lines
2.2 KiB
Lua
85 lines
2.2 KiB
Lua
|
|
-- This function will be run in a child process
|
|
local child_code = string.dump(function ()
|
|
local p = require('lib/utils').prettyPrint
|
|
local uv = require('luv')
|
|
|
|
-- The parent is going to pass us the server handle over a pipe
|
|
-- This will be our local file descriptor at PIPE_FD
|
|
local pipe = uv.new_pipe(true)
|
|
local pipe_fd = tonumber(os.getenv("PIPE_FD"))
|
|
assert(uv.pipe_open(pipe, pipe_fd))
|
|
|
|
-- Configure the server handle
|
|
local server = uv.new_tcp()
|
|
local function onconnection()
|
|
local client = uv.new_tcp()
|
|
uv.accept(server, client)
|
|
p("New TCP", client, "on", server)
|
|
p{client=client}
|
|
uv.write(client, "BYE!\n");
|
|
uv.shutdown(client, function ()
|
|
uv.close(client)
|
|
uv.close(server)
|
|
end)
|
|
end
|
|
|
|
-- Read the server handle from the parent
|
|
local function onread(err, data)
|
|
p("onread", {err=err,data=data})
|
|
assert(not err, err)
|
|
if uv.pipe_pending_count(pipe) > 0 then
|
|
local pending_type = uv.pipe_pending_type(pipe)
|
|
p("pending_type", pending_type)
|
|
assert(pending_type == "tcp")
|
|
assert(uv.accept(pipe, server))
|
|
assert(uv.listen(server, 128, onconnection))
|
|
p("Received server handle from parent process", server)
|
|
elseif data then
|
|
p("ondata", data)
|
|
else
|
|
p("onend", data)
|
|
end
|
|
end
|
|
uv.read_start(pipe, onread)
|
|
|
|
-- Start the event loop!
|
|
uv.run()
|
|
end)
|
|
|
|
local p = require('lib/utils').prettyPrint
|
|
local uv = require('luv')
|
|
|
|
local exepath = assert(uv.exepath())
|
|
local cpu_count = # assert(uv.cpu_info())
|
|
|
|
local server = uv.new_tcp()
|
|
assert(uv.tcp_bind(server, "::1", 1337))
|
|
print("Master process bound to TCP port 1337 on ::1")
|
|
|
|
|
|
local function onexit(status, signal)
|
|
p("Child exited", {status=status,signal=signal})
|
|
end
|
|
|
|
local function spawnChild()
|
|
local pipe = uv.new_pipe(true)
|
|
local input = uv.new_pipe(false)
|
|
local _, pid = assert(uv.spawn(exepath, {
|
|
stdio = {input,1,2,pipe},
|
|
env= {"PIPE_FD=3"}
|
|
}, onexit))
|
|
uv.write(input, child_code)
|
|
uv.shutdown(input)
|
|
p("Spawned child", pid, "and sending handle", server)
|
|
assert(uv.write2(pipe, "123", server))
|
|
assert(uv.shutdown(pipe))
|
|
end
|
|
|
|
-- Spawn a child process for each CPU core
|
|
for _ = 1, cpu_count do
|
|
spawnChild()
|
|
end
|
|
|
|
uv.run()
|