diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index 60ebf911e..48910b6d3 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -192,12 +192,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 Timezone::init(); diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 7184bc949..61ac3f04e 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -665,6 +665,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 @@ -690,6 +695,8 @@ class Server{ } /** + * Returns an online player with the given name (case insensitive), or null if not found. + * * @param string $name * * @return Player|null @@ -706,6 +713,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[]