Compare commits

...

5 Commits

Author SHA1 Message Date
Spottedleaf
80ab57dcbe Rebuild patches 2025-04-03 15:38:29 -07:00
Spottedleaf
7071e24ea7 Update ScheduledTaskThreadPool
1. Make halt() unpark waiting threads
   Fixes https://github.com/PaperMC/Folia/issues/338
2. Make intermediate task parsing steal tasks less aggressively
2025-04-03 15:37:31 -07:00
Spottedleaf
8822da77b7 Update ScheduledTaskThreadPool
1. Adjust insertion last task process time to be the current time.
   This makes fresh inserts to be scheduled fairly with current
   inserts.
2. Always attempt to watch global first task
   This should try to prevent multiple scheduler threads from
   waiting on the same task. If the global first task is our task,
   then we can avoid retrying for the next task.
3. Correctly set runner state to TASKS when parsing intermediate
   tasks. This will prevent the runner from being interrupted
   by notifyTasks.
2025-04-03 15:37:31 -07:00
Spottedleaf
7452818d16 Add new tick region scheduler
The old region scheduler had a few problems:
1. Inability to process intermediate tasks (chunk/packets) leading
   to higher than Paper/Vanilla latencies for task processing
2. Thread swapping: scheduled tasks had no thread preference, which
   lead to them swapping threads which may not be cache efficient

The new scheduler solves both of these issues. The new scheduler
can process intermediate tasks, and combined with the new packet
scheduler this allows packets to be processed at low latency
provided that the scheduler threads are idle or waiting.

The new scheduler will only move a scheduled tick/task to another
scheduling thread provided that its scheduled start is missed by
a specified time (for now, 2ms). This should ensure that thread
swapping only occurs to meet scheduling deadlines.
2025-04-03 15:37:31 -07:00
Spottedleaf
2986741444 Update Paper 2025-04-03 15:34:54 -07:00
8 changed files with 2341 additions and 38 deletions

View File

@ -31,7 +31,7 @@ index 3c768d5ccf490e962d9638e92d4ea7c85670bad8..2dbc9fc268850c85e4e8d38da05586a0
+
}
diff --git a/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java b/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java
index 6dfd51996893ca82b11a540cc18234e0b504f7ba..ff313bf0374c318971860a26f1629f708a5fec26 100644
index 0324ec640d4dd6b1f6287fc2ce9e8a0b3b87d5bf..de5d5399e7f9cf56439ada32f3cc7df3a2e95ef4 100644
--- a/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java
+++ b/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java
@@ -267,6 +267,19 @@ public final class PluginDescriptionFile implements io.papermc.paper.plugin.conf

View File

