Hi Laurent,

I made an initial stab at a prototype of some cache management classes that I think might aid in maintenance:

http://cr.openjdk.java.net/~flar/MarlinArrayCaches/webrev.00/

Some notes:

- All classes live in the default package as I prototyped them in isolation.

- NetBeans claims they will compile, but I haven't actually compiled them or tested them as this is just a proof of concept template so far.

- No use of Refs anywhere, TBD

- No attempts to share the base array buckets between multiple caches.

- DO_CLEAN_DIRTY and STATS are both handled via delegating wrappers which means they can be present in production code and enabled by a command line variable at runtime with absolutely no performance impact if they aren't used.

- The widen/put interface is common between the Clean and Dirty caches - I did that for simplicity, but in reality you pass in more information to the "Clean" version of those methods in your static methods so we should fix that up. It will likely require different method signatures, and therefore less implementation sharing, between the Clean/Dirty caches, but that is fine if it saves having to clear data unnecessarily. This would also mean that the wrappers for STATS and DO_CLEAN_DIRTY will also need to be duplicated for both variants as well.

- The Int/Float versions of the classes can be auto-generated from the Byte versions with a sed script (included).

I'm envisioning these getting used something like:

MarlinConst:
public CacheGrowthStrategy defaultStrategy = new ExponentialGrowthStrategy(...);

Renderer:
private IntArrayGrowthSource edgeCache =
    IntArrayGrowthCache.getDirtyInstance(defaultStrategy, "Edge Array");
...
// No STAT or CLEAN_DIRTY code needed
edges = edgeCache.getDefaultArray();
...
// No STAT or CLEAN_DIRTY code needed
edges = edgeCache.widen(edges, numused, newsize);
...
// No STAT or CLEAN_DIRTY code needed
edgeCache.putArray(edges);
edges = null;

                        ...jim

Reply via email to