sebb wrote:
> On 18/04/2010, Phil Steitz <phil.ste...@gmail.com> wrote:
>> I will revert this if there are objections or failures on other
>>  JDKs.  If there are no objections or failures, I will do the same
>>  for GKOP tests.  All current tests pass for me, but the added
>>  synchronization may make them less sensitive, so we may wish
>>  document lack of thread safety instead and revert.  I can see both
>>  sides of this.
>>
>>  I did not fully synchronize any of the factory methods, even though
>>  for activate and validate in their current form, the effect would be
>>  the same. The reason for this is that we may want to add
>>  configurable latency to these methods and we don't want the waits to
>>  lock the factory.
>>
>>  Thanks in advance for review / comments or even vetos ;)
> 
> I'm not sure that the patch adds anything - only the set() methods are
> synchronised, so the new version is not thread-safe under all
> conditions:
> 
> If set() and get() (implicit in this case, as the fields are read
> directly) can be called from different *active* threads, then synch.
> will also be needed for read accesses to ensure safe publication of
> the value.

My intent was to ensure that the factory methods got consistent data
 on activation.  The direct reads should all be in synch blocks.
> 
> On the other hand, if the set() methods are only ever called before
> the threads that use the instance are created, then there is no need
> to synch. the set() methods as thread start acts as a synch. lock and
> ensures safe publication.

That is in fact the case in the tests now, so could be the change is
pointless.  Thanks for reviewing.

