Update of /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/parser/kernel
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv29185/app/src/net/sourceforge/squirrel_sql/client/session/parser/kernel
Modified Files:
Scanner.java ParserThread.java Parser.java
Added Files:
ExitParserThreadRequestException.java
Log Message:
SQuirreL was seen consuming a lot of memory and CPU. For details see comments in class ExitParserThreadRequestException
Index: ParserThread.java
===================================================================
RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/parser/kernel/ParserThread.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** ParserThread.java 19 Aug 2007 20:35:17 -0000 1.9
--- ParserThread.java 11 Feb 2010 00:16:27 -0000 1.10
***************
*** 64,68 ****
! private boolean _exitThread;
private ParsingFinishedListener _parsingFinishedListener;
--- 64,68 ----
! private volatile boolean _exitThread;
private ParsingFinishedListener _parsingFinishedListener;
***************
*** 393,396 ****
--- 393,400 ----
}
}
+ catch(ExitParserThreadRequestException eptre)
+ {
+
+ }
catch (Exception e)
{
***************
*** 408,413 ****
Scanner scanner = new Scanner(_workingBuffer, _errors);
! Parser parser = new Parser(scanner);
! parser.rootSchema = _schema;
parser.addParserListener(new ParserListener()
--- 412,416 ----
Scanner scanner = new Scanner(_workingBuffer, _errors);
! Parser parser = new Parser(scanner, _schema);
parser.addParserListener(new ParserListener()
***************
*** 451,466 ****
}
! /**
! * reset the parser, starting a new parse on the characters given by the iterator
! * @param chars the characters to start parsing from
! */
! public void reset(CharacterIterator chars)
! {
! IncrementalBuffer oldBuffer = this._workingBuffer;
! this._workingBuffer = new IncrementalBuffer(chars);
! oldBuffer.eof();
! }
!
! /**
* terminate the parser
*/
--- 454,458 ----
}
! /**
* terminate the parser
*/
***************
*** 487,491 ****
* The parsing thread can be terimated by calling the {@link #eof} method on this object
*/
! private static class IncrementalBuffer extends Scanner.Buffer
{
private CharacterIterator chars;
--- 479,483 ----
* The parsing thread can be terimated by calling the {@link #eof} method on this object
*/
! private class IncrementalBuffer extends Scanner.Buffer
{
private CharacterIterator chars;
***************
*** 506,509 ****
--- 498,507 ----
protected synchronized char read()
{
+
+ if(_exitThread)
+ {
+ throw new ExitParserThreadRequestException();
+ }
+
if (atEnd)
{
***************
*** 531,534 ****
--- 529,537 ----
if (atEnd)
{
+ if(_exitThread)
+ {
+ throw new ExitParserThreadRequestException();
+ }
+
current = eof;
return eof;
***************
*** 537,541 ****
{
char prev = current;
! //System.out.print(prev);
current = chars.next();
return prev;
--- 540,549 ----
{
char prev = current;
!
! if(_exitThread)
! {
! throw new ExitParserThreadRequestException();
! }
!
current = chars.next();
return prev;
--- NEW FILE: ExitParserThreadRequestException.java ---
package net.sourceforge.squirrel_sql.client.session.parser.kernel;
/**
* This exception exists because I found SQuirreL eating up memory and CPU.
* I could not reproduce the problem. But I once had the chance to analyze
* SQuirreL using jconsole when the problem was there. What I found was that for a closed
* Session the following thread was still alive:
*
* net.sourceforge.squirrel_sql.client.session.parser.kernel.ParserThread$IncrementalBuffer.read(ParserThread.java:540)
* - locked net.sourceforge.squirrel_sql.client.session.parser.kernel.ParserThread$IncrementalBuffer@12e81c5
* net.sourceforge.squirrel_sql.client.session.parser.kernel.Scanner.NextCh(Scanner.java:145)
* net.sourceforge.squirrel_sql.client.session.parser.kernel.Scanner.Scan(Scanner.java:356)
* net.sourceforge.squirrel_sql.client.session.parser.kernel.Parser.Get(Parser.java:131)
* net.sourceforge.squirrel_sql.client.session.parser.kernel.Parser.SQLStatement(Parser.java:1851)
* net.sourceforge.squirrel_sql.client.session.parser.kernel.Parser.squirrelSQL(Parser.java:1860)
* net.sourceforge.squirrel_sql.client.session.parser.kernel.Parser.parse(Parser.java:1875)
* net.sourceforge.squirrel_sql.client.session.parser.kernel.ParserThread.runParser(ParserThread.java:430)
* net.sourceforge.squirrel_sql.client.session.parser.kernel.ParserThread.run(ParserThread.java:367)
*
*
* With this exception I try to force this thread to end.
*
*/
public class ExitParserThreadRequestException extends RuntimeException
{
}
Index: Scanner.java
===================================================================
RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/parser/kernel/Scanner.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** Scanner.java 3 May 2006 10:49:38 -0000 1.4
--- Scanner.java 11 Feb 2010 00:16:27 -0000 1.5
***************
*** 111,127 ****
protected int lineStart; // start position of current line
! public Scanner (File file, ErrorStream e) throws IOException
! {
! buf = new FBuffer(file);
! init(e, file.getName());
! }
!
! public Scanner (String parseString, ErrorStream e)
! {
! buf = new SBuffer(parseString);
! init(e, "");
! }
!
! public Scanner (Buffer buff, ErrorStream e)
{
this.buf = buff;
--- 111,115 ----
protected int lineStart; // start position of current line
! public Scanner (Buffer buff, ErrorStream e)
{
this.buf = buff;
Index: Parser.java
===================================================================
RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/session/parser/kernel/Parser.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** Parser.java 7 Aug 2007 01:02:15 -0000 1.7
--- Parser.java 11 Feb 2010 00:16:27 -0000 1.8
***************
*** 18,27 ****
private Vector<SQLSelectStatementListener> sqlSelectStatlisteners = new Vector<SQLSelectStatementListener>();
! protected Scanner scanner; // input scanner
! protected Token token; // last recognized token
! protected Token t; // lookahead token
! public List<SQLStatement> statements = new ArrayList<SQLStatement>();
! public SQLSchema rootSchema;
private Stack<SQLStatementContext> stack;
--- 18,27 ----
private Vector<SQLSelectStatementListener> sqlSelectStatlisteners = new Vector<SQLSelectStatementListener>();
! private Scanner scanner; // input scanner
! private Token token; // last recognized token
! private Token t; // lookahead token
! private List<SQLStatement> statements = new ArrayList<SQLStatement>();
! private SQLSchema rootSchema;
private Stack<SQLStatementContext> stack;
***************
*** 1864,1871 ****
! public Parser(Scanner _scanner)
{
scanner = _scanner;
t = new Token();
}
--- 1864,1872 ----
! public Parser(Scanner _scanner, SQLSchema schema)
{
scanner = _scanner;
t = new Token();
+ rootSchema = schema;
}
|