- 24 Mar, 2018 8 commits
-
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
* Split setup_globals() from setup_package() and make package setup optional (fork never needs it -- synthetic package already exists in children and the real package exists in masters). * Add main() parameter to allow passing in the existing Importer instance. In forks from children, this means we inherit all the cached module state along with the __loader__ used to import any existing modules.
-
David Wilson authored
This is a hacky layering violation, but it seems the simplest approach for now: fork needs access to Router, in order to recover the existing Importer instance.
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
notice_stream() does that already.
-
- 23 Mar, 2018 7 commits
-
-
David Wilson authored
-
David Wilson authored
Now it's handled in Side() constructor, it can disappear elsewhere.
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
This abstracts the pattern found in parent.ModuleForwarder and to a lesser degree master.ModuleResponser. We can probably use it in those contexts later.
-
David Wilson authored
Not sure why this wasn't done before, seems it should have always been this way, and can't see any reason it wasn't. Without it, many fds are leaked into at least .local() children. Closes #163.
-
- 22 Mar, 2018 4 commits
-
-
David Wilson authored
-
David Wilson authored
It's entirely unclear how test_aborted_on_local_context_disconnect ever passed, but it was broken by the previous commit.
-
David Wilson authored
* IDs are allocated by the parent responsible for contructing a new child, using ALLOCATE_ID to the master as necessary to allocate new ID ranges. * ADD_ROUTE is sent up the tree rather than down. This permits construction of the new context to complete concurrent to parent contexts learning about its existence. Since all streams are strictly ordered, it's not possible for any parent to observe messages from the new context prior to arrival of an ADD_ROUTE from the parent notifying of its existence. If the new context, for example, implements an Ansible async task, its parent can start executing that without waiting for any synchronous confirmation from any parent or the master. * Since routes propagate up, it's no longer possible for a plain non-parent child to ever receive ADD_ROUTE, so that code can be moved out of core.py and into parent.py (-0.2kb compressed). * Add a .routes attribute to parent.Stream, and respond to disconnection signal on the stream by propagating DEL_ROUTE for any ADD_ROUTE ever received from that stream. * Centralize route management in a new parent.RouteMonitor class
-
David Wilson authored
-
- 21 Mar, 2018 8 commits
-
-
David Wilson authored
* Explicitly name every test to run, I have lots of unchecked in stuff * Allow SIGINT to stop the process
-
David Wilson authored
-
David Wilson authored
In order to support a .remove() method, to prevent a minor but annoying (log visible) memory leak while running the tests.
-
David Wilson authored
-
David Wilson authored
Avoids a roundtrip for every fork.
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-
- 20 Mar, 2018 10 commits
-
-
David Wilson authored
* Don't need to sleep if queue>sleepers, can just pop the right queue element and return it. * If queue>sleeping and waking==sleeping, no mechanism existed to ensure a thread newly added to sleeping would ever be woken. Above change fixes that. * Cannot trust select() return value, scheduler might sleep us indefinitely while put() writes a byte. * Sleeping threads didn't pop FIFO, they popped in whatever order scheduler woke them up. Must recover index and use it to pick the pop index.
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
- If latch.get() is called and the queue is empty, a thread is put to sleep. - If Latch.put() from another thread then appends an item to the queue and wakes the sleeping thread, and - If a subsequent Latch.put() from the same or another thread manages to acquire `lock` before the sleeping thread is scheduled, - The sleeping thread's wake socket would have multiple bytes written to it. Therefore create a new _pending variable to track the only item assigned to each thread (keyed by its write socket), and remove the socket from `sleeping` from within put.
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
See new docs
-
David Wilson authored
-
- 19 Mar, 2018 3 commits
-
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-