Phil
> 
>>  Phil
>>
>>
>>  pste...@apache.org wrote:
>>  > Author: psteitz
>>  > Date: Sun Apr 18 15:59:27 2010
>>  > New Revision: 935362
>>  >
>>  > URL: http://svn.apache.org/viewvc?rev=935362&view=rev
>>  > Log:
>>  > Made SimpleFactory threadsafe.
>>  >
>>  > Modified:
>>  >     
>> commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java
>>  >
>>  > Modified: 
>> commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java
>>  > URL: 
>> http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java?rev=935362&r1=935361&r2=935362&view=diff
>>  > 
>> ==============================================================================
>>  > --- 
>> commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java
>>  (original)
>>  > +++ 
>> commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java
>>  Sun Apr 18 15:59:27 2010
>>  > @@ -1332,26 +1332,26 @@ public class TestGenericObjectPool exten
>>  >              evenValid = evalid;
>>  >              oddValid = ovalid;
>>  >          }
>>  > -        void setValid(boolean valid) {
>>  > +        public synchronized void setValid(boolean valid) {
>>  >              setEvenValid(valid);
>>  >              setOddValid(valid);
>>  >          }
>>  > -        void setEvenValid(boolean valid) {
>>  > +        public synchronized void setEvenValid(boolean valid) {
>>  >              evenValid = valid;
>>  >          }
>>  > -        void setOddValid(boolean valid) {
>>  > +        public synchronized void setOddValid(boolean valid) {
>>  >              oddValid = valid;
>>  >          }
>>  > -        public void setThrowExceptionOnPassivate(boolean bool) {
>>  > +        public synchronized void setThrowExceptionOnPassivate(boolean 
>> bool) {
>>  >              exceptionOnPassivate = bool;
>>  >          }
>>  > -        public void setMaxActive(int maxActive) {
>>  > +        public synchronized void setMaxActive(int maxActive) {
>>  >              this.maxActive = maxActive;
>>  >          }
>>  > -        public void setDestroyLatency(long destroyLatency) {
>>  > +        public synchronized void setDestroyLatency(long destroyLatency) {
>>  >              this.destroyLatency = destroyLatency;
>>  >          }
>>  > -        public void setMakeLatency(long makeLatency) {
>>  > +        public synchronized void setMakeLatency(long makeLatency) {
>>  >              this.makeLatency = makeLatency;
>>  >          }
>>  >          public Object makeObject() {
>>  > @@ -1365,36 +1365,70 @@ public class TestGenericObjectPool exten
>>  >              if (makeLatency > 0) {
>>  >                  doWait(makeLatency);
>>  >              }
>>  > -            return String.valueOf(makeCounter++);
>>  > +            int counter;
>>  > +            synchronized(this) {
>>  > +                counter = makeCounter++;
>>  > +            }
>>  > +            return String.valueOf(counter);
>>  >          }
>>  >          public void destroyObject(Object obj) throws Exception {
>>  > -            if (destroyLatency > 0) {
>>  > +            boolean wait;
>>  > +            boolean hurl;
>>  > +            synchronized(this) {
>>  > +                wait = destroyLatency > 0;
>>  > +                hurl = exceptionOnDestroy;
>>  > +            }
>>  > +            if (wait) {
>>  >                  doWait(destroyLatency);
>>  >              }
>>  >              synchronized(this) {
>>  >                  activeCount--;
>>  >              }
>>  > -            if (exceptionOnDestroy) {
>>  > +            if (hurl) {
>>  >                  throw new Exception();
>>  >              }
>>  >          }
>>  >          public boolean validateObject(Object obj) {
>>  > -            if (enableValidation) {
>>  > -                return validateCounter++%2 == 0 ? evenValid : oddValid;
>>  > +            boolean validate;
>>  > +            boolean evenTest;
>>  > +            boolean oddTest;
>>  > +            int counter;
>>  > +            synchronized(this) {
>>  > +                validate = enableValidation;
>>  > +                evenTest = evenValid;
>>  > +                oddTest = oddValid;
>>  > +                counter = validateCounter++;
>>  > +            }
>>  > +            if (validate) {
>>  > +                return counter%2 == 0 ? evenTest : oddTest;
>>  >              }
>>  >              else {
>>  >                  return true;
>>  >              }
>>  >          }
>>  >          public void activateObject(Object obj) throws Exception {
>>  > -            if (exceptionOnActivate) {
>>  > -                if (!(validateCounter++%2 == 0 ? evenValid : oddValid)) {
>>  > +            boolean hurl;
>>  > +            boolean evenTest;
>>  > +            boolean oddTest;
>>  > +            int counter;
>>  > +            synchronized(this) {
>>  > +                hurl = exceptionOnActivate;
>>  > +                evenTest = evenValid;
>>  > +                oddTest = oddValid;
>>  > +                counter = validateCounter++;
>>  > +            }
>>  > +            if (hurl) {
>>  > +                if (!(counter%2 == 0 ? evenTest : oddTest)) {
>>  >                      throw new Exception();
>>  >                  }
>>  >              }
>>  >          }
>>  >          public void passivateObject(Object obj) throws Exception {
>>  > -            if(exceptionOnPassivate) {
>>  > +            boolean hurl;
>>  > +            synchronized(this) {
>>  > +                hurl = exceptionOnPassivate;
>>  > +            }
>>  > +            if (hurl) {
>>  >                  throw new Exception();
>>  >              }
>>  >          }
>>  > @@ -1411,23 +1445,23 @@ public class TestGenericObjectPool exten
>>  >          long makeLatency = 0;
>>  >          int maxActive = Integer.MAX_VALUE;
>>  >
>>  > -        public boolean isThrowExceptionOnActivate() {
>>  > +        public synchronized boolean isThrowExceptionOnActivate() {
>>  >              return exceptionOnActivate;
>>  >          }
>>  >
>>  > -        public void setThrowExceptionOnActivate(boolean b) {
>>  > +        public synchronized void setThrowExceptionOnActivate(boolean b) {
>>  >              exceptionOnActivate = b;
>>  >          }
>>  >
>>  > -        public void setThrowExceptionOnDestroy(boolean b) {
>>  > +        public synchronized void setThrowExceptionOnDestroy(boolean b) {
>>  >              exceptionOnDestroy = b;
>>  >          }
>>  >
>>  > -        public boolean isValidationEnabled() {
>>  > +        public synchronized boolean isValidationEnabled() {
>>  >              return enableValidation;
>>  >          }
>>  >
>>  > -        public void setValidationEnabled(boolean b) {
>>  > +        public synchronized void setValidationEnabled(boolean b) {
>>  >              enableValidation = b;
>>  >          }
>>  >
>>  >
>>  >
>>
>>
>>
>> ---------------------------------------------------------------------
>>  To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>>  For additional commands, e-mail: dev-h...@commons.apache.org
>>
>>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to