Skip to content

Commit f6baf30

Browse files
authored
Synchronize access (#820)
Synchronize access to avoid concurrency bugs And do == class instead of instanceof
1 parent 440a07e commit f6baf30

File tree

1 file changed

+55
-7
lines changed

1 file changed

+55
-7
lines changed

src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.jetbrains.annotations.Nullable;
3333

3434
import java.util.*;
35+
import java.util.concurrent.locks.Lock;
3536

3637
import static com.ldtteam.structurize.api.constants.Constants.UPDATE_FLAG;
3738

@@ -45,6 +46,13 @@
4546
public final class PlacementHandlers
4647
{
4748
public static final List<IPlacementHandler> handlers = new ArrayList<>();
49+
50+
public enum AddType {
51+
BEFORE,
52+
AFTER,
53+
REPLACE
54+
}
55+
4856
static
4957
{
5058
handlers.add(new AirPlacementHandler());
@@ -78,15 +86,51 @@ public final class PlacementHandlers
7886
*/
7987
public static void add(IPlacementHandler handler, Class<?> override)
8088
{
81-
for (int i = 0; i < handlers.size(); i++)
89+
synchronized (handlers)
90+
{
91+
for (int i = 0; i < handlers.size(); i++)
92+
{
93+
if (override == handlers.get(i).getClass())
94+
{
95+
handlers.set(i, handler);
96+
return;
97+
}
98+
}
99+
add(handler);
100+
}
101+
}
102+
103+
/**
104+
* Allows for Adding a Handler before, after or instead of another one.
105+
* @param handler the new handler to add
106+
* @param override the class to match.
107+
* @param addType if before/after/replace.
108+
*/
109+
public static void add(IPlacementHandler handler, Class<?> override, final AddType addType)
110+
{
111+
synchronized (handlers)
82112
{
83-
if (override.isInstance(handlers.get(i)))
113+
for (int i = 0; i < handlers.size(); i++)
84114
{
85-
handlers.set(i, handler);
86-
return;
115+
if (override == handlers.get(i).getClass())
116+
{
117+
switch (addType)
118+
{
119+
case BEFORE:
120+
handlers.add(i - 1, handler);
121+
break;
122+
case AFTER:
123+
handlers.add(i, handler);
124+
break;
125+
case REPLACE:
126+
handlers.set(i, handler);
127+
break;
128+
}
129+
return;
130+
}
87131
}
132+
add(handler);
88133
}
89-
add(handler);
90134
}
91135

92136
/**
@@ -97,8 +141,11 @@ public static void add(IPlacementHandler handler, Class<?> override)
97141
*/
98142
public static void add(IPlacementHandler handler)
99143
{
100-
handlers.add(1, handler);
101-
handlerCache.clear();
144+
synchronized (handlers)
145+
{
146+
handlers.add(1, handler);
147+
handlerCache.clear();
148+
}
102149
}
103150

104151
/**
@@ -136,6 +183,7 @@ public static IPlacementHandler getHandler(final Level world,
136183
Log.getLogger().error("Unable to find any PlacementHandler for {}; this should be impossible.", newState.toString());
137184
return new GeneralBlockPlacementHandler();
138185
}
186+
139187
/**
140188
* Private constructor to hide implicit one.
141189
*/

0 commit comments

Comments
 (0)