1414
1515namespace score ::mw::per::kvs {
1616
17+ // Definition of static member variables
18+ std::unordered_map<size_t , std::shared_ptr<Kvs>> KvsBuilder::kvs_instances;
19+ KvsBuilder* KvsBuilder::latest_instance = nullptr ;
20+ std::mutex KvsBuilder::kvs_instances_mutex; // /< Mutex for synchronizing access to KVS instances
21+ std::mutex KvsBuilder::latest_instance_mutex; // /< Mutex for synchronizing access to KVS Builder
22+
1723/* ********************** KVS Builder Implementation *********************/
1824KvsBuilder::KvsBuilder (const InstanceId& instance_id)
1925 : instance_id(instance_id)
2026 , need_defaults(false )
2127 , need_kvs(false )
2228 , directory(" ./data_folder/" ) /* Default Directory */
23- {}
29+ {
30+ std::lock_guard<std::mutex> lock (latest_instance_mutex);
31+ latest_instance = this ;
32+ }
33+
34+ KvsBuilder::~KvsBuilder () {
35+ std::lock (latest_instance_mutex, kvs_instances_mutex);
36+ std::lock_guard<std::mutex> latest_lock (latest_instance_mutex, std::adopt_lock);
37+ std::lock_guard<std::mutex> kvs_instances_lock (kvs_instances_mutex, std::adopt_lock);
38+ if (latest_instance == this ) {
39+ kvs_instances.clear ();
40+ }
41+ }
2442
2543KvsBuilder& KvsBuilder::need_defaults_flag (bool flag) {
2644 need_defaults = flag;
@@ -38,22 +56,38 @@ KvsBuilder& KvsBuilder::dir(std::string&& dir_path) {
3856}
3957
4058
41- score::Result<Kvs> KvsBuilder::build () {
42- score::Result<Kvs> result = score::MakeUnexpected (ErrorCode::UnmappedError);
59+ score::Result<std::shared_ptr<Kvs>> KvsBuilder::build () {
4360
4461 /* Use current directory if empty */
45- if (" " == directory) {
62+ if (directory. empty () ) {
4663 directory = " ./" ;
4764 }
4865
49- result = Kvs::open (
66+ // Lock the mutex before accessing the cache
67+ std::lock_guard<std::mutex> lock (kvs_instances_mutex);
68+
69+ auto it = kvs_instances.find (instance_id.id );
70+ if (it != kvs_instances.end ()) {
71+ /* Return existing instance */
72+ return score::Result<std::shared_ptr<Kvs>>(it->second );
73+ }
74+
75+ auto opened_kvs = Kvs::open (
5076 instance_id,
5177 need_defaults ? OpenNeedDefaults::Required : OpenNeedDefaults::Optional,
5278 need_kvs ? OpenNeedKvs::Required : OpenNeedKvs::Optional,
5379 std::move (directory)
5480 );
5581
56- return result;
82+ if (opened_kvs.has_value ()) {
83+ auto kvs_ptr = std::make_shared<Kvs>(std::move (opened_kvs.value ()));
84+ kvs_instances.insert ({instance_id.id , kvs_ptr});
85+ return score::Result<std::shared_ptr<Kvs>>(kvs_ptr);
86+ }
87+ else {
88+ return score::Result<std::shared_ptr<Kvs>>(score::Unexpected (opened_kvs.error ()));
89+ }
90+
5791}
5892
5993} /* namespace score::mw::per::kvs */
0 commit comments