HTTP Server: Fix random deadlocks when serving multiple concurrent requests (writing json)

pull/620/head
gnosygnu 7 years ago
parent 5e668b96c7
commit 3923df5e19

@ -28,6 +28,7 @@ public class Xoa_util_svc {
public void Page_get(Json_nde args) {
// get args
String page_get_cbk = args.Get_as_str("page_get_cbk");
byte[] protocol = args.Get_as_bry("protocol");
byte[] wiki_bry = args.Get_as_bry("wiki");
byte[] page_bry = args.Get_as_bry("page");
String vega_cbk_guid = args.Get_as_str("vega_cbk_guid");
@ -43,12 +44,18 @@ public class Xoa_util_svc {
// get page
Xoa_ttl ttl = wiki.Ttl_parse(page_bry);
Xow_page_cache_itm page_itm = wiki.Cache_mgr().Page_cache().Get_or_load_as_itm_2(ttl);
byte[] page_text = page_itm == null ? null : page_itm.Wtxt__direct();
if (page_text == null) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "Xoa_utl_svc:page not found: wiki=~{0} page=~{1}", wiki_bry, page_bry);
}
Xog_cbk_trg cbk_trg = Xog_cbk_trg.New_by_guid(page_guid);
cbk_mgr.Send_json(cbk_trg, page_get_cbk, gplx.core.gfobjs.Gfobj_nde.New()
.Add_bry("protocol", protocol)
.Add_bry("wiki", wiki_bry)
.Add_bry("page", page_bry)
.Add_str("vega_cbk_guid", vega_cbk_guid)
.Add_bry("page_text", page_itm.Wtxt__direct())
.Add_bry("page_text", page_text)
);
}
}

@ -15,7 +15,8 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.guis.cbks.swts; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.cbks.*;
import gplx.core.gfobjs.*;
public class Gfobj_wtr__json__browser extends Gfobj_wtr__json { private final Bry_bfr bfr;
public class Gfobj_wtr__json__browser extends Gfobj_wtr__json { private final Object thread_lock = new Object();
private final Bry_bfr bfr;
public Gfobj_wtr__json__browser() {
this.Opt_ws_(Bool_.N).Opt_backslash_2x_(Bool_.Y);
this.bfr = this.Bfr();
@ -23,12 +24,14 @@ public class Gfobj_wtr__json__browser extends Gfobj_wtr__json { private final
public String Write_as_func__swt(String func_name, Gfobj_grp root) {return Write_as_func(Bool_.Y, func_name, root);}
public String Write_as_func__drd(String func_name, Gfobj_grp root) {return Write_as_func(Bool_.N, func_name, root);}
private String Write_as_func(boolean write_return, String func_name, Gfobj_grp root) {
if (write_return) bfr.Add(Bry__func_bgn); // NOTE: Android WebView fails if return is passed; EX: "return 'true'" works on SWT.Browser, but not WebView
bfr.Add_str_u8(func_name);
bfr.Add(Bry__args_bgn);
this.Write(root);
bfr.Add(Bry__args_end);
return this.To_str();
synchronized (thread_lock) { // LOCK:needed else random http_server issues; DATE:2018-03-13
if (write_return) bfr.Add(Bry__func_bgn); // NOTE: Android WebView fails if return is passed; EX: "return 'true'" works on SWT.Browser, but not WebView
bfr.Add_str_u8(func_name);
bfr.Add(Bry__args_bgn);
this.Write(root);
bfr.Add(Bry__args_end);
return this.To_str();
}
}
private static final byte[]
Bry__func_bgn = Bry_.new_a7("return ")

@ -65,7 +65,7 @@ public class Xoh_head_itm__graph extends Xoh_head_itm__base {
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "d3.layout.cloud.js")));
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "vega2", "vega.js")));
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "graph2.compiled.js")));
// tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("modules", "graph2.js")));
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("modules", "graph2.js")));
}
else {
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "vega1", "vega.js")));

Loading…
Cancel
Save