Skip to content

Commit 0929f3e

Browse files
authored
Merge pull request #159 from wravery/wraptype-shared-mutex
Fix #158
2 parents 41bba0a + f79dda4 commit 0929f3e

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

include/graphqlservice/GraphQLSchema.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "graphqlservice/GraphQLService.h"
1010

1111
#include <initializer_list>
12+
#include <shared_mutex>
1213

1314
namespace graphql {
1415
namespace introspection {
@@ -70,8 +71,10 @@ class Schema : public std::enable_shared_from_this<Schema>
7071
internal::string_view_map<size_t> _typeMap;
7172
std::vector<std::pair<std::string_view, std::shared_ptr<const BaseType>>> _types;
7273
std::vector<std::shared_ptr<const Directive>> _directives;
74+
std::shared_mutex _nonNullWrappersMutex;
7375
internal::sorted_map<std::shared_ptr<const BaseType>, std::shared_ptr<const BaseType>>
7476
_nonNullWrappers;
77+
std::shared_mutex _listWrappersMutex;
7578
internal::sorted_map<std::shared_ptr<const BaseType>, std::shared_ptr<const BaseType>>
7679
_listWrappers;
7780
};

src/GraphQLSchema.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,18 @@ std::shared_ptr<const BaseType> Schema::WrapType(
6464
introspection::TypeKind kind, std::shared_ptr<const BaseType> ofType)
6565
{
6666
auto& wrappers = (kind == introspection::TypeKind::LIST) ? _listWrappers : _nonNullWrappers;
67+
auto& mutex =
68+
(kind == introspection::TypeKind::LIST) ? _listWrappersMutex : _nonNullWrappersMutex;
69+
std::shared_lock shared_lock { mutex };
70+
std::unique_lock unique_lock { mutex, std::defer_lock };
6771
auto itr = wrappers.find(ofType);
6872

6973
if (itr == wrappers.end())
7074
{
75+
// Trade the shared_lock for a unique_lock.
76+
shared_lock.unlock();
77+
unique_lock.lock();
78+
7179
std::tie(itr, std::ignore) = wrappers.emplace(ofType, WrapperType::Make(kind, ofType));
7280
}
7381

0 commit comments

Comments
 (0)