@@ -24,10 +24,14 @@ LicensesManager::LicensesManager() {}
24
24
25
25
int LicensesManager::Init (
26
26
const std::unordered_map<LicenseId, uint32_t >& lic_id_to_count_map) {
27
- util::read_lock_guard readLock (rw_mutex_);
27
+ HashMap<LicenseId, License> licenses_map;
28
+
28
29
for (auto & [lic_id, count] : lic_id_to_count_map) {
29
- lic_id_to_lic_map_ .insert ({lic_id, License (lic_id, count, 0 , count)});
30
+ licenses_map .insert ({lic_id, License (lic_id, count, 0 , count)});
30
31
}
32
+
33
+ licenses_map_.InitFromMap (std::move (licenses_map));
34
+
31
35
return 0 ;
32
36
}
33
37
@@ -36,73 +40,72 @@ void LicensesManager::GetLicensesInfo(
36
40
crane::grpc::QueryLicensesInfoReply* response) {
37
41
auto * list = response->mutable_license_info_list ();
38
42
43
+ auto licenses_map = licenses_map_.GetMapConstSharedPtr ();
44
+
39
45
if (request->license_name_list ().empty ()) {
40
- util::read_lock_guard readLock (rw_mutex_);
41
- for (auto & [lic_index, lic] : lic_id_to_lic_map_) {
46
+ for (const auto & [lic_index, lic_ptr] : *licenses_map) {
42
47
auto * lic_info = list->Add ();
43
- lic_info->set_name (lic.license_id );
44
- lic_info->set_total (lic.total );
45
- lic_info->set_used (lic.used );
46
- lic_info->set_free (lic.free );
48
+ auto lic = lic_ptr.GetExclusivePtr ();
49
+ lic_info->set_name (lic->license_id );
50
+ lic_info->set_total (lic->total );
51
+ lic_info->set_used (lic->used );
52
+ lic_info->set_free (lic->free );
47
53
}
48
54
} else {
49
- util::read_lock_guard readLock (rw_mutex_);
50
55
for (auto & license_name : request->license_name_list ()) {
51
- auto it = lic_id_to_lic_map_.find (license_name);
52
- if (it != lic_id_to_lic_map_.end ()) {
56
+ if (licenses_map->contains (license_name)) {
53
57
auto * lic_info = list->Add ();
54
- lic_info->set_name (it->second .license_id );
55
- lic_info->set_total (it->second .total );
56
- lic_info->set_used (it->second .used );
57
- lic_info->set_free (it->second .free );
58
+ auto lic = licenses_map->at (license_name).GetExclusivePtr ();
59
+ lic_info->set_name (lic->license_id );
60
+ lic_info->set_total (lic->total );
61
+ lic_info->set_used (lic->used );
62
+ lic_info->set_free (lic->free );
58
63
}
59
64
}
60
65
}
61
66
}
62
67
63
68
bool LicensesManager::CheckLicenseCountSufficient (
64
69
const std::unordered_map<LicenseId, uint32_t >& lic_id_to_count_map) {
65
- util::read_lock_guard readLock (rw_mutex_ );
70
+ auto licenses_map = licenses_map_. GetMapConstSharedPtr ( );
66
71
for (auto & [lic_id, count] : lic_id_to_count_map) {
67
- auto it = lic_id_to_lic_map_.find (lic_id);
68
- if (it == lic_id_to_lic_map_.end () || it->second .free < count) {
69
- return false ;
70
- }
72
+ if (!licenses_map->contains (lic_id)) return false ;
73
+ auto lic = licenses_map->at (lic_id).GetExclusivePtr ();
74
+ if (lic->free < count) return false ;
71
75
}
72
76
73
77
return true ;
74
78
}
75
79
76
80
std::expected<void , std::string> LicensesManager::CheckLicensesLegal (
77
81
const ::google::protobuf::Map<std::string, uint32_t >& lic_id_to_count_map) {
78
- util::read_lock_guard readLock (rw_mutex_ );
82
+ auto licenses_map = licenses_map_. GetMapConstSharedPtr ( );
79
83
for (auto & [lic_id, count] : lic_id_to_count_map) {
80
- auto it = lic_id_to_lic_map_.find (lic_id);
81
- if (it == lic_id_to_lic_map_.end () || count > it->second .total ) {
84
+ if (!licenses_map->contains (lic_id))
85
+ return std::unexpected (" Invalid license specification" );
86
+ auto lic = licenses_map->at (lic_id).GetExclusivePtr ();
87
+ if (count > lic->total )
82
88
return std::unexpected (" Invalid license specification" );
83
- }
84
89
}
85
90
86
91
return {};
87
92
}
88
93
89
94
void LicensesManager::MallocLicenseResource (
90
95
const std::unordered_map<LicenseId, uint32_t >& lic_id_to_count_map) {
91
- util::write_lock_guard writeLock (rw_mutex_);
92
96
for (auto & [lic_id, count] : lic_id_to_count_map) {
93
- auto it = lic_id_to_lic_map_. find ( lic_id) ;
94
- it-> second . used += count;
95
- it-> second . free -= count;
97
+ auto lic = licenses_map_[ lic_id] ;
98
+ lic-> used += count;
99
+ lic-> free -= count;
96
100
}
97
101
}
98
102
99
103
void LicensesManager::FreeLicenseResource (
100
104
const std::unordered_map<LicenseId, uint32_t >& lic_id_to_count_map) {
101
- util::write_lock_guard writeLock (rw_mutex_);
102
105
for (auto & [lic_id, count] : lic_id_to_count_map) {
103
- auto it = lic_id_to_lic_map_. find ( lic_id) ;
104
- it-> second . used -= count;
105
- it-> second . free += count;
106
+ auto lic = licenses_map_[ lic_id] ;
107
+ lic-> used -= count;
108
+ lic-> free += count;
106
109
}
107
110
}
108
111
0 commit comments