accessing clipboards should not be synchronized to LocalSession (#653)

* accessing clipboards should not be synchronized to LocalSession
I believe this may be the issue causing thread locks when wrapping new players. If we're attempting to run a synchronised method within the LocalSesison when initialising it, it may go wrong..?

* nullcheck within synchronisation
This commit is contained in:
dordsor21 2020-09-25 15:02:09 +01:00 committed by GitHub
parent 855389c785
commit 65747bf8f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -134,6 +134,7 @@ public class LocalSession implements TextureHolder {
}); });
private transient volatile Integer historyNegativeIndex; private transient volatile Integer historyNegativeIndex;
private transient ClipboardHolder clipboard; private transient ClipboardHolder clipboard;
private transient final Object clipboardLock = new Object();
private transient boolean superPickaxe = false; private transient boolean superPickaxe = false;
private transient BlockTool pickaxeMode = new SinglePickaxe(); private transient BlockTool pickaxeMode = new SinglePickaxe();
private transient final Int2ObjectOpenHashMap<Tool> tools = new Int2ObjectOpenHashMap<>(0); private transient final Int2ObjectOpenHashMap<Tool> tools = new Int2ObjectOpenHashMap<>(0);
@ -767,19 +768,26 @@ public class LocalSession implements TextureHolder {
* @return clipboard * @return clipboard
* @throws EmptyClipboardException thrown if no clipboard is set * @throws EmptyClipboardException thrown if no clipboard is set
*/ */
public synchronized ClipboardHolder getClipboard() throws EmptyClipboardException { public ClipboardHolder getClipboard() throws EmptyClipboardException {
if (clipboard == null) { synchronized (clipboardLock) {
throw new EmptyClipboardException(); if (clipboard == null) {
throw new EmptyClipboardException();
}
return clipboard;
} }
return clipboard;
} }
@Nullable @Nullable
public synchronized ClipboardHolder getExistingClipboard() { public ClipboardHolder getExistingClipboard() {
return clipboard; synchronized (clipboardLock) {
if (clipboard == null) {
return null;
}
return clipboard;
}
} }
public synchronized void addClipboard(@Nonnull MultiClipboardHolder toAppend) { public void addClipboard(@Nonnull MultiClipboardHolder toAppend) {
checkNotNull(toAppend); checkNotNull(toAppend);
ClipboardHolder existing = getExistingClipboard(); ClipboardHolder existing = getExistingClipboard();
MultiClipboardHolder multi; MultiClipboardHolder multi;
@ -804,15 +812,18 @@ public class LocalSession implements TextureHolder {
* *
* @param clipboard the clipboard, or null if the clipboard is to be cleared * @param clipboard the clipboard, or null if the clipboard is to be cleared
*/ */
public synchronized void setClipboard(@Nullable ClipboardHolder clipboard) { public void setClipboard(@Nullable ClipboardHolder clipboard) {
if (this.clipboard == clipboard) return; synchronized (clipboardLock) {
if (this.clipboard == clipboard)
return;
if (this.clipboard != null) { if (this.clipboard != null) {
if (clipboard == null || !clipboard.contains(this.clipboard.getClipboard())) { if (clipboard == null || !clipboard.contains(this.clipboard.getClipboard())) {
this.clipboard.close(); this.clipboard.close();
}
} }
this.clipboard = clipboard;
} }
this.clipboard = clipboard;
} }
/** /**