Skip to content

Commit 7051507

Browse files
perf: Remove shared_ptr in defaultRoleManager (#206)
* perf: Remove shared_ptr in defaultRoleManager * Share_ptr will cause performance loss. * Share_ptr may cause circular reference of Roles, which will cause memeory leak. * RoleManager take ownership of the resource, responsible for the application and release of Role*, Role only use this pointer. Signed-off-by: Stonexx <[email protected]> chore: Update include/casbin/rbac/default_role_manager.h Update casbin/rbac/default_role_manager.cpp Update casbin/rbac/default_role_manager.cpp Co-authored-by: Yash Pandey (YP) <[email protected]> * chore: update header align with src file Signed-off-by: Stonexx <[email protected]> Co-authored-by: Yash Pandey (YP) <[email protected]>
1 parent 3e1e242 commit 7051507

File tree

2 files changed

+21
-21
lines changed

2 files changed

+21
-21
lines changed

casbin/rbac/default_role_manager.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
* limitations under the License.
1515
*/
1616

17-
#include "casbin/pch.h"
18-
1917
#ifndef DEFAULT_ROLE_MANAGER_CPP
2018
#define DEFAULT_ROLE_MANAGER_CPP
2119

@@ -24,13 +22,13 @@
2422

2523
namespace casbin {
2624

27-
std::shared_ptr<Role> Role ::NewRole(std::string name) {
28-
auto role = std::make_shared<Role>();
25+
std::unique_ptr<Role> Role :: NewRole(const std::string& name) {
26+
auto role = std::make_unique<Role>();
2927
role->name = name;
3028
return role;
3129
}
3230

33-
void Role ::AddRole(std::shared_ptr<Role> role) {
31+
void Role ::AddRole(Role* role) {
3432
for (int i = 0; i < this->roles.size(); i++) {
3533
if (this->roles[i]->name == role->name)
3634
return;
@@ -39,7 +37,7 @@ void Role ::AddRole(std::shared_ptr<Role> role) {
3937
this->roles.push_back(role);
4038
}
4139

42-
void Role ::DeleteRole(std::shared_ptr<Role> role) {
40+
void Role ::DeleteRole(Role* role) {
4341
for (int i = 0; i < roles.size(); i++) {
4442
if (roles[i]->name == role->name)
4543
roles.erase(roles.begin() + i);
@@ -113,25 +111,26 @@ bool DefaultRoleManager ::HasRole(std::string name) {
113111
return ok;
114112
}
115113

116-
std::shared_ptr<Role> DefaultRoleManager ::CreateRole(std::string name) {
117-
std::shared_ptr<Role> role;
114+
Role* DefaultRoleManager ::CreateRole(const std::string& name) {
115+
Role* role;
118116
bool ok = this->all_roles.find(name) != this->all_roles.end();
119117
if (!ok) {
120118
all_roles[name] = Role ::NewRole(name);
121-
role = all_roles[name];
119+
role = all_roles[name].get();
122120
} else
123-
role = all_roles[name];
121+
role = all_roles[name].get();
124122

125123
if (this->has_pattern) {
126124
for (auto it = this->all_roles.begin(); it != this->all_roles.end(); it++) {
127125
if (this->matching_func(name, it->first) && name != it->first) {
128-
std::shared_ptr<Role> role1;
126+
Role* role1 = nullptr;
129127
bool ok1 = this->all_roles.find(it->first) != this->all_roles.end();
130128
if (!ok1) {
131129
all_roles[it->first] = Role ::NewRole(it->first);
132-
role1 = all_roles[it->first];
130+
role1 = all_roles[it->first].get();
133131
} else
134-
role1 = all_roles[it->first];
132+
role1 = all_roles[it->first].get();
133+
135134
role->AddRole(role1);
136135
}
137136
}
@@ -259,7 +258,7 @@ std::vector<std::string> DefaultRoleManager ::GetUsers(std::string name, std::ve
259258

260259
std::vector<std::string> names;
261260
for (auto it = this->all_roles.begin(); it != this->all_roles.end(); it++) {
262-
auto role = it->second;
261+
auto role = it->second.get();
263262
if (role->HasDirectRole(name))
264263
names.push_back(role->name);
265264
}

include/casbin/rbac/default_role_manager.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919

2020
#include <unordered_map>
2121

22-
#include "./role_manager.h"
22+
#include "casbin/pch.h"
23+
#include "casbin/rbac/role_manager.h"
2324

2425
namespace casbin {
2526

@@ -30,16 +31,16 @@ typedef bool (*MatchingFunc)(const std::string&, const std::string&);
3031
*/
3132
class Role {
3233
private:
33-
std::vector<std::shared_ptr<Role>> roles;
34+
std::vector<Role*> roles;
3435

3536
public:
3637
std::string name;
3738

38-
static std::shared_ptr<Role> NewRole(std::string name);
39+
static std::unique_ptr<Role> NewRole(const std::string& name);
3940

40-
void AddRole(std::shared_ptr<Role> role);
41+
void AddRole(Role* role);
4142

42-
void DeleteRole(std::shared_ptr<Role> role);
43+
void DeleteRole(Role* role);
4344

4445
bool HasRole(std::string name, int hierarchy_level);
4546

@@ -52,14 +53,14 @@ class Role {
5253

5354
class DefaultRoleManager : public RoleManager {
5455
private:
55-
std::unordered_map<std::string, std::shared_ptr<Role>> all_roles;
56+
std::unordered_map<std::string, std::unique_ptr<Role>> all_roles;
5657
bool has_pattern;
5758
int max_hierarchy_level;
5859
MatchingFunc matching_func;
5960

6061
bool HasRole(std::string name);
6162

62-
std::shared_ptr<Role> CreateRole(std::string name);
63+
Role* CreateRole(const std::string& name);
6364

6465
public:
6566
/**

0 commit comments

Comments
 (0)