1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-10-27 20:34:16 +00:00

Threading: Fix rare multi-thread error for Hiero parser

This commit is contained in:
gnosygnu 2017-05-26 06:09:10 -04:00
parent 3b4a3a5af5
commit 2776790369
3 changed files with 45 additions and 43 deletions

View File

@ -9,6 +9,6 @@
<classpathentry kind="lib" path="lib/mysql-connector-java-5.1.12-bin.jar"/> <classpathentry kind="lib" path="lib/mysql-connector-java-5.1.12-bin.jar"/>
<classpathentry kind="lib" path="lib/postgresql-8.4-701.jdbc4.jar"/> <classpathentry kind="lib" path="lib/postgresql-8.4-701.jdbc4.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="lib/sqlite-jdbc-3.8.11.2.jar"/> <classpathentry kind="lib" path="lib/sqlite-jdbc-3.18.0.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@ -22,48 +22,50 @@ class Hiero_parser {
private Hiero_block cur_block; private Hiero_block cur_block;
private Bry_bfr cur_tkn = Bry_bfr_.Reset(16); private Bry_bfr cur_tkn = Bry_bfr_.Reset(16);
public Hiero_block[] Parse(byte[] src, int bgn, int end) { public Hiero_block[] Parse(byte[] src, int bgn, int end) {
blocks.Clear(); synchronized (blocks) { // TS:needed b/c blocks, cur_block, etc are member vars DATE:2017-05-26
this.cur_block = new Hiero_block(); blocks.Clear();
cur_tkn.Clear(); this.cur_block = new Hiero_block();
int pos = bgn; cur_tkn.Clear();
while (true) { int pos = bgn;
if (pos == end) break; while (true) {
byte b = src[pos]; if (pos == end) break;
Object o = trie.Match_at_w_b0(trv, b, src, pos, end); byte b = src[pos];
if (o == null) { Object o = trie.Match_at_w_b0(trv, b, src, pos, end);
New_char(b); if (o == null) {
++pos; New_char(b);
} ++pos;
else { }
Hiero_parser_itm itm = (Hiero_parser_itm)o; else {
int new_pos = trv.Pos(); Hiero_parser_itm itm = (Hiero_parser_itm)o;
switch (itm.Tid()) { int new_pos = trv.Pos();
case Hiero_parser_itm.Tid_comment: switch (itm.Tid()) {
int end_comm = Bry_find_.Find_fwd(src, Gfh_tag_.Comm_end, new_pos, end); case Hiero_parser_itm.Tid_comment:
if (end_comm == Bry_find_.Not_found) // --> not found; for now, ignore <!-- int end_comm = Bry_find_.Find_fwd(src, Gfh_tag_.Comm_end, new_pos, end);
pos = new_pos; if (end_comm == Bry_find_.Not_found) // --> not found; for now, ignore <!--
else pos = new_pos;
pos = end_comm + Gfh_tag_.Comm_end_len; else
break; pos = end_comm + Gfh_tag_.Comm_end_len;
case Hiero_parser_itm.Tid_block_spr: break;
New_block(); case Hiero_parser_itm.Tid_block_spr:
break; New_block();
case Hiero_parser_itm.Tid_single_char: break;
Single_char_block(itm); case Hiero_parser_itm.Tid_single_char:
break; Single_char_block(itm);
case Hiero_parser_itm.Tid_dot: break;
Dot(); case Hiero_parser_itm.Tid_dot:
break; Dot();
case Hiero_parser_itm.Tid_tkn_spr: break;
New_token(itm); case Hiero_parser_itm.Tid_tkn_spr:
break; New_token(itm);
default: throw Err_.new_unhandled(itm.Tid()); // should never happen break;
default: throw Err_.new_unhandled(itm.Tid()); // should never happen
}
pos = new_pos;
} }
pos = new_pos;
} }
this.New_block();// flush remaining items
return (Hiero_block[])blocks.To_ary_and_clear(Hiero_block.class);
} }
this.New_block();// flush remaining items
return (Hiero_block[])blocks.To_ary_and_clear(Hiero_block.class);
} }
private void New_block() { private void New_block() {
this.New_token(null); this.New_token(null);

View File

@ -1 +1 @@
update download_central update