From e944524d9d51dfee01f4e5dad5fd3538dd8873b0 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 03 Jul 2013 15:22:12 +0000
Subject: [PATCH] Fix OPENDJ-1049: ReferenceCountedObject can be released twice in some circumstances

---
 opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/ReferenceCountedObject.java |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/ReferenceCountedObject.java b/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/ReferenceCountedObject.java
index 95457c5..0ddc8d5 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/ReferenceCountedObject.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/ReferenceCountedObject.java
@@ -25,6 +25,7 @@
 
 package com.forgerock.opendj.util;
 
+
 /**
  * An object which is lazily created when first referenced, and destroyed when
  * the last reference is released.
@@ -72,9 +73,12 @@
         public void release() {
             T instanceToRelease = null;
             synchronized (lock) {
-                if (value != null && instance == value && --refCount == 0) {
-                    instanceToRelease = value;
-                    instance = null;
+                if (value != null) {
+                    if (instance == value && --refCount == 0) {
+                        // This was the last reference.
+                        instanceToRelease = value;
+                        instance = null;
+                    }
 
                     /*
                      * Force NPE for subsequent get() attempts and prevent
@@ -83,7 +87,6 @@
                     value = null;
                 }
             }
-
             if (instanceToRelease != null) {
                 destroyInstance(instanceToRelease);
             }

--
Gitblit v1.10.0