Commit Graph

15 Commits

Author SHA1 Message Date
Thiago Marcos P. Santos
06f1dc48a2 [core] Make the BackgroundScheduler a singleton
- Do not carry it over everywhere as parameter, it is a shared
  instance anyway and the lifecycle is pretty much the app lifecycle
  from the moment we instantiate a map.
- Rename to BackgroundScheduler because it is a Scheduler that will
  do tasks in the background, we don't make assumptions if it is a
  thread pool or a single thread.
- Most importantly, remove the dependency from `core` on `platform`.
2019-05-10 14:20:38 +03:00
Mikhail Pozdnyakov
b41f39d545 [core] Make ActorRef methods const
So that the lambdas calling these methods do not have to be mutable.
2019-05-10 11:59:02 +03:00
Anand Thakker
cfd436c287 [core] Avoid blocking in Thread<Object> 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<Object> without blocking until the child thread is up and
running.

An `AspiringActor<O>` 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<O>` can accept messages for the target object, or provide
`ActorRef<O>`s that do so, before the object has actually been
constructed by the corresponding `EstablishedActor<O>`.  (Such messages
are queued in the mailbox until after the object is constructed.)

This allows for an `AspiringActor<O>` to be created and safely used by a
thread other than the one on which the target object will (eventually)
live.

An `EstablishedActor<O>` 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<O>`: 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}
2018-07-03 17:17:39 -04:00
Ivo van Dongen
8b9794b1a7 [core] Actor/ActorRef - ask calls to void methods
- allows to wait for execution of void methods as well as non-void methods
2017-09-22 23:33:56 +03:00
Ivo van Dongen
edaa002c3c [core] current scheduler
- Adds a way to set the current scheduler on the thread to be used whenever a mailbox is created that needs to reply on this thread
2017-08-09 12:08:21 +03:00
Ivo van Dongen
68f470fdda [core] make actor self reference optional - again
- uses a different method of constructor selection that also works on Apple clang < 8.2.
2017-08-08 11:36:30 +03:00
Thiago Marcos P. Santos
2dd8ec8854 [core] Removed unused constructor
Not in use at the moment, was causing a compiler error on
Apple LLVM version 8.0.0 (clang-800.0.42.1).

```
src/mbgl/sprite/sprite_loader.cpp:25:11: error: call to constructor of
'Actor<mbgl::SpriteLoaderWorker>' is ambiguous
```
2017-08-07 18:48:42 +03:00
Ivo van Dongen
5ee05a7781 [core] make actor self reference optional 2017-07-24 19:30:02 +03:00
Ivo van Dongen
81e9ed7fdd [core] add ask pattern to actor ref 2017-07-24 19:30:02 +03:00
Ivo van Dongen
a9ac314a5d [core] implement ask pattern in actor 2017-07-24 19:30:02 +03:00
Thiago Marcos P. Santos
515ffa975d [core] Store pointer instead of referect to the Object in ActorRef
GCC complains about implicitly deleted assigment constructor
when trying to do this:

void setResourceTransform(optional<ActorRef<ResourceTransform>> transform) {
    resourceTransform = transform;
}

optional<ActorRef<ResourceTransform>> resourceTransform;
2017-06-26 16:32:21 +03:00
Thiago Marcos P. Santos
54c3ccc37d [core] Make the mbgl/actor headers public
They will be needed by the DefaultFileSource, something that we
also export as public.
2017-06-26 16:32:21 +03:00
Ivo van Dongen
b608d85db7 [core] allow self closing mailbox/actor 2017-05-27 09:25:03 +03:00
John Firebaugh
2c8343aa82 [core] Block in Mailbox::close() until neither receive nor push are in progress
Otherwise, an ActorRef that's in the process of sending a message could attempt to access an invalid Scheduler reference:

      Thread 1                     Thread 2
--------------------------------------------------
 Scheduler::Scheduler
     Actor::Actor
                              weakMailbox.lock()
     Actor::~Actor
 Scheduler::~Scheduler
                               mailbox->push()
                             scheduler.schedule() 💣
2017-05-24 08:19:19 -07:00
John Firebaugh
099a1cb9f1 [core] Move actor/{mailbox,scheduler}.hpp to public include directory
Map constructor takes Scheduler&, and consumers are expected to define an implementation. Therefore the interface must be public.
2017-03-28 13:53:19 +02:00