From abb85c1dc3ef9e00fcdf4e4235d1f6e7c4dcd556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=8D=9A=20=28Yang=20Bo=29?= Date: Wed, 25 May 2016 12:25:56 +0800 Subject: [PATCH 1/2] Move close operation out of synchronized block This change may enhance performance if close operation take a long time --- src/main/scala/resource/package.scala | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/scala/resource/package.scala b/src/main/scala/resource/package.scala index e2f0dc0..e0e251e 100644 --- a/src/main/scala/resource/package.scala +++ b/src/main/scala/resource/package.scala @@ -105,22 +105,25 @@ package object resource { val resource = new Resource[A] { override def close(r: A): Unit = { - lock.synchronized { + val newValue = lock.synchronized { sharedReference match { case Some((oldReferenceCount, sc)) => if (r != sc) { throw new IllegalArgumentException } - if (oldReferenceCount == 1) { - implicitly[Resource[A]].close(sc) - sharedReference = None + val newValue = if (oldReferenceCount == 1) { + None } else { - sharedReference = Some((oldReferenceCount - 1, sc)) + Some((oldReferenceCount - 1, sc)) } + sharedReference = newValue case None => throw new IllegalStateException } } + if (newValue.isEmpty) { + implicitly[Resource[A]].close(sc) + } } } From f43b46b9145ce29ac1a52ec0b0aa35905225bc97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=8D=9A=20=28Yang=20Bo=29?= Date: Wed, 25 May 2016 12:38:21 +0800 Subject: [PATCH 2/2] Fix compilation error --- src/main/scala/resource/package.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scala/resource/package.scala b/src/main/scala/resource/package.scala index e0e251e..13d2e21 100644 --- a/src/main/scala/resource/package.scala +++ b/src/main/scala/resource/package.scala @@ -117,12 +117,13 @@ package object resource { Some((oldReferenceCount - 1, sc)) } sharedReference = newValue + newValue case None => throw new IllegalStateException } } if (newValue.isEmpty) { - implicitly[Resource[A]].close(sc) + implicitly[Resource[A]].close(r) } } }