From 42954c1d7286aa81eeabee6208e365e2a5426662 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jun 2019 10:14:29 +0100 Subject: [PATCH 1/2] Server: document the crazy behaviour of some innocent looking functions --- src/pocketmine/Server.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 600eec22d..0d2d56cdf 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -892,6 +892,11 @@ class Server{ } /** + * Returns an online player whose name begins with or equals the given string (case insensitive). + * The closest match will be returned, or null if there are no online matches. + * + * @see Server::getPlayerExact() + * * @param string $name * * @return Player|null @@ -917,6 +922,8 @@ class Server{ } /** + * Returns an online player with the given name (case insensitive), or null if not found. + * * @param string $name * * @return Player|null @@ -933,6 +940,9 @@ class Server{ } /** + * Returns a list of online players whose names contain with the given string (case insensitive). + * If an exact match is found, only that match is returned. + * * @param string $partialName * * @return Player[] From 862c844759b6a8c17e03993e32b06168df39f199 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 13 Jun 2019 15:11:59 +0100 Subject: [PATCH 2/2] Write PID into lock file --- src/pocketmine/PocketMine.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index 04c07673c..732026434 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -187,12 +187,20 @@ namespace pocketmine { } define('pocketmine\LOCK_FILE_PATH', \pocketmine\DATA . 'server.lock'); - define('pocketmine\LOCK_FILE', fopen(\pocketmine\LOCK_FILE_PATH, "cb")); + define('pocketmine\LOCK_FILE', fopen(\pocketmine\LOCK_FILE_PATH, "a+b")); if(!flock(\pocketmine\LOCK_FILE, LOCK_EX | LOCK_NB)){ - critical_error("Another " . \pocketmine\NAME . " instance is already using this folder (" . realpath(\pocketmine\DATA) . ")."); + //wait for a shared lock to avoid race conditions if two servers started at the same time - this makes sure the + //other server wrote its PID and released exclusive lock before we get our lock + flock(\pocketmine\LOCK_FILE, LOCK_SH); + $pid = stream_get_contents(\pocketmine\LOCK_FILE); + critical_error("Another " . \pocketmine\NAME . " instance (PID $pid) is already using this folder (" . realpath(\pocketmine\DATA) . ")."); critical_error("Please stop the other server first before running a new one."); exit(1); } + ftruncate(\pocketmine\LOCK_FILE, 0); + fwrite(\pocketmine\LOCK_FILE, (string) getmypid()); + fflush(\pocketmine\LOCK_FILE); + flock(\pocketmine\LOCK_FILE, LOCK_SH); //prevent acquiring an exclusive lock from another process, but allow reading //Logger has a dependency on timezone $tzError = Timezone::init();