<!--
RSS generated by JIRA (4.4#649-r158309) at Sun May 19 22:03:29 CDT 2013

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
For example:
http://dev.clojure.org/jira/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?jqlQuery=project+%3D+CCACHE+AND+resolution+%3D+Unresolved+AND+component+is+EMPTY+ORDER+BY+priority+DESC&tempMax=1000&field=key&field=summary
-->
<!-- If you wish to do custom client-side styling of RSS, uncomment this:
<?xml-stylesheet href="http://dev.clojure.org/jira/styles/jiraxml2html.xsl" type="text/xsl"?>
-->
<rss version="0.92">
    <channel>
        <title>Clojure JIRA</title>
        <link>http://dev.clojure.org/jira/secure/IssueNavigator.jspa?reset=true&amp;jqlQuery=project+%3D+CCACHE+AND+resolution+%3D+Unresolved+AND+component+is+EMPTY+ORDER+BY+priority+DESC</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="12" total="12"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[CCACHE-26] hit function in LRU cache can give funny results</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-26</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;A common-sense usage in caches is hit/get. But if I naively do this to an LRUCache, without checking first for the presence of the key, I can break the limit.&lt;/p&gt;

&lt;p&gt;(-&amp;gt; (cache/lru-cache-factory {} :threshold 2)&lt;br/&gt;
    (cache/hit :x)&lt;br/&gt;
    (cache/hit :y)&lt;br/&gt;
    (cache/hit :z)&lt;br/&gt;
    (assoc :a 1)&lt;br/&gt;
    (assoc :b 2)&lt;br/&gt;
    (assoc :c 3)&lt;br/&gt;
    (assoc :d 4)&lt;br/&gt;
    (assoc :e 5))&lt;/p&gt;

&lt;p&gt;; {:e 5, :d 4, :c 3, :b 2, :a 1}&lt;/p&gt;</description>
                <environment></environment>
            <key id="15642">CCACHE-26</key>
            <summary>hit function in LRU cache can give funny results</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="arthuredelstein">Arthur Edelstein</reporter>
                        <labels>
                    </labels>
                <created>Wed, 22 Aug 2012 21:06:13 -0500</created>
                <updated>Wed, 22 Aug 2012 21:06:13 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-11] Add eviction implementation to LIRSCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-11</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The &lt;tt&gt;evict&lt;/tt&gt; method in the ProtocolCache needs implementation for &lt;tt&gt;LIRSCache&lt;/tt&gt;.  I will start initially with a single key eviction method to start.  The &lt;tt&gt;evict&lt;/tt&gt; method would form the basis for the associative &lt;tt&gt;dissoc&lt;/tt&gt; which in turn forms the basis for proper limited seeding.  LIRS poses an additional complication due to its dual limit lists.  Currently only the &lt;tt&gt;BasicCache&lt;/tt&gt; impl has &lt;tt&gt;evict&lt;/tt&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15056">CCACHE-11</key>
            <summary>Add eviction implementation to LIRSCache</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>associative</label>
                        <label>cache</label>
                        <label>evict</label>
                        <label>lirs</label>
                    </labels>
                <created>Thu, 8 Dec 2011 14:38:28 -0600</created>
                <updated>Thu, 8 Dec 2011 14:38:50 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-16] Benchmark v0.5.x against Google Guava</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-16</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Perform some tests and benchmarks of core.cache and Google Guava&apos;s com.google.common.cache library.&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15074">CCACHE-16</key>
            <summary>Benchmark v0.5.x against Google Guava</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>benchmark</label>
                        <label>cache</label>
                        <label>guava</label>
                    </labels>
                <created>Fri, 16 Dec 2011 08:55:39 -0600</created>
                <updated>Fri, 16 Dec 2011 08:55:39 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-17] Create function backed cache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-17</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;A cache implementation that is backed by a function that performs some action on a cache miss could serve as a front for any of the existing cache impls.&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15075">CCACHE-17</key>
            <summary>Create function backed cache</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>cache</label>
                        <label>fn-cache</label>
                        <label>new-feature</label>
                    </labels>
                <created>Fri, 16 Dec 2011 08:57:37 -0600</created>
                <updated>Mon, 19 Dec 2011 07:29:30 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27477" author="richhickey" created="Fri, 16 Dec 2011 09:45:18 -0600"  >&lt;p&gt;It doesn&apos;t perform an action per se, it gets a passed key and returns a value, which the cache then caches (associates with the key) and returns. The tricky bit is when the function can&apos;t get a value. There needs to be some protocol for communicating that (could be like 3 arg get), and, should the cache be asked again later for the same key, calling the fn again.&lt;/p&gt;</comment>
                    <comment id="27483" author="fogus" created="Mon, 19 Dec 2011 07:29:30 -0600"  >&lt;p&gt;Thanks for the feedback Rich.  I believe I understand the subtleties now.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-15] It appears that TTL cache exhibits quadratic performance (+ its evict is buggy)</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-15</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The library looks useful, thanks! &lt;/p&gt;

