diff options
| author | ruki <[email protected]> | 2022-05-14 22:06:32 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-05-14 22:06:32 +0800 |
| commit | 98322b100895e773527d7d0ce9d9362e1a559ecb (patch) | |
| tree | 733ef498b48652614a8c68e672557783228ec306 | |
| parent | 59ef4006b44da3ee970c286fcfe5b49bc67cc54f (diff) | |
get client session
| -rw-r--r-- | xmake/modules/private/service/distcc_build/client.lua | 16 | ||||
| -rw-r--r-- | xmake/modules/private/service/distcc_build/client_session.lua | 68 |
2 files changed, 21 insertions, 63 deletions
diff --git a/xmake/modules/private/service/distcc_build/client.lua b/xmake/modules/private/service/distcc_build/client.lua index 599e123b1..13931fcc8 100644 --- a/xmake/modules/private/service/distcc_build/client.lua +++ b/xmake/modules/private/service/distcc_build/client.lua @@ -209,6 +209,9 @@ function distcc_build_client:iorunv(program, argv, opt) -- lock this host self:_host_status_lock(host) + -- get the host session + local session = self:_host_status_session(host) + -- TODO, do distcc compilation local outdata, errdata = os.iorunv(program, argv, opt) @@ -310,6 +313,19 @@ function distcc_build_client:_host_status_unlock(host_status) self._RUNNING = running end +-- get host session +function distcc_build_client:_host_status_session(host_status) + host_status.sessions = host_status.sessions or {} + local running = host_status.running + local session = host_status.sessions[running] + if not session then + local sock = assert(socket.connect(host_status.addr, host_status.port), "%s: server unreachable!", self) + session = client_session(self, host_status.session_id, sock) + host_status.sessions[running] = session + end + return session +end + -- get the session id, only for unique project function distcc_build_client:_session_id(addr, port) local hosts = self:status().hosts diff --git a/xmake/modules/private/service/distcc_build/client_session.lua b/xmake/modules/private/service/distcc_build/client_session.lua index 9f9a36c79..c3a1367df 100644 --- a/xmake/modules/private/service/distcc_build/client_session.lua +++ b/xmake/modules/private/service/distcc_build/client_session.lua @@ -28,13 +28,15 @@ import("core.base.hashset") import("core.base.scheduler") import("private.service.client_config", {alias = "config"}) import("private.service.message") +import("private.service.stream", {alias = "socket_stream"}) -- define module local client_session = client_session or object() -- init client session -function client_session:init(client, session_id) +function client_session:init(client, session_id, sock) self._ID = session_id + self._STREAM = socket_stream(sock) self._CLIENT = client end @@ -48,37 +50,6 @@ function client_session:client() return self._CLIENT end --- open client session -function client_session:open() - if self:is_connected() then - return - end - - -- update status - local status = self:status() - status.connected = true - status.session_id = self:id() - self:status_save() -end - --- close client session -function client_session:close() - if not self:is_connected() then - return - end - - -- update status - local status = self:status() - status.connected = false - status.session_id = self:id() - self:status_save() -end - --- set stream -function client_session:stream_set(stream) - self._STREAM = stream -end - -- get stream function client_session:stream() return self._STREAM @@ -89,41 +60,12 @@ function client_session:workdir() return path.join(self:server():workdir(), "sessons", self:id()) end --- is connected? -function client_session:is_connected() - return self:status().connected -end - --- get the status -function client_session:status() - local status = self._STATUS - local statusfile = self:statusfile() - if not status then - if os.isfile(statusfile) then - status = io.load(statusfile) - end - status = status or {} - self._STATUS = status - end - return status -end - --- save status -function client_session:status_save() - io.save(self:statusfile(), self:status()) -end - --- get status file -function client_session:statusfile() - return path.join(self:workdir(), "status.txt") -end - function client_session:__tostring() return string.format("<session %s>", self:id()) end -function main(session_id) +function main(client, session_id, job_id, sock) local instance = client_session() - instance:init(session_id) + instance:init(client, session_id, job_id, sock) return instance end |