@ -5,10 +5,10 @@ Subject: [PATCH] Add TPS From Region
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index db47fe6560e1b0c737889698cf52c5c3fb06185f..8fa129f4ddac786fb14bb42fc2a88a9e50020537 100644
index 4eb723afaca049a816d16370b383fa37441eafd4..64694483664c5a7380b1ce7846f2eef59004762f 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
@@ -2982,6 +2982,42 @@ public final class Bukkit {
@@ -2980,6 +2980,42 @@ public final class Bukkit {
return server.isGlobalTickThread();
}
// Paper end - Folia region threading API
@ -52,10 +52,10 @@ index db47fe6560e1b0c737889698cf52c5c3fb06185f..8fa129f4ddac786fb14bb42fc2a88a9e
/**
* @deprecated All methods on this class have been deprecated, see the individual methods for replacements.
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 2eb72a31cc36a41694654da15be5a1f4983aa1bd..4830b0e31c970cbd336f4a5296284f5e9c4a94d8 100644
index 0c1f3053ecb415a6dfbbe283bae8c1f6d8477e9c..a0922805fbee8e064a74115fbf93e9e8a98772cb 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
@@ -2696,4 +2696,34 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@@ -2698,4 +2698,34 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
void allowPausing(@NotNull org.bukkit.plugin.Plugin plugin, boolean value);
// Paper end - API to check if the server is sleeping

View File

@ -12928,7 +12928,7 @@ index 7fa41dea184b01891f45d8e404bc1cba19cf1bcf..43de96cc3c2b1259b1edb5feae3f202d
public boolean isOldChunkAround(ChunkPos pos, int radius) {
diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
index e71c1a564e5d4ac43460f89879ff709ee685706f..6eca15223b92aedac74233db886e2c1248750e2c 100644
index af75f1ca60dc01045f27cb550ac9e3deacf1a1cf..79fe336adf35f4f007461ed050e6301764fe7fc3 100644
--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
@@ -96,6 +96,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
@ -12961,7 +12961,7 @@ index e71c1a564e5d4ac43460f89879ff709ee685706f..6eca15223b92aedac74233db886e2c12
}
@Override
@@ -330,24 +342,8 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
@@ -334,24 +346,8 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
if (this.processedDisconnect) {
return;
}
@ -12988,7 +12988,7 @@ index e71c1a564e5d4ac43460f89879ff709ee685706f..6eca15223b92aedac74233db886e2c12
return;
}
@@ -378,7 +374,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
@@ -382,7 +378,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
this.onDisconnect(disconnectionDetails, leaveMessage); // CraftBukkit - fire quit instantly // Paper - use kick event leave message
this.connection.setReadOnly();
// CraftBukkit - Don't wait
@ -12997,7 +12997,7 @@ index e71c1a564e5d4ac43460f89879ff709ee685706f..6eca15223b92aedac74233db886e2c12
}
// Paper start - add proper async disconnect
@@ -391,19 +387,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
@@ -395,19 +391,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
}
public void disconnectAsync(DisconnectionDetails disconnectionInfo, org.bukkit.event.player.PlayerKickEvent.Cause cause) {
@ -13121,7 +13121,7 @@ index bd07e6a5aa1883786d789ea71711a0c0c0a95c26..09469ad131622158fe5579216fc41642
}
// Spigot end
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index b4a284a0617167fd12e9d9414b17f86c169ba563..3977d5b52c4473ed04019f8e93d7dbf084070a97 100644
index 876d207996724727ca26b139af759eab2e6f4131..a107d9ee24d0e39ce3e3e09bf27af1ea4ae35b96 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -292,10 +292,10 @@ public class ServerGamePacketListenerImpl
@ -13430,7 +13430,7 @@ index b4a284a0617167fd12e9d9414b17f86c169ba563..3977d5b52c4473ed04019f8e93d7dbf0
final String conversationInput = rawMessage;
this.server.processQueue.add(() -> ServerGamePacketListenerImpl.this.getCraftPlayer().acceptConversationInput(conversationInput));
} else if (this.player.getChatVisibility() == ChatVisiblity.SYSTEM) { // Re-add "Command Only" flag check
@@ -2718,8 +2774,25 @@ public class ServerGamePacketListenerImpl
@@ -2720,8 +2776,25 @@ public class ServerGamePacketListenerImpl
// Spigot end
public void switchToConfig() {
@ -13457,7 +13457,7 @@ index b4a284a0617167fd12e9d9414b17f86c169ba563..3977d5b52c4473ed04019f8e93d7dbf0
this.send(ClientboundStartConfigurationPacket.INSTANCE);
this.connection.setupOutboundProtocol(ConfigurationProtocols.CLIENTBOUND);
}
@@ -2744,7 +2817,7 @@ public class ServerGamePacketListenerImpl
@@ -2746,7 +2819,7 @@ public class ServerGamePacketListenerImpl
// Spigot end
this.player.resetLastActionTime();
this.player.setShiftKeyDown(packet.isUsingSecondaryAction());
@ -13466,7 +13466,7 @@ index b4a284a0617167fd12e9d9414b17f86c169ba563..3977d5b52c4473ed04019f8e93d7dbf0
if (!serverLevel.getWorldBorder().isWithinBounds(target.blockPosition())) {
return;
}
@@ -2877,6 +2950,12 @@ public class ServerGamePacketListenerImpl
@@ -2879,6 +2952,12 @@ public class ServerGamePacketListenerImpl
switch (action) {
case PERFORM_RESPAWN:
if (this.player.wonGame) {
@ -13479,7 +13479,7 @@ index b4a284a0617167fd12e9d9414b17f86c169ba563..3977d5b52c4473ed04019f8e93d7dbf0
this.player.wonGame = false;
this.player = this.server.getPlayerList().respawn(this.player, true, Entity.RemovalReason.CHANGED_DIMENSION, RespawnReason.END_PORTAL); // CraftBukkit
this.resetPosition();
@@ -2886,6 +2965,17 @@ public class ServerGamePacketListenerImpl
@@ -2888,6 +2967,17 @@ public class ServerGamePacketListenerImpl
return;
}
@ -13497,7 +13497,7 @@ index b4a284a0617167fd12e9d9414b17f86c169ba563..3977d5b52c4473ed04019f8e93d7dbf0
this.player = this.server.getPlayerList().respawn(this.player, false, Entity.RemovalReason.KILLED, RespawnReason.DEATH); // CraftBukkit
this.resetPosition();
if (this.server.isHardcore()) {
@@ -3462,7 +3552,21 @@ public class ServerGamePacketListenerImpl
@@ -3464,7 +3554,21 @@ public class ServerGamePacketListenerImpl
}
List<String> list = Stream.of(lines).map(ChatFormatting::stripFormatting).collect(Collectors.toList());
// Paper end - Limit client sign length
@ -16327,7 +16327,7 @@ index 9a99b813de8b606fab26c87086a21372e5172ba3..4eeb1017576d23d206a7a47b9e9e74b1
this.igniteForSeconds(1.0F);
}
diff --git a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
index 774ca9e0b56fd175ae246051de762d0c4256ca58..0cfd2c937f93f1acb4afc01251f882710baf2591 100644
index c7ae41b2cbc1eb85a6eb9c16813bd326fb8f49f0..74d600367b0ddba693dcf5afd29a8da1cc202de5 100644
--- a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
+++ b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
@@ -130,6 +130,11 @@ public class FireworkRocketEntity extends Projectile implements ItemSupplier {

File diff suppressed because it is too large Load Diff

View File

@ -413,10 +413,10 @@ index bd68139ae635f2ad7ec8e7a21e0056a139c4c62e..48a43341b17247355a531164019d5cc9
}
diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
index e3a7e6937122413bff911fe1188e3bb0297f6ffa..7f4d1637ae8b7730013cf0901cf7882a5a238e63 100644
index 8b70a8e9b0aacbe7964b0441b5bbbaab228962d8..610abaee663b7573a56c0a0a6dd4ab9c0224b173 100644
--- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
+++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
@@ -402,4 +402,17 @@ public class GlobalConfiguration extends ConfigurationPart {
@@ -403,4 +403,17 @@ public class GlobalConfiguration extends ConfigurationPart {
}
}
}
@ -809,7 +809,7 @@ index a4ac34ebb58a404f4fca7e763e61d4ab05ee3af4..4dcec640f5870d713bd3b98389a45dbe
return new BlockPos(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 99beb7ec6e1864426492f4e27e650ab97ce6d4b5..afe2b5a99d831ddc39fe76d19a2a6cea91fb8ee9 100644
index dfce118ec8b91eae219855a0b01392ef20b7d50c..65d3ce8e2d772f00be6bd652866f7ca4f258e26f 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -317,7 +317,7 @@ public final class CraftServer implements Server {
@ -903,7 +903,7 @@ index 99beb7ec6e1864426492f4e27e650ab97ce6d4b5..afe2b5a99d831ddc39fe76d19a2a6cea
//Preconditions.checkState(!this.console.isIteratingOverLevels, "Cannot unload a world while worlds are being ticked"); // Paper - Cat - Temp disable. We'll see how this goes.
if (world == null) {
return false;
@@ -3085,11 +3124,27 @@ public final class CraftServer implements Server {
@@ -3080,11 +3119,27 @@ public final class CraftServer implements Server {
@Override
public double[] getTPS() {
@ -934,7 +934,7 @@ index 99beb7ec6e1864426492f4e27e650ab97ce6d4b5..afe2b5a99d831ddc39fe76d19a2a6cea
}
// Paper start - adventure sounds
@@ -3260,7 +3315,7 @@ public final class CraftServer implements Server {
@@ -3255,7 +3310,7 @@ public final class CraftServer implements Server {
@Override
public int getCurrentTick() {
@ -944,7 +944,7 @@ index 99beb7ec6e1864426492f4e27e650ab97ce6d4b5..afe2b5a99d831ddc39fe76d19a2a6cea
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 1439d282167dc8a2e66f4896849153b810112988..82d26889661a944e057be0c450fb5a296122ea8e 100644
index a92e0877669a92851c6d7f83de75ffb087c8e651..cd6e46fa68c009deb8dfebcecb88e058dfede0b0 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -227,7 +227,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@ -3212,10 +3212,10 @@ index 9b6ff0f64966c78a3233860bb0840182b52f01bc..fb34651a9e4ed0cb05721d15524a26f8
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
index a396157548a5b3c3e86206c35789bb40346c701c..6e0290c3bce61465f1938263617ae1c90082852d 100644
index ba3b2a60d0ec088e312fc76e31a757a0495a0043..d91f66eb50dd84fbbf2e3b7a4f7cb50885d92acf 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
@@ -306,8 +306,16 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
@@ -309,8 +309,16 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
this.mode = mode;
}
@ -4026,10 +4026,10 @@ index 2638c341bc02f201f7ab17fdebcdbdf3a7ec05bf..074b2919be2b5544b0a46e6cd32f6c57
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 5050f446e75f0ec17daf994ed74cbcd3155664c1..71cb264e399d098f9e40c71258f1412aa0dbafc5 100644
index cc4b2061ae9cbd5a30b297be477cde703203b3f5..ac878520dc4aaa0e6a1ce8de0982d60a8397bc15 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -675,7 +675,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -670,7 +670,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public void kickPlayer(String message) {
@ -4038,7 +4038,7 @@ index 5050f446e75f0ec17daf994ed74cbcd3155664c1..71cb264e399d098f9e40c71258f1412a
this.getHandle().transferCookieConnection.kickPlayer(CraftChatMessage.fromStringOrEmpty(message, true), org.bukkit.event.player.PlayerKickEvent.Cause.PLUGIN); // Paper - kick event cause
}
@@ -693,7 +693,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -688,7 +688,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public void kick(net.kyori.adventure.text.Component message, org.bukkit.event.player.PlayerKickEvent.Cause cause) {
@ -4047,7 +4047,7 @@ index 5050f446e75f0ec17daf994ed74cbcd3155664c1..71cb264e399d098f9e40c71258f1412a
final ServerGamePacketListenerImpl connection = this.getHandle().connection;
if (connection != null) {
connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message, cause);
@@ -1413,6 +1413,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -1408,6 +1408,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public boolean teleport(Location location, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause, io.papermc.paper.entity.TeleportFlag... flags) {
@ -4059,7 +4059,7 @@ index 5050f446e75f0ec17daf994ed74cbcd3155664c1..71cb264e399d098f9e40c71258f1412a
Set<io.papermc.paper.entity.TeleportFlag.Relative> relativeArguments;
Set<io.papermc.paper.entity.TeleportFlag> allFlags;
if (flags.length == 0) {
@@ -2077,7 +2082,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -2072,7 +2077,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
private void unregisterEntity(Entity other) {
// Paper end
ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap;
@ -4068,7 +4068,7 @@ index 5050f446e75f0ec17daf994ed74cbcd3155664c1..71cb264e399d098f9e40c71258f1412a
if (entry != null) {
entry.removePlayer(this.getHandle());
}
@@ -2174,7 +2179,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -2169,7 +2174,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
if (original != null) otherPlayer.setUUID(original); // Paper - uuid override
}
@ -4077,7 +4077,7 @@ index 5050f446e75f0ec17daf994ed74cbcd3155664c1..71cb264e399d098f9e40c71258f1412a
if (entry != null && !entry.seenBy.contains(this.getHandle().connection)) {
entry.updatePlayer(this.getHandle());
}
@@ -2323,9 +2328,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -2318,9 +2323,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return this;
}
@ -4095,7 +4095,7 @@ index 5050f446e75f0ec17daf994ed74cbcd3155664c1..71cb264e399d098f9e40c71258f1412a
}
public void setHandle(final ServerPlayer entity) {
@@ -3354,7 +3366,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -3349,7 +3361,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
{
if ( CraftPlayer.this.getHealth() <= 0 && CraftPlayer.this.isOnline() )
{
@ -5127,7 +5127,7 @@ index dfc2b40e20069705f92d86a6898e3e8348bf4dcd..9e158d32dc13f8890511de1496d9d5b4
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 57c3f8531bf85b53af3a4aad6e9e369d5cff0ce3..b1504bc0f06f930669a8d0787eb420416f7c2671 100644
index bbf44c44c6c3fc4cabad1453ab7aba9ac7ecb1e5..bef7a026676ab59a84fc33c8af50ad2b9447fd8c 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -951,7 +951,7 @@ public class CraftEventFactory {
@ -5148,7 +5148,7 @@ index 57c3f8531bf85b53af3a4aad6e9e369d5cff0ce3..b1504bc0f06f930669a8d0787eb42041
Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled()) {
@@ -2232,7 +2232,7 @@ public class CraftEventFactory {
@@ -2235,7 +2235,7 @@ public class CraftEventFactory {
CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemStack.copyWithCount(1));
org.bukkit.event.block.BlockDispenseEvent event = new org.bukkit.event.block.BlockDispenseEvent(bukkitBlock, craftItem.clone(), CraftVector.toBukkit(to));
@ -5278,7 +5278,7 @@ index 1b60abf5f5951288f6d54f522621472673eada6e..4ea06cb7a9e9db0d7feb0981de900153
return true;
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
index e0d4222a99f22d7130d95cf29b034a98f2f3b76e..48432a7c9df33bae8aa72991843ed61545c64814 100644
index d1351ed25c4de3e4989a47a793047b0614e8d0b2..96c33cf170e6aea8d379f4a46e3004bcc4ff74a8 100644
--- a/src/main/java/org/spigotmc/SpigotConfig.java
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
@@ -182,7 +182,7 @@ public class SpigotConfig {

View File

@ -5,10 +5,10 @@ Subject: [PATCH] Add TPS From Region
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index afe2b5a99d831ddc39fe76d19a2a6cea91fb8ee9..6c2d9c9621f665412f1a8ccc41083fb0e3a07ed5 100644
index 65d3ce8e2d772f00be6bd652866f7ca4f258e26f..ae7ee8c67a71b0bc319d8079094b1806fc3e305a 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -3351,4 +3351,68 @@ public final class CraftServer implements Server {
@@ -3346,4 +3346,68 @@ public final class CraftServer implements Server {
this.console.addPluginAllowingSleep(plugin.getName(), value);
}
// Paper end - API to check if the server is sleeping

View File

@ -0,0 +1,71 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Thu, 20 Mar 2025 11:01:42 -0700
Subject: [PATCH] fixup! Region Threading Base
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index ae7ee8c67a71b0bc319d8079094b1806fc3e305a..1a1d44c2aa89d8c7f9ec431b5b04d4c6e93a9d55 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -3120,7 +3120,7 @@ public final class CraftServer implements Server {
@Override
public double[] getTPS() {
// Folia start - region threading
- ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool.SchedulableTick task = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentTickingTask();
+ io.papermc.paper.threadedregions.ScheduledTaskThreadPool.SchedulableTick task = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentTickingTask();
if (task == null) {
// might be on the shutdown thread, try retrieving the current region
if (io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegion() != null) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index ac878520dc4aaa0e6a1ce8de0982d60a8397bc15..512ef437119041b33b62ef4675bdd1b27fd9a403 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -224,6 +224,47 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
private boolean simplifyContainerDesyncCheck = GlobalConfiguration.get().unsupportedSettings.simplifyRemoteItemMatching;
private long lastSaveTime; // Paper - getLastPlayed replacement API
+ // Folia start - region threading
+ private final ca.spottedleaf.concurrentutil.collection.MultiThreadedQueue<Runnable> packetQueue = new ca.spottedleaf.concurrentutil.collection.MultiThreadedQueue<>();
+ // used only to notify tasks for packets
+ private volatile io.papermc.paper.threadedregions.RegionizedWorldData lastRegion;
+
+ public void stopAcceptingPackets() {
+ this.packetQueue.preventAdds();
+ }
+
+ public void updateRegion(final io.papermc.paper.threadedregions.RegionizedWorldData region) {
+ this.lastRegion = region;
+ if (region != null && this.hasPackets()) {
+ region.regionData.setHasPackets();
+ }
+ }
+
+ public boolean hasPackets() {
+ return !this.packetQueue.isEmpty();
+ }
+
+ public boolean executeOnePacket() {
+ final Runnable run = this.packetQueue.poll();
+ if (run != null) {
+ run.run();
+ return true;
+ }
+ return false;
+ }
+
+ public void addPacket(final Runnable runnable) {
+ if (!this.packetQueue.add(runnable)) {
+ return;
+ }
+
+ final io.papermc.paper.threadedregions.RegionizedWorldData region = this.lastRegion;
+ if (region != null) {
+ region.regionData.setHasPackets();
+ }
+ }
+ // Folia end - region threading
+
public CraftPlayer(CraftServer server, ServerPlayer entity) {
super(server, entity);

View File

@ -2,7 +2,7 @@ group=dev.folia
version=1.21.4-R0.1-SNAPSHOT
mcVersion=1.21.4
paperRef=bb1beda67bfd94632815acc8ac5d68f5a8e3e410
paperRef=9b1798d6438107fdf0d5939b79a8cf71f4d16e2c
org.gradle.configuration-cache=true
org.gradle.caching=true