&lt;p&gt;I looked at the code, and unless I&apos;m mistaken, every cache miss seems to result in a full pass over the entire cache to evict old entries.  The performance implications of this would be unacceptable for my target application.  Replacing the TTL data structure with a persistent analog of a LinkedHashMap and using a take-while instead could fix this problem.&lt;/p&gt;

&lt;p&gt;Also, evict seems to pass the cache in twice, rather than the cache and the TTL...&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15073">CCACHE-15</key>
            <summary>It appears that TTL cache exhibits quadratic performance (+ its evict is buggy)</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="jawolfe">Jason Wolfe</reporter>
                        <labels>
                    </labels>
                <created>Wed, 14 Dec 2011 19:20:01 -0600</created>
                <updated>Thu, 15 Dec 2011 12:21:46 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27468" author="fogus" created="Thu, 15 Dec 2011 12:21:46 -0600"  >&lt;p&gt;TTLCache eviction fixed.  Patches welcomed for the other change, but we might be able to get away with a sorted map  ttl map.&lt;/p&gt;
</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-20] Add some examples to github page</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-20</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Could you add some examples on how to use core.cache to github readme?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15213">CCACHE-20</key>
            <summary>Add some examples to github page</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="jsyrjala">Juha Syrj&#228;l&#228;</reporter>
                        <labels>
                    </labels>
                <created>Wed, 8 Feb 2012 23:21:54 -0600</created>
                <updated>Sun, 19 Feb 2012 18:24:14 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27769" author="fogus" created="Sun, 19 Feb 2012 18:24:14 -0600"  >&lt;p&gt;Can do.  In the meantime checkout how core.memoize uses it at &lt;a href=&quot;https://github.com/clojure/core.memoize/blob/master/src/main/clojure/clojure/core/memoize.clj#L50&quot;&gt;https://github.com/clojure/core.memoize/blob/master/src/main/clojure/clojure/core/memoize.clj#L50&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think I might bring this &lt;tt&gt;through&lt;/tt&gt; fn into core.cache in a more generic way.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-27] Missing LU and LRU is linear complexity - performance</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-27</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Profiling some code with YourKit showed a hotspot in cache statistics on (miss) for LU and LRU caches.&lt;/p&gt;

&lt;p&gt;Basically two issues:  (count (keys {....})) is a count of a seq, not efficient. Replaced with a count of the map.&lt;/p&gt;

