EventCountTest cleanups
[folly.git] / folly / experimental / Singleton.cpp
1 /*
2  * Copyright 2014 Facebook, Inc.
3  *
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
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include <folly/experimental/Singleton.h>
18
19 #include <string>
20
21 namespace folly {
22
23 SingletonVault::~SingletonVault() { destroyInstances(); }
24
25 void SingletonVault::destroyInstances() {
26   std::lock_guard<std::mutex> guard(mutex_);
27   CHECK_GE(singletons_.size(), creation_order_.size());
28
29   for (auto type_iter = creation_order_.rbegin();
30        type_iter != creation_order_.rend();
31        ++type_iter) {
32     auto type = *type_iter;
33     auto it = singletons_.find(type);
34     CHECK(it != singletons_.end());
35     auto& entry = it->second;
36     std::lock_guard<std::mutex> entry_guard(entry->mutex_);
37     if (entry->instance.use_count() > 1) {
38       LOG(ERROR) << "Singleton of type " << type.name() << " has a living "
39                  << "reference at destroyInstances time; beware!  Raw pointer "
40                  << "is " << entry->instance.get() << " with use_count of "
41                  << entry->instance.use_count();
42     }
43     entry->instance.reset();
44     entry->state = SingletonEntryState::Dead;
45   }
46
47   creation_order_.clear();
48 }
49
50 SingletonVault* SingletonVault::singleton() {
51   static SingletonVault vault;
52   return &vault;
53 }
54 }