Mercurial Hosting > luan
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) |