&lt;p&gt;Secondly, (apply f anything) is slow. Profiler showed that the (apply min-key) was really slow.  This is mitigated by using a c.d.priority-map instead.   On a priority-map, (ffirst {}) or (first (peek {}).&lt;/p&gt;

&lt;p&gt;Also inverted the logic for threshold comparison.  Since there is a (build-leastness-queue) that populates statistics, should caches should favor codepaths for the state of being full all the time?&lt;/p&gt;</description>
                <environment>Mac Oracle JDK, Linux OpenJDK</environment>
            <key id="15672">CCACHE-27</key>
            <summary>Missing LU and LRU is linear complexity - performance</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="gshayban@gmail.com">Ghadi Shayban</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>performance</label>
                    </labels>
                <created>Tue, 4 Sep 2012 11:26:54 -0500</created>
                <updated>Wed, 12 Sep 2012 09:27:56 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29391" author="gshayban" created="Thu, 6 Sep 2012 22:49:14 -0500"  >&lt;p&gt;I take back the part about (apply) being slow.  I think it&apos;s more the fact that it&apos;s doing a linear scan on keys every single time.&lt;/p&gt;

&lt;p&gt;(apply) does show up a lot in a profiler, but I haven&apos;t figured out why.  (apply + (range big)) seems to even be slightly faster than (reduce +) on the same range.&lt;/p&gt;
</comment>
                    <comment id="29426" author="gshayban" created="Wed, 12 Sep 2012 09:27:56 -0500"  >&lt;p&gt;Patch in proper format&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11492" name="priority-map-fixed.patch" size="5639" author="gshayban" created="Wed, 12 Sep 2012 09:27:56 -0500" />
                    <attachment id="11475" name="priority-map.patch" size="4909" author="gshayban@gmail.com" created="Tue, 4 Sep 2012 11:26:54 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-29] Is IPersistentCollection definition of cons correct?</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-29</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Here&apos;s the definition of `cons` for caches:&lt;/p&gt;

&lt;p&gt;      clojure.lang.IPersistentCollection&lt;br/&gt;
       (cons &lt;a href=&quot;#elem#&quot;&gt;_# elem#&lt;/a&gt;&lt;br/&gt;
         (clojure.core/cons ~base-field elem#))&lt;/p&gt;

&lt;p&gt;This seems wrong to me. Note first that the arguments to `clojure.core/cons` are in the wrong order. As a result, the result of (for example) conj is incorrect. Consider this:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (def starts-with-a (cache/fifo-cache-factory {:a 1} :threshold 3))&lt;/p&gt;

&lt;p&gt;#&apos;user/starts-with-a&lt;br/&gt;
user=&amp;gt; starts-with-a&lt;br/&gt;
{:a 1}&lt;br/&gt;
user=&amp;gt; (conj starts-with-a &lt;span class=&quot;error&quot;&gt;&amp;#91;:c 3&amp;#93;&lt;/span&gt;)&lt;br/&gt;
({:a 1} :c 3)&lt;/p&gt;

&lt;p&gt;Even if the argument order was correct, the result would still be a sequence rather than the type of the base field. I think you want something more like &lt;/p&gt;


&lt;p&gt;     clojure.lang.IPersistentCollection&lt;br/&gt;
       (cons &lt;a href=&quot;#elem#&quot;&gt;this# elem#&lt;/a&gt;&lt;br/&gt;
         (apply assoc this# elem#))&lt;/p&gt;

&lt;p&gt;After all, this particular collection is an IPersistentMap, so its `conj` and `into` behavior should be the same as other objects for which `map?` is true.&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15832">CCACHE-29</key>
            <summary>Is IPersistentCollection definition of cons correct?</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="marick">Brian Marick</reporter>
                        <labels>
                    </labels>
                <created>Sun, 18 Nov 2012 15:44:43 -0600</created>
                <updated>Sun, 18 Nov 2012 15:44:43 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-30] make-reference need not be dynamic</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-30</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;It looks like make-reference was made dynamic to support multiple clojure versions.  Rebinding make-reference is really only needed for tests, and it would be a shame if making it dynamic causes performance issues.&lt;/p&gt;

&lt;p&gt;Perhaps it is not enough of a performance issue to worry about.  Otherwise, it might be possible to work around it.  Perhaps directly pasting in and using the with-redefs macro, or something similar?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15995">CCACHE-30</key>
            <summary>make-reference need not be dynamic</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="pjstadig">Paul Stadig</reporter>
                        <labels>
                    </labels>
                <created>Sat, 9 Feb 2013 06:26:33 -0600</created>
                <updated>Sat, 9 Feb 2013 06:26:33 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-28] SoftCache NullPointerException in has? with many threads</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-28</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;&quot;cell&quot; can be null on this call to SoftReference.get():&lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/core.cache/blob/master/src/main/clojure/clojure/core/cache.clj#L501&quot;&gt;https://github.com/clojure/core.cache/blob/master/src/main/clojure/clojure/core/cache.clj#L501&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the cache did not contain &quot;item&quot; in the call to (get cache item) in the let binding, but another thread pre-empts and adds it before the subsequent call to contains?, we&apos;ll attempt to call .get() on nil.&lt;/p&gt;

&lt;p&gt;Would it perhaps be sufficient to just check whether cell is nil instead of calling contains? in the check on the previous line?&lt;/p&gt;</description>
                <environment>Linux, Oracle JRE 1.6</environment>
            <key id="15775">CCACHE-28</key>
            <summary>SoftCache NullPointerException in has? with many threads</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="jaley">James Aley</reporter>
                        <labels>
                    </labels>
                <created>Wed, 24 Oct 2012 08:42:28 -0500</created>
                <updated>Sat, 9 Feb 2013 06:27:03 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30573" author="pjstadig" created="Sat, 9 Feb 2013 06:13:39 -0600"  >&lt;p&gt;Good catch!&lt;/p&gt;

&lt;p&gt;This is rather simple to reproduce:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(use &apos;clojure.core.cache)
(def cache (soft-reference-cache {}))
(def mutator (&lt;span class=&quot;code-object&quot;&gt;Thread&lt;/span&gt;. #(loop [] (assoc cache :foo :bar) (dissoc cache :foo) (recur))))
(.start mutator)
(loop [] (has? cache :foo) (recur))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The attached patch fixes the issue, by not referring back to the cache after attempting to pull out a SoftReference.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11844" name="0001-CCACHE-28-fixes-concurrency-bug-in-has.patch" size="1108" author="pjstadig" created="Sat, 9 Feb 2013 06:13:39 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-14] Asynchronous Cache Support</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-14</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;If people start implementing the cache protocol on top of external caches: Memcache, Redis, or others, an async version could make sense. &lt;/p&gt;

&lt;p&gt;I started toying with an AsyncCacheProtocol which for all functions returning values would take two arities, a standard one which would return an instance of IRef, a second one which would take an extra callback argument to be called with the results. This doesn&apos;t solve everything though and async versions of LRU and friends would have to be implemented.&lt;/p&gt;

&lt;p&gt;The alternative would be to have additional calls in CacheProtocol, such as async-has? async-lookup which would implement the 2 arity semantics and then rely on the fact that the underlying cache respects some sort of async semantics, since we cannot do that with Associative, maybe another middleman protocol CacheStorage could be used, this way, all external cache providers would have to do is implement a CacheProvider with optional asynchronous support.&lt;/p&gt;

&lt;p&gt;I hope at least part of this makes sense.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15068">CCACHE-14</key>
            <summary>Asynchronous Cache Support</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="pyr">Pierre-Yves Ritschard</reporter>
                        <labels>
                    </labels>
                <created>Tue, 13 Dec 2011 16:33:21 -0600</created>
                <updated>Tue, 13 Dec 2011 16:33:21 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-18] Explore JSR 107- Java Temporary Caching API</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-18</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Is this relevant to core.cache? And many other questions answered.&lt;/p&gt;

&lt;p&gt;&amp;lt;&lt;a href=&quot;http://jcp.org/en/jsr/detail?id=107&quot;&gt;http://jcp.org/en/jsr/detail?id=107&lt;/a&gt;&amp;gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15081">CCACHE-18</key>
            <summary>Explore JSR 107- Java Temporary Caching API</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>jsr-107</label>
                        <label>research</label>
                    </labels>
                <created>Mon, 19 Dec 2011 07:23:32 -0600</created>
                <updated>Mon, 19 Dec 2011 07:23:32 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>
</channel>
</rss>