|
1 | 1 | --- a/src/main/java/io/papermc/paper/plugin/manager/PaperPermissionManager.java |
2 | 2 | +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperPermissionManager.java |
3 | | -@@ -108,23 +_,33 @@ |
| 3 | +@@ -106,7 +_,7 @@ |
| 4 | + |
| 5 | + |
4 | 6 | @Override |
5 | | - public void subscribeToPermission(@NotNull String permission, @NotNull Permissible permissible) { |
| 7 | +- public void subscribeToPermission(@NotNull String permission, @NotNull Permissible permissible) { |
| 8 | ++ public synchronized void subscribeToPermission(@NotNull String permission, @NotNull Permissible permissible) { // ShreddedPaper - synchronized |
6 | 9 | String name = permission.toLowerCase(java.util.Locale.ENGLISH); |
7 | | -- Map<Permissible, Boolean> map = this.permSubs().computeIfAbsent(name, k -> new WeakHashMap<>()); |
8 | | -- |
9 | | -- map.put(permissible, true); |
10 | | -+ // ShreddedPaper start - thread-safe permission manager |
11 | | -+ this.permSubs().compute(name, (k, map) -> { |
12 | | -+ if (map == null) map = new WeakHashMap<>(); |
13 | | -+ |
14 | | -+ map.put(permissible, true); |
15 | | -+ |
16 | | -+ return map; |
17 | | -+ }); |
18 | | -+ // ShreddedPaper end - thread-safe permission manager |
| 10 | + Map<Permissible, Boolean> map = this.permSubs().computeIfAbsent(name, k -> new WeakHashMap<>()); |
| 11 | + |
| 12 | +@@ -114,7 +_,7 @@ |
19 | 13 | } |
20 | 14 |
|
21 | 15 | @Override |
22 | | - public void unsubscribeFromPermission(@NotNull String permission, @NotNull Permissible permissible) { |
| 16 | +- public void unsubscribeFromPermission(@NotNull String permission, @NotNull Permissible permissible) { |
| 17 | ++ public synchronized void unsubscribeFromPermission(@NotNull String permission, @NotNull Permissible permissible) { // ShreddedPaper - synchronized |
23 | 18 | String name = permission.toLowerCase(java.util.Locale.ENGLISH); |
24 | | -- Map<Permissible, Boolean> map = this.permSubs().get(name); |
25 | | -- |
26 | | -- if (map != null) { |
27 | | -- map.remove(permissible); |
28 | | -- |
29 | | -- if (map.isEmpty()) { |
30 | | -- this.permSubs().remove(name); |
31 | | -+ // ShreddedPaper start - thread-safe permission manager |
32 | | -+ this.permSubs().compute(name, (k, map) -> { |
33 | | -+ if (map != null) { |
34 | | -+ map.remove(permissible); |
35 | | -+ |
36 | | -+ if (map.isEmpty()) { |
37 | | -+ return null; // this.permSubs().remove(name); |
38 | | -+ } |
39 | | - } |
40 | | -- } |
41 | | -+ |
42 | | -+ return map; |
43 | | -+ }); |
44 | | -+ // ShreddedPaper end - thread-safe permission manager |
| 19 | + Map<Permissible, Boolean> map = this.permSubs().get(name); |
| 20 | + |
| 21 | +@@ -141,14 +_,14 @@ |
45 | 22 | } |
46 | 23 |
|
47 | 24 | @Override |
48 | | -@@ -142,22 +_,32 @@ |
| 25 | +- public void subscribeToDefaultPerms(boolean op, @NotNull Permissible permissible) { |
| 26 | ++ public synchronized void subscribeToDefaultPerms(boolean op, @NotNull Permissible permissible) { // ShreddedPaper - synchronized |
| 27 | + Map<Permissible, Boolean> map = this.defSubs().computeIfAbsent(op, k -> new WeakHashMap<>()); |
49 | 28 |
|
50 | | - @Override |
51 | | - public void subscribeToDefaultPerms(boolean op, @NotNull Permissible permissible) { |
52 | | -- Map<Permissible, Boolean> map = this.defSubs().computeIfAbsent(op, k -> new WeakHashMap<>()); |
53 | | -- |
54 | | -- map.put(permissible, true); |
55 | | -+ // ShreddedPaper start - thread-safe permission manager |
56 | | -+ this.defSubs().compute(op, (k, map) -> { |
57 | | -+ if (map == null) map = new WeakHashMap<>(); |
58 | | -+ |
59 | | -+ map.put(permissible, true); |
60 | | -+ |
61 | | -+ return map; |
62 | | -+ }); |
63 | | -+ // ShreddedPaper end - thread-safe permission manager |
| 29 | + map.put(permissible, true); |
64 | 30 | } |
65 | 31 |
|
66 | 32 | @Override |
67 | | - public void unsubscribeFromDefaultPerms(boolean op, @NotNull Permissible permissible) { |
68 | | -- Map<Permissible, Boolean> map = this.defSubs().get(op); |
69 | | -- |
70 | | -- if (map != null) { |
71 | | -- map.remove(permissible); |
72 | | -- |
73 | | -- if (map.isEmpty()) { |
74 | | -- this.defSubs().remove(op); |
75 | | -+ // ShreddedPaper start - thread-safe permission manager |
76 | | -+ this.defSubs().compute(op, (k, map) -> { |
77 | | -+ if (map != null) { |
78 | | -+ map.remove(permissible); |
79 | | -+ |
80 | | -+ if (map.isEmpty()) { |
81 | | -+ return null; // this.defSubs().remove(op); |
82 | | -+ } |
83 | | - } |
84 | | -- } |
85 | | -+ |
86 | | -+ return map; |
87 | | -+ }); |
88 | | -+ // ShreddedPaper end - thread-safe permission manager |
89 | | - } |
| 33 | +- public void unsubscribeFromDefaultPerms(boolean op, @NotNull Permissible permissible) { |
| 34 | ++ public synchronized void unsubscribeFromDefaultPerms(boolean op, @NotNull Permissible permissible) { // ShreddedPaper - synchronized |
| 35 | + Map<Permissible, Boolean> map = this.defSubs().get(op); |
90 | 36 |
|
91 | | - @Override |
| 37 | + if (map != null) { |
0 commit comments