Commit ebc33419 authored by Bob Haarman's avatar Bob Haarman Committed by woo

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
parent e26db8a2
/*
* 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 <folly/experimental/SingletonVault_c.h>
#include <folly/experimental/Singleton.h>
#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
/*
* 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
/*
* 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 <folly/experimental/Singleton.h>
#include <folly/experimental/SingletonVault_c.h>
#include <gtest/gtest.h>
#include <thread>
__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<InstanceCounter> counter_singleton(nullptr, nullptr, vault);
SingletonVault_registrationComplete((SingletonVault_t*) vault);
InstanceCounter *counter = folly::Singleton<InstanceCounter>::get(vault);
EXPECT_EQ(instance_counter_instances, 1);
delete vault;
EXPECT_EQ(instance_counter_instances, 0);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment