From ebc33419bfee687d5b4d55e6aa942a4af27c91bd Mon Sep 17 00:00:00 2001 From: Bob Haarman Date: Tue, 20 Jan 2015 12:36:40 -0800 Subject: [PATCH] folly: added C interface to SingletonVault Test Plan: fbconfig folly/experimental/test:singletonvault_c_test && fbmake runtests buck test folly/experimental/test:singletonvault_c_test Reviewed By: andrii@fb.com Subscribers: trunkagent, sdwilsh, folly-diffs@ FB internal diff: D1780054 Signature: t1:1780054:1421187023:b18c1d5575b2864b3d3df001a0024b91eb321c46 --- folly/experimental/SingletonVault_c.cpp | 42 +++++++++++++++ folly/experimental/SingletonVault_c.h | 37 ++++++++++++++ .../experimental/test/SingletonVaultCTest.cpp | 51 +++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 folly/experimental/SingletonVault_c.cpp create mode 100644 folly/experimental/SingletonVault_c.h create mode 100644 folly/experimental/test/SingletonVaultCTest.cpp diff --git a/folly/experimental/SingletonVault_c.cpp b/folly/experimental/SingletonVault_c.cpp new file mode 100644 index 00000000..92ac83f5 --- /dev/null +++ b/folly/experimental/SingletonVault_c.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2015 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +SingletonVault_t *SingletonVault_singleton() { + return folly::SingletonVault::singleton(); +} + +void SingletonVault_registrationComplete(SingletonVault_t *vault) { + ((folly::SingletonVault*) vault)->registrationComplete(); +} + +void SingletonVault_destroyInstances(SingletonVault_t *vault) { + ((folly::SingletonVault*) vault)->destroyInstances(); +} + +void SingletonVault_reenableInstances(SingletonVault_t *vault) { + ((folly::SingletonVault*) vault)->reenableInstances(); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/folly/experimental/SingletonVault_c.h b/folly/experimental/SingletonVault_c.h new file mode 100644 index 00000000..da3f5af5 --- /dev/null +++ b/folly/experimental/SingletonVault_c.h @@ -0,0 +1,37 @@ +/* + * Copyright 2015 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Plain C interface to SingletonVault. This facilitates combining programs +// that cannot use C++ (e.g. programs written in C) with libraries that use +// Singleton, by allowing the program to perform the required SingletonVault +// lifecycle calls. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void SingletonVault_t; + +SingletonVault_t *SingletonVault_singleton(); +void SingletonVault_registrationComplete(SingletonVault_t *vault); +void SingletonVault_destroyInstances(SingletonVault_t *vault); +void SingletonVault_reenableInstances(SingletonVault_t *vault); + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/folly/experimental/test/SingletonVaultCTest.cpp b/folly/experimental/test/SingletonVaultCTest.cpp new file mode 100644 index 00000000..e87ff622 --- /dev/null +++ b/folly/experimental/test/SingletonVaultCTest.cpp @@ -0,0 +1,51 @@ +/* + * Copyright 2015 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include + +#include + +__thread long instance_counter_instances = 0; + +class InstanceCounter { + public: + InstanceCounter() { + instance_counter_instances++; + } + + ~InstanceCounter() { + instance_counter_instances--; + } +}; + +TEST(SingletonVault, singletonReturnsSingletonInstance) { + SingletonVault_t *c = SingletonVault_singleton(); + auto *cpp = folly::SingletonVault::singleton(); + EXPECT_EQ(c, cpp); +} + +TEST(SingletonVault, singletonsAreCreatedAndDestroyed) { + auto *vault = new folly::SingletonVault(); + folly::Singleton counter_singleton(nullptr, nullptr, vault); + SingletonVault_registrationComplete((SingletonVault_t*) vault); + InstanceCounter *counter = folly::Singleton::get(vault); + EXPECT_EQ(instance_counter_instances, 1); + delete vault; + EXPECT_EQ(instance_counter_instances, 0); +} -- 2.34.1