From cfd436c287f4209d0d994042452ccbb552a6bd28 Mon Sep 17 00:00:00 2001 From: Anand Thakker Date: Tue, 3 Jul 2018 17:17:39 -0400 Subject: [core] Avoid blocking in Thread constructor (#12151) * Introduce AspiringActor, EstablishedActor This pair of objects represents the two-phase (parent-thread / child-thread) construction that's needed to support constructing Thread without blocking until the child thread is up and running. An `AspiringActor` is responsible for: - ownership of the actor's `Mailbox` - allocating the memory for (but *not* constructing) the target object `O` Using these two pieces--the mailbox and a stable address for `O`--an `AspiringActor` can accept messages for the target object, or provide `ActorRef`s that do so, before the object has actually been constructed by the corresponding `EstablishedActor`. (Such messages are queued in the mailbox until after the object is constructed.) This allows for an `AspiringActor` to be created and safely used by a thread other than the one on which the target object will (eventually) live. An `EstablishedActor` is responsible for managing the lifetime of the target object `O` and the open/closed state of the parent's `mailbox`. The `O` object's lifetime is contained by that of its owning `EstablishedActor`: the `EstablishedActor` constructor executes the `O` constructor via "placement new", constructing it at the address provided by the parent `AspiringActor`, and the `~EstablishedActor` destructor similarly executes the `~O` destructor (after closing the mailbox). `EstablishedActor` should therefore live entirely on the thread intended to own `O`. * Remove Actor#{invoke,ask} --- src/mbgl/tile/geometry_tile.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/mbgl/tile/geometry_tile.cpp') diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index af28fe3963..d686d8440b 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -86,7 +86,7 @@ void GeometryTile::setData(std::unique_ptr data_) { pending = true; ++correlationID; - worker.invoke(&GeometryTileWorker::setData, std::move(data_), correlationID); + worker.self().invoke(&GeometryTileWorker::setData, std::move(data_), correlationID); } @@ -112,14 +112,14 @@ void GeometryTile::setLayers(const std::vector>& layers) } ++correlationID; - worker.invoke(&GeometryTileWorker::setLayers, std::move(impls), correlationID); + worker.self().invoke(&GeometryTileWorker::setLayers, std::move(impls), correlationID); } void GeometryTile::setShowCollisionBoxes(const bool showCollisionBoxes_) { if (showCollisionBoxes != showCollisionBoxes_) { showCollisionBoxes = showCollisionBoxes_; ++correlationID; - worker.invoke(&GeometryTileWorker::setShowCollisionBoxes, showCollisionBoxes, correlationID); + worker.self().invoke(&GeometryTileWorker::setShowCollisionBoxes, showCollisionBoxes, correlationID); } } @@ -153,7 +153,7 @@ void GeometryTile::onError(std::exception_ptr err, const uint64_t resultCorrelat } void GeometryTile::onGlyphsAvailable(GlyphMap glyphs) { - worker.invoke(&GeometryTileWorker::onGlyphsAvailable, std::move(glyphs)); + worker.self().invoke(&GeometryTileWorker::onGlyphsAvailable, std::move(glyphs)); } void GeometryTile::getGlyphs(GlyphDependencies glyphDependencies) { @@ -161,7 +161,7 @@ void GeometryTile::getGlyphs(GlyphDependencies glyphDependencies) { } void GeometryTile::onImagesAvailable(ImageMap images, uint64_t imageCorrelationID) { - worker.invoke(&GeometryTileWorker::onImagesAvailable, std::move(images), imageCorrelationID); + worker.self().invoke(&GeometryTileWorker::onImagesAvailable, std::move(images), imageCorrelationID); } void GeometryTile::getImages(ImageRequestPair pair) { -- cgit v1.2.1