Mercurial Hosting > luan
diff src/luan/modules/Rpc.luan @ 1381:8d7a39ca2c0c
add Rpc in_backup_read_lock
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 28 Jul 2019 20:15:38 -0600 |
parents | 04482e2a6ca3 |
children | 27efb1fcbcb5 |
line wrap: on
line diff
--- a/src/luan/modules/Rpc.luan Sun Jul 28 11:06:37 2019 -0600 +++ b/src/luan/modules/Rpc.luan Sun Jul 28 20:15:38 2019 -0600 @@ -25,6 +25,7 @@ local Table = require "luan:Table.luan" local java_to_table_deep = Table.java_to_table_deep or error() local unpack = Table.unpack or error() +local ThreadLuan = require "java:luan.modules.ThreadLuan" local Logging = require "luan:logging/Logging.luan" local logger = Logging.logger "Rpc" @@ -135,12 +136,22 @@ end_function function responder.respond() local call = server.read() - if call==nil then return end + if call==nil then + return + end local cmd = call.cmd if cmd == "close" then server.close() return end_if + if cmd == "in_backup_read_lock" then + ThreadLuan.lock(Thread.backup_read_lock) + function responder.after_close() + Thread.backup_read_lock.unlock() + end + server.write(RpcResult.new()) + return + end_if local fn = fns[cmd] if fn == nil then server.write(JavaRpc.COMMAND_NOT_FOUND) @@ -185,6 +196,10 @@ return call(key,...) end end + local err = Luan.new_error("not closed") + function mt.__gc(_) + socket.isClosed() or logger.error(err) + end local t = {} set_metatable(t,mt) return t @@ -205,9 +220,10 @@ function() local socket = socket_server.accept() local function server() + local responder = nil try { function() - local responder = rpc_responder(socket,fns) + responder = rpc_responder(socket,fns) while not responder.is_closed() do responder.respond() end @@ -215,6 +231,9 @@ catch = function(e) logger.warn(e) end + finally = function() + responder and responder.after_close and responder.after_close() + end } end Thread.fork(server)