2 * Copyright 2014 Facebook, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <folly/experimental/Singleton.h>
23 SingletonVault::~SingletonVault() { destroyInstances(); }
25 void SingletonVault::destroyInstances() {
27 RWSpinLock::ReadHolder rh(&mutex_);
29 CHECK_GE(singletons_.size(), creation_order_.size());
31 for (auto type_iter = creation_order_.rbegin();
32 type_iter != creation_order_.rend();
34 auto type = *type_iter;
35 auto it = singletons_.find(type);
36 CHECK(it != singletons_.end());
37 auto& entry = it->second;
38 std::lock_guard<std::mutex> entry_guard(entry->mutex);
39 if (entry->instance.use_count() > 1) {
40 LOG(ERROR) << "Singleton of type " << type.name() << " has a living "
41 << "reference at destroyInstances time; beware! Raw pointer "
42 << "is " << entry->instance.get() << " with use_count of "
43 << entry->instance.use_count();
45 entry->instance.reset();
46 entry->state = SingletonEntryState::Dead;
47 entry->state_condvar.notify_all();
52 RWSpinLock::WriteHolder wh(&mutex_);
53 creation_order_.clear();
57 SingletonVault* SingletonVault::singleton() {
58 static SingletonVault vault;