Thanks, Christoph

On Sat, Mar 1, 2008 at 4:21 AM, Christoph Kutzinski <[EMAIL PROTECTED]> wrote:
> As the 'inversed' locking order in evict() is obviously the source of
>  the problems, I would try to avoid calling any _factory methods while
>  holding the 'this' lock.

+1
evict and addObject currently violate this and I think both should be fixed.

>
>  I thinking about something like this:
>
>  public void evict() {
>    CursorableLinkedList tmpPool;
>    Collection connsToEvict = new ArrayList();
>    synchronized(this) {
>      tmpPool = new CursorableLinkedList(_pool);
>    }
>
>    // checking for conns to evict, calling methods on _factory and adding
>    // conns to evict to connsToEvict
>
>    synchronized(this) {
>      // remove conns in connsToEvict from _pool
>      // ignoring conns that are (currently) not in pool
>    }
>   }
>
>  Obviuosly, this doesn't work with the evictionCursor as it is
>  implemented now, so it would require some work on that one.
>

I think something like this might work if we can solve:
1)  Maintaining the cycling behavior of the evictionCursor -  will be
tricky, but should be doable.  2)  "ignoring conns that are
(currently) not in pool" in the second synch block - hard to do
efficiently, but again should be doable
3) when to do _factory.destroyObject - can't do this is the
mid-section because borrowObject could jump in and grab the destroyed
object.  Need some way to prevent that, maybe by locking / marking the
ObjectTimeStampPair.

Phil

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to