diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-12-28 16:43:21 +0000 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-12-28 16:43:21 +0000 | 
| commit | e2b7f25abf851cca8ce44c82eff152d724524be7 (patch) | |
| tree | 93fefd9f3547a47b0755e3d6078cdf34d15030e9 | |
| parent | Add support for querying resource pool free count (diff) | |
| download | libadhocutil-e2b7f25abf851cca8ce44c82eff152d724524be7.tar.bz2 libadhocutil-e2b7f25abf851cca8ce44c82eff152d724524be7.tar.xz libadhocutil-e2b7f25abf851cca8ce44c82eff152d724524be7.zip | |
Handle resource creation failure
| -rw-r--r-- | libadhocutil/resourcePool.impl.h | 16 | ||||
| -rw-r--r-- | libadhocutil/unittests/testResourcePool.cpp | 32 | 
2 files changed, 46 insertions, 2 deletions
| diff --git a/libadhocutil/resourcePool.impl.h b/libadhocutil/resourcePool.impl.h index b5d7e2f..dfdd72d 100644 --- a/libadhocutil/resourcePool.impl.h +++ b/libadhocutil/resourcePool.impl.h @@ -193,7 +193,13 @@ namespace AdHoc {  	ResourcePool<R>::get()  	{  		poolSize.wait(); -		return getOne(); +		try { +			return getOne(); +		} +		catch(...) { +			poolSize.notify(); +			throw; +		}  	}  	template <typename R> @@ -203,7 +209,13 @@ namespace AdHoc {  		if (!poolSize.wait(timeout)) {  			throw TimeOutOnResourcePoolT<R>();  		} -		return getOne(); +		try { +			return getOne(); +		} +		catch(...) { +			poolSize.notify(); +			throw; +		}  	}  	template <typename R> diff --git a/libadhocutil/unittests/testResourcePool.cpp b/libadhocutil/unittests/testResourcePool.cpp index 3af149b..d7547d4 100644 --- a/libadhocutil/unittests/testResourcePool.cpp +++ b/libadhocutil/unittests/testResourcePool.cpp @@ -38,6 +38,16 @@ class TRPSmall : public AdHoc::ResourcePool<MockResource> {  		}  }; +class TRPFail : public AdHoc::ResourcePool<MockResource> { +	public: +		TRPFail() : AdHoc::ResourcePool<MockResource>(3, 1) { } +	protected: +		MockResource * createResource() const override +		{ +			throw std::exception(); +		} +}; +  BOOST_AUTO_TEST_CASE ( get )  {  	{ @@ -311,3 +321,25 @@ BOOST_AUTO_TEST_CASE( test )  	}  } +BOOST_AUTO_TEST_CASE( createFail ) +{ +	TRPFail pool; +	BOOST_REQUIRE_EQUAL(0, MockResource::count); +	BOOST_REQUIRE_EQUAL(0, pool.availableCount()); +	BOOST_REQUIRE_EQUAL(0, pool.inUseCount()); +	BOOST_REQUIRE_EQUAL(3, pool.freeCount()); +	BOOST_REQUIRE_THROW(pool.get(), std::exception); +	BOOST_REQUIRE_EQUAL(3, pool.freeCount()); +	BOOST_REQUIRE_THROW(pool.get(0), std::exception); +	BOOST_REQUIRE_EQUAL(3, pool.freeCount()); +	BOOST_REQUIRE_THROW(pool.get(100), std::exception); +	BOOST_REQUIRE_EQUAL(3, pool.freeCount()); +	BOOST_REQUIRE_EQUAL(0, MockResource::count); +	BOOST_REQUIRE_EQUAL(0, pool.availableCount()); +	BOOST_REQUIRE_EQUAL(0, pool.inUseCount()); +	BOOST_REQUIRE_THROW(pool.get(), std::exception); +	BOOST_REQUIRE_EQUAL(3, pool.freeCount()); +	BOOST_REQUIRE_THROW(pool.get(), std::exception); +	BOOST_REQUIRE_EQUAL(3, pool.freeCount()); +} + | 
