<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">This is a great idea. Only gotcha is the construction of a parallel view.<div><br></div><div>In Him,</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>DM</div><div><br><div><div>On Aug 23, 2012, at 5:44 PM, Chris Burrell &lt;<a href="mailto:chris@burrell.me.uk">chris@burrell.me.uk</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">For those who want the details of the analysis so far:<div><br></div><div>We start with&nbsp;AbstractPassageBook.getOsisIterator. This core function essentially obtains the XML and converts it to a XML structure.</div><div><ul>
<li>This iterates over ranges first</li><ul><li>within each range, (1)</li><ul><li>adds some headers to the xml document (2)</li><li>iterates over each verse (3)</li><ul><li>&nbsp;calls getRawText</li><ul><li>getRawText in turn calls the relevant backend</li>
<li>The backend, calls activate</li><ul><li>uses the stored fields to retrieve the random access files that have already been opened (and cause the problem)</li><li>returns OSIS in raw "string" form (4)</li></ul>
</ul><li>adds the xml to the xml document (5)</li></ul></ul></ul></ul><div>My suggested refactoring, would be to re-jig things as follows:</div><div><ul><li>(removed)</li><ul><li>(removed)</li><ul><li>(removed)</li><li>(removed)</li>
<ul><li>&nbsp;calls getRawText</li><ul><li>getRawText in turn calls the relevant backend</li><li>The backend, calls activate (? no longer required?)</li><ul><li>uses the stored fields to retrieve the random access files that have already been opened (and cause the problem)</li>
<li><b>within each range, (1)</b></li><li><b>use passed-in parameter and adds some headers to the xml document (2)</b></li><li><b>iterates over each verse (3)</b></li><ul><li>returns OSIS in raw "string" form (4)</li>
<li><b>adds the xml to the xml document (5)</b></li></ul></ul></ul></ul></ul></ul></ul></div><div><br></div><div>Something along those lines anyway (lines in bold have moved/changed slightly)</div><div>Chris</div><div><br>
</div><div><br></div><br><div class="gmail_quote">On 23 August 2012 22:33, Chris Burrell <span dir="ltr">&lt;<a href="mailto:chris@burrell.me.uk" target="_blank">chris@burrell.me.uk</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi all<div><br></div><div>Just wondering if this section of the "Activator" code was introduced to reduce memory as a result of observing an issue, or not? I'm looking at SwordGenBook in particular, but seeing all kinds of interesting things</div>

<div><br></div><div><ul><li>Activator has a reduceMemoryUsage method. This is based on KILL. Of the 3 enum constants, only 1 has a method that actually does something. And as far as I can tell, anyone can call reduceMemoryUsage at any time, which will then thoroughly break anything in the process of running by nulling out a whole load of references.</li>

<li>Secondly, there is this Lock object. It's not used to synchronise on, nor used in any form. The private javadoc comment is slightly mis-leading, unless I'm missing a piece of code somewhere.</li><li>SwordGenBook.activate gets an empty set from its parent, and thereby the loop doesn't do anything.</li>

<li>the "global" field is always an empty ReadOnlyList as a result, can we remove and simplify this?</li></ul><div>In the SwordBook:</div><div><ul><li>activate() does nothing (apart from registering it with the activator, which seems to defeat the point as there is no clean-up)</li>

<li>deactivate() deactivates the backend it is based upon. Should this be done preferably by the backend rather than here?</li></ul><div>Finally, in order to address JS-109 and contain the refactoring process, I am thinking of changing the method signature for AbstractPassageBook.getRawText(). My intended approach is to pass in an extract parameter, as 1 or 2 anonymous class to post-process what has been discovered in reading the raw data. By doing so, I believe I might be able to push both loops from AbstractPassageBook into the backends, so that the backends themselves deal with iterating through ranges and verses.&nbsp;</div>

</div><div><br></div><div>The idea being, for performance reasons, we want to keep the random access files open and re-use the state. However, we don't want to be sharing the state across threads, and therefore that state needs to be local. Not sure if it's going to be feasible doing it that way, but I thought I might give it a go. It obviously might mean re-jigging the vast majority of the backends. Shout if you want some more details.</div>

<div><br></div></div><div>Cheers</div><span class="HOEnZb"><font color="#888888"><div>Chris</div><div><br></div>
</font></span></blockquote></div><br></div>
_______________________________________________<br>jsword-devel mailing list<br><a href="mailto:jsword-devel@crosswire.org">jsword-devel@crosswire.org</a><br>http://www.crosswire.org/mailman/listinfo/jsword-devel<br></blockquote></div><br></div></body></html>