summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-05-13 00:52:09 +0800
committerruki <[email protected]>2022-05-13 00:52:09 +0800
commitb89c0a712d8e6d6fe056723e8c88e223d4b6e0c3 (patch)
tree94a2402c12ad9449be99e119ea251f4da5568c9d
parentcc645f1d88bd3cbde0db66b4c5400d5065b0368e (diff)
add client session
-rw-r--r--xmake/modules/private/service/distcc_build/client.lua1
-rw-r--r--xmake/modules/private/service/distcc_build/client_session.lua129
-rw-r--r--xmake/modules/private/service/distcc_build/server.lua12
-rw-r--r--xmake/modules/private/service/distcc_build/server_session.lua26
-rw-r--r--xmake/modules/private/service/remote_build/server.lua12
-rw-r--r--xmake/modules/private/service/remote_build/server_session.lua26
6 files changed, 180 insertions, 26 deletions
diff --git a/xmake/modules/private/service/distcc_build/client.lua b/xmake/modules/private/service/distcc_build/client.lua
index 9f85e3d3e..34e590f83 100644
--- a/xmake/modules/private/service/distcc_build/client.lua
+++ b/xmake/modules/private/service/distcc_build/client.lua
@@ -29,6 +29,7 @@ import("lib.detect.find_tool")
import("private.service.client_config", {alias = "config"})
import("private.service.message")
import("private.service.client")
+import("private.service.distcc_build.client_session")
import("private.service.stream", {alias = "socket_stream"})
-- define module
diff --git a/xmake/modules/private/service/distcc_build/client_session.lua b/xmake/modules/private/service/distcc_build/client_session.lua
new file mode 100644
index 000000000..957e3b550
--- /dev/null
+++ b/xmake/modules/private/service/distcc_build/client_session.lua
@@ -0,0 +1,129 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file client_session.lua
+--
+
+-- imports
+import("core.base.pipe")
+import("core.base.bytes")
+import("core.base.object")
+import("core.base.global")
+import("core.base.option")
+import("core.base.hashset")
+import("core.base.scheduler")
+import("private.service.client_config", {alias = "config"})
+import("private.service.message")
+
+-- define module
+local client_session = client_session or object()
+
+-- init client session
+function client_session:init(client, session_id)
+ self._ID = session_id
+ self._CLIENT = client
+end
+
+-- get client session id
+function client_session:id()
+ return self._ID
+end
+
+-- get client
+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
+end
+
+-- get work directory
+function client_session:workdir()
+ return path.join(self: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)
+ local instance = client_session()
+ instance:init(session_id)
+ return instance
+end
diff --git a/xmake/modules/private/service/distcc_build/server.lua b/xmake/modules/private/service/distcc_build/server.lua
index f8889b829..80b0e38b3 100644
--- a/xmake/modules/private/service/distcc_build/server.lua
+++ b/xmake/modules/private/service/distcc_build/server.lua
@@ -19,6 +19,7 @@
--
-- imports
+import("core.base.global")
import("private.service.server_config", {alias = "config"})
import("private.service.message")
import("private.service.server")
@@ -50,6 +51,15 @@ function distcc_build_server:class()
return distcc_build_server
end
+-- get work directory
+function distcc_build_server:workdir()
+ local workdir = config.get("distcc_build.workdir")
+ if not workdir then
+ workdir = path.join(global.directory(), "service", "server", "distcc_build")
+ end
+ return workdir
+end
+
-- on handle message
function distcc_build_server:_on_handle(stream, msg)
local session_id = msg:session_id()
@@ -102,7 +112,7 @@ end
function distcc_build_server:_session(session_id)
local session = self._SESSIONS[session_id]
if not session then
- session = server_session(session_id)
+ session = server_session(server, session_id)
self._SESSIONS[session_id] = session
end
return session
diff --git a/xmake/modules/private/service/distcc_build/server_session.lua b/xmake/modules/private/service/distcc_build/server_session.lua
index ddfbab1bb..9c564f302 100644
--- a/xmake/modules/private/service/distcc_build/server_session.lua
+++ b/xmake/modules/private/service/distcc_build/server_session.lua
@@ -32,17 +32,23 @@ import("private.service.message")
-- define module
local server_session = server_session or object()
--- init server_session
-function server_session:init(session_id)
+-- init server session
+function server_session:init(server, session_id)
self._ID = session_id
+ self._SERVER = server
end
--- get server_session id
+-- get server session id
function server_session:id()
return self._ID
end
--- open server_session
+-- get server
+function server_session:server()
+ return self._SERVER
+end
+
+-- open server session
function server_session:open()
if self:is_connected() then
return
@@ -55,7 +61,7 @@ function server_session:open()
self:status_save()
end
--- close server_session
+-- close server session
function server_session:close()
if not self:is_connected() then
return
@@ -80,11 +86,7 @@ end
-- get work directory
function server_session:workdir()
- local workdir = config.get("distcc_build.workdir")
- if not workdir then
- workdir = path.join(global.directory(), "service", "server", "distcc_build")
- end
- return path.join(workdir, "sessons", self:id())
+ return path.join(self:server(), "sessons", self:id())
end
-- is connected?
@@ -120,8 +122,8 @@ function server_session:__tostring()
return string.format("<session %s>", self:id())
end
-function main(session_id)
+function main(server, session_id)
local instance = server_session()
- instance:init(session_id)
+ instance:init(server, session_id)
return instance
end
diff --git a/xmake/modules/private/service/remote_build/server.lua b/xmake/modules/private/service/remote_build/server.lua
index 79b175cdb..31ddf4b4c 100644
--- a/xmake/modules/private/service/remote_build/server.lua
+++ b/xmake/modules/private/service/remote_build/server.lua
@@ -19,6 +19,7 @@
--
-- imports
+import("core.base.global")
import("private.service.server_config", {alias = "config"})
import("private.service.message")
import("private.service.server")
@@ -50,6 +51,15 @@ function remote_build_server:class()
return remote_build_server
end
+-- get work directory
+function remote_build_server:workdir()
+ local workdir = config.get("remote_build.workdir")
+ if not workdir then
+ workdir = path.join(global.directory(), "service", "server", "remote_build")
+ end
+ return workdir
+end
+
-- on handle message
function remote_build_server:_on_handle(stream, msg)
local session_id = msg:session_id()
@@ -110,7 +120,7 @@ end
function remote_build_server:_session(session_id)
local session = self._SESSIONS[session_id]
if not session then
- session = server_session(session_id)
+ session = server_session(self, session_id)
self._SESSIONS[session_id] = session
end
return session
diff --git a/xmake/modules/private/service/remote_build/server_session.lua b/xmake/modules/private/service/remote_build/server_session.lua
index e0bfb4170..761eb7ee2 100644
--- a/xmake/modules/private/service/remote_build/server_session.lua
+++ b/xmake/modules/private/service/remote_build/server_session.lua
@@ -33,21 +33,27 @@ import("private.service.remote_build.filesync", {alias = "new_filesync"})
-- define module
local server_session = server_session or object()
--- init server_session
-function server_session:init(session_id)
+-- init server session
+function server_session:init(server, session_id)
self._ID = session_id
+ self._SERVER = server
local filesync = new_filesync(self:sourcedir(), path.join(self:workdir(), "manifest.txt"))
filesync:ignorefiles_add(".git/**")
filesync:ignorefiles_add(".xmake/**")
self._FILESYNC = filesync
end
--- get server_session id
+-- get server session id
function server_session:id()
return self._ID
end
--- open server_session
+-- get server
+function server_session:server()
+ return self._SERVER
+end
+
+-- open server session
function server_session:open()
if self:is_connected() then
return
@@ -63,7 +69,7 @@ function server_session:open()
self:status_save()
end
--- close server_session
+-- close server session
function server_session:close()
if not self:is_connected() then
return
@@ -212,11 +218,7 @@ end
-- get work directory
function server_session:workdir()
- local workdir = config.get("remote_build.workdir")
- if not workdir then
- workdir = path.join(global.directory(), "service", "server", "remote_build")
- end
- return path.join(workdir, "sessons", self:id())
+ return path.join(self:server():workdir(), "sessons", self:id())
end
-- is connected?
@@ -364,8 +366,8 @@ function server_session:__tostring()
return string.format("<session %s>", self:id())
end
-function main(session_id)
+function main(server, session_id)
local instance = server_session()
- instance:init(session_id)
+ instance:init(server, session_id)
return instance
end