Skip to content

Commit

Permalink
thread safety checks in debug
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Aug 28, 2022
1 parent 9345179 commit 1ec9dc5
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 14 deletions.
15 changes: 15 additions & 0 deletions src/main/java/com/denizenscript/denizencore/DenizenCore.java
Expand Up @@ -235,6 +235,21 @@ public static void schedule(Schedulable sched) {
}
}

/** Returns true if called from the thread that DenizenCore understands to be the main thread, or false if on a different thread. */
public static boolean isMainThread() {
return Thread.currentThread().equals(MAIN_THREAD);
}

/** Runs the task immediately if called on main thread, or later if called off-thread. */
public static void runOnMainThread(Runnable run) {
if (isMainThread()) {
run.run();
}
else {
schedule(new OneTimeSchedulable(run, 0));
}
}

/**
* Ran by 'tick' once per second.
*/
Expand Down
Expand Up @@ -56,7 +56,7 @@ else if (context != null && context.script != null) {
echoError(context.script.getContainer(), addedContext, error);
}
else {
DenizenCore.implementation.debugError(addedContext, error);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugError(addedContext, error));
}
}

Expand All @@ -68,64 +68,81 @@ public static void echoError(ScriptContainer script, String addedContext, String
if (script != null) {
addedContext = " <LR>In script '<A>" + script.getName() + "<LR>'" + (addedContext == null ? "" : addedContext);
}
DenizenCore.implementation.debugError(addedContext, error);
final String text = addedContext;
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugError(text, error));
}

public static void echoError(ScriptEntry entry, String error) {
echoError(entry, null, error);
}

public static void echoError(ScriptEntry entry, String addedContext, String error) {
DenizenCore.implementation.debugError(entry, addedContext, error);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugError(entry, addedContext, error));
}

public static void echoError(Throwable ex) {
DenizenCore.implementation.debugException(ex);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugException(ex));
}
public static void echoError(ScriptEntry entry, Throwable error) {
DenizenCore.implementation.debugError(entry, error);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugError(entry, error));
}

public static void verboseLog(String message) {
if (CoreConfiguration.debugVerbose) {
DenizenCore.implementation.debugMessage(message);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugMessage(message));
}
}

public static void log(String message) {
DenizenCore.implementation.debugMessage(message);
if (DenizenCore.isMainThread()) { // Note: 'Log' needs this check to compensate for Stack expectations in Log internals
DenizenCore.implementation.debugMessage(message);
}
else {
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugMessage(message));
}
}

public static void log(String caller, String message) {
DenizenCore.implementation.debugMessage(caller, message);
if (DenizenCore.isMainThread()) { // Note: 'Log' needs this check to compensate for Stack expectations in Log internals
DenizenCore.implementation.debugMessage(caller, message);
}
else {
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugMessage(caller, message));
}
}

public static void log(DebugElement element, String message) {
if (DenizenCore.isMainThread()) { // Note: 'Log' needs this check to compensate for Stack expectations in Log internals
DenizenCore.implementation.debugMessage(element, message);
}
else {
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugMessage(element, message));
}
DenizenCore.implementation.debugMessage(element, message);
}

public static void echoApproval(String message) {
DenizenCore.implementation.debugApproval(message);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugApproval(message));
}

public static void echoDebug(Debuggable entry, String message) {
DenizenCore.implementation.debugEntry(entry, message);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugEntry(entry, message));
}

public static void echoDebug(Debuggable entry, DebugElement element, String message) {
DenizenCore.implementation.debugEntry(entry, element, message);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugEntry(entry, element, message));
}

public static void echoDebug(Debuggable entry, DebugElement element) {
DenizenCore.implementation.debugEntry(entry, element);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugEntry(entry, element));
}

public static void report(Debuggable caller, String name, String message) {
DenizenCore.implementation.debugReport(caller, name, message);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugReport(caller, name, message));
}

public static void report(Debuggable caller, String name, Object... values) {
DenizenCore.implementation.debugReport(caller, name, values);
DenizenCore.runOnMainThread(() -> DenizenCore.implementation.debugReport(caller, name, values));
}

public static boolean shouldDebug(Debuggable caller) {
Expand Down

0 comments on commit 1ec9dc5

Please sign in to comment.