comparison 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
comparison
equal deleted inserted replaced
1380:04482e2a6ca3 1381:8d7a39ca2c0c
23 local Io = require "luan:Io.luan" 23 local Io = require "luan:Io.luan"
24 local Thread = require "luan:Thread.luan" 24 local Thread = require "luan:Thread.luan"
25 local Table = require "luan:Table.luan" 25 local Table = require "luan:Table.luan"
26 local java_to_table_deep = Table.java_to_table_deep or error() 26 local java_to_table_deep = Table.java_to_table_deep or error()
27 local unpack = Table.unpack or error() 27 local unpack = Table.unpack or error()
28 local ThreadLuan = require "java:luan.modules.ThreadLuan"
28 local Logging = require "luan:logging/Logging.luan" 29 local Logging = require "luan:logging/Logging.luan"
29 local logger = Logging.logger "Rpc" 30 local logger = Logging.logger "Rpc"
30 31
31 32
32 local Rpc = {} 33 local Rpc = {}
133 function responder.is_closed() 134 function responder.is_closed()
134 return server.isClosed() 135 return server.isClosed()
135 end_function 136 end_function
136 function responder.respond() 137 function responder.respond()
137 local call = server.read() 138 local call = server.read()
138 if call==nil then return end 139 if call==nil then
140 return
141 end
139 local cmd = call.cmd 142 local cmd = call.cmd
140 if cmd == "close" then 143 if cmd == "close" then
141 server.close() 144 server.close()
145 return
146 end_if
147 if cmd == "in_backup_read_lock" then
148 ThreadLuan.lock(Thread.backup_read_lock)
149 function responder.after_close()
150 Thread.backup_read_lock.unlock()
151 end
152 server.write(RpcResult.new())
142 return 153 return
143 end_if 154 end_if
144 local fn = fns[cmd] 155 local fn = fns[cmd]
145 if fn == nil then 156 if fn == nil then
146 server.write(JavaRpc.COMMAND_NOT_FOUND) 157 server.write(JavaRpc.COMMAND_NOT_FOUND)
182 local mt = {} 193 local mt = {}
183 function mt.__index(_,key) 194 function mt.__index(_,key)
184 return function(...) 195 return function(...)
185 return call(key,...) 196 return call(key,...)
186 end 197 end
198 end
199 local err = Luan.new_error("not closed")
200 function mt.__gc(_)
201 socket.isClosed() or logger.error(err)
187 end 202 end
188 local t = {} 203 local t = {}
189 set_metatable(t,mt) 204 set_metatable(t,mt)
190 return t 205 return t
191 end_function 206 end_function
203 while true do 218 while true do
204 try { 219 try {
205 function() 220 function()
206 local socket = socket_server.accept() 221 local socket = socket_server.accept()
207 local function server() 222 local function server()
223 local responder = nil
208 try { 224 try {
209 function() 225 function()
210 local responder = rpc_responder(socket,fns) 226 responder = rpc_responder(socket,fns)
211 while not responder.is_closed() do 227 while not responder.is_closed() do
212 responder.respond() 228 responder.respond()
213 end 229 end
214 end 230 end
215 catch = function(e) 231 catch = function(e)
216 logger.warn(e) 232 logger.warn(e)
217 end 233 end
234 finally = function()
235 responder and responder.after_close and responder.after_close()
236 end
218 } 237 }
219 end 238 end
220 Thread.fork(server) 239 Thread.fork(server)
221 end 240 end
222 catch = function(e) 241 catch = function(e)