From 1629453615a412a632d088a687fbc7902fe54197 Mon Sep 17 00:00:00 2001
From: Spigot <noreply+git-spigot@papermc.io>
Date: Sat, 19 Jan 2013 19:22:07 +1100
Subject: [PATCH] Sync free, but still safe reference cache for chunk loading.

By: md_5 <md_5@live.com.au>
---
 ...-free-but-safe-chunk-reference-cache.patch | 38 +++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 CraftBukkit-Patches/0018-Alternate-sync-free-but-safe-chunk-reference-cache.patch

diff --git a/CraftBukkit-Patches/0018-Alternate-sync-free-but-safe-chunk-reference-cache.patch b/CraftBukkit-Patches/0018-Alternate-sync-free-but-safe-chunk-reference-cache.patch
new file mode 100644
index 0000000000..c95e8b22f5
--- /dev/null
+++ b/CraftBukkit-Patches/0018-Alternate-sync-free-but-safe-chunk-reference-cache.patch
@@ -0,0 +1,38 @@
+From 369fd92f61f955ef427c3db66a650458b095f26a Mon Sep 17 00:00:00 2001
+From: Mike Primm <mike@primmhome.com>
+Date: Wed, 16 Jan 2013 15:27:22 -0600
+Subject: [PATCH] Alternate, sync-free-but-safe chunk reference cache
+
+---
+ src/main/java/net/minecraft/server/World.java | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
+index 6e9b13d..e28aa00 100644
+--- a/src/main/java/net/minecraft/server/World.java
++++ b/src/main/java/net/minecraft/server/World.java
+@@ -297,15 +297,13 @@ public abstract class World implements IBlockAccess {
+ 
+     // CraftBukkit start
+     public Chunk getChunkAt(int i, int j) {
+-        Chunk result = null;
+-        synchronized (this.chunkLock) {
+-            if (this.lastChunkAccessed == null || this.lastXAccessed != i || this.lastZAccessed != j) {
+-                this.lastChunkAccessed = this.chunkProvider.getOrCreateChunk(i, j);
+-                this.lastXAccessed = i;
+-                this.lastZAccessed = j;
+-            }
+-            result = this.lastChunkAccessed;
++        //synchronized (this.chunkLock) {
++        Chunk result = this.lastChunkAccessed; // Exploit fact that read is atomic 
++        if (result == null || result.x != i || result.z != j) {
++            result = this.chunkProvider.getOrCreateChunk(i, j);
++            this.lastChunkAccessed = result; // Exploit fact that write is atomic
+         }
++        //}
+         return result;
+     }
+     // CraftBukkit end
+-- 
+1.8.1-rc2
+