mirror of
https://github.com/danog/file.git
synced 2024-11-30 04:19:39 +01:00
Ignore double close
This commit is contained in:
parent
d2c1409bf4
commit
8b43826073
@ -88,7 +88,7 @@ class BlockingHandle implements Handle {
|
||||
*/
|
||||
public function close(): Promise {
|
||||
if ($this->fh === null) {
|
||||
throw new ClosedException("The file has already been closed");
|
||||
return new Success;
|
||||
}
|
||||
|
||||
$fh = $this->fh;
|
||||
|
@ -180,7 +180,12 @@ class EioHandle implements Handle {
|
||||
private function onClose($deferred, $result, $req) {
|
||||
if ($result === -1) {
|
||||
$error = \eio_get_last_error($req);
|
||||
$deferred->fail(new StreamException($error));
|
||||
if ($error === "Bad file descriptor") {
|
||||
// Handle is already closed, ignore
|
||||
$deferred->resolve();
|
||||
} else {
|
||||
$deferred->fail(new StreamException("Closing the file failed: " . $error));
|
||||
}
|
||||
} else {
|
||||
$deferred->resolve();
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ namespace Amp\File;
|
||||
use Amp\ByteStream\ClosedException;
|
||||
use Amp\ByteStream\StreamException;
|
||||
use Amp\Coroutine;
|
||||
use Amp\Failure;
|
||||
use Amp\Parallel\Worker\TaskException;
|
||||
use Amp\Parallel\Worker\Worker;
|
||||
use Amp\Parallel\Worker\WorkerException;
|
||||
@ -73,7 +74,11 @@ class ParallelHandle implements Handle {
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function close(): Promise {
|
||||
$this->open = false;
|
||||
if (!$this->writable) {
|
||||
return new Success;
|
||||
}
|
||||
|
||||
$this->writable = false;
|
||||
|
||||
if ($this->worker->isRunning()) {
|
||||
$promise = $this->worker->enqueue(new Internal\FileTask('fclose', [], $this->id));
|
||||
@ -81,6 +86,7 @@ class ParallelHandle implements Handle {
|
||||
return $promise;
|
||||
}
|
||||
|
||||
// FIXME: Should that really return new Success instead of an exception?
|
||||
return new Success;
|
||||
}
|
||||
|
||||
|
@ -223,6 +223,7 @@ class UvHandle implements Handle {
|
||||
$this->poll->listen($deferred->promise());
|
||||
|
||||
\uv_fs_close($this->loop, $this->fh, function ($fh) use ($deferred) {
|
||||
// FIXME: Check for errors
|
||||
$deferred->resolve();
|
||||
});
|
||||
|
||||
|
@ -42,8 +42,6 @@ abstract class HandleTest extends TestCase {
|
||||
$path = Fixture::path() . "/write";
|
||||
/** @var \Amp\File\Handle $handle */
|
||||
$handle = yield File\open($path, "c+");
|
||||
$this->assertSame(0, $handle->tell());
|
||||
yield $handle->write("foo");
|
||||
yield $handle->close();
|
||||
|
||||
$this->expectException(ClosedException::class);
|
||||
@ -51,6 +49,16 @@ abstract class HandleTest extends TestCase {
|
||||
});
|
||||
}
|
||||
|
||||
public function testDoubleClose() {
|
||||
$this->execute(function () {
|
||||
$path = Fixture::path() . "/write";
|
||||
/** @var \Amp\File\Handle $handle */
|
||||
$handle = yield File\open($path, "c+");
|
||||
yield $handle->close();
|
||||
$this->assertNull(yield $handle->close());
|
||||
});
|
||||
}
|
||||
|
||||
public function testWriteAfterEnd() {
|
||||
$this->execute(function () {
|
||||
$path = Fixture::path() . "/write";
|
||||
|
Loading…
Reference in New Issue
Block a user