- 26 Mar, 2018 2 commits
-
-
David Wilson authored
-
David Wilson authored
-
- 25 Mar, 2018 13 commits
-
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
Central mechanism for deleting all non-Latch file descriptors belonging to the parent process during fork().
-
David Wilson authored
-
David Wilson authored
Many dragons present!
-
David Wilson authored
-
David Wilson authored
Let us override a class attribute to specify prefix from fork.py, rather than reimplement the same logic.
-
David Wilson authored
TLS destructors are not called after fork, therefore we must explicitly track a global list of free file descriptors, and arrange for that list to explicitly be destroyed from fork.py.
-
David Wilson authored
More hacky layering violations.. force Importer's _context attribute to our new parent.
-
David Wilson authored
-
David Wilson authored
This allows context_by_id() in the master to succeed in returning a Context with a .name matching the context's name, needed for correct logging. Previously this would have logged the empty string, because the master had no mechanism to know the name of a context created by a child.
-
David Wilson authored
-
- 24 Mar, 2018 25 commits
-
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
Mostly just to avoid embarrassing function size, but it may come in useful for testing later.
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
-
David Wilson authored
This is a partial fix to a general problem: deciding which bits of state to keep from the parent, and which to clear out. When forking from a heavily threaded process, there will be 2x$n_threads fds just sitting around doing nothing, due to Latch use in the parent. We can't just close all nonstandard fds post-fork, since user code may be expecting some FDs to be preserved.
-
David Wilson authored
-
David Wilson authored
This permits graceful shutdown of individual contexts, without tearing down everything. Update mitogen.parent.Stream to also wait for the child to exit, to prevent the buildup of zombie processes. This introduces a blocking wait for process exit on the Broker thread, let's see if we can get away with it. Chances are reasonable that it'll cause needless hangs on heavily loaded machines.
-
David Wilson authored
The Context and Router APIs for constructing children and making function calls should be available in every parent context, as user code wants to have access to the same API.
-
David Wilson authored
-
David Wilson authored
nested_test was failing due to the recent change to centralize O_CLOEXEC, since stdout and stderr were being marked as non-inheritable. That meant child processes would start with no stdout/stderr, triggering a race between Waker opening its pipes, and IoLogger dup2'ing its pipes over the stdio handles. Since the stdio handles were closed, Waker would receive one of them as one end of its pipe, and consequently have it overwritten by IoLogger. When IoLogger dups over the top of fd 2, it becomes possible for Waker.on_read() to be called due to pipe's other end to be closed, causing an OSError exception with errno EAGAIN to appear.
-
David Wilson authored
-
David Wilson authored
Any long-running system call may suffer EINTR, so arrange for all IO calls to be wrapped in the restart loop.
-
David Wilson authored
This eliminates Context.on_disconnect() and instead moves its functionality to a signal wired up by ExternalContext.main(). It leaves mitogen.master.Context is in a better condition to move into mitogen.parent where it belongs.
-
David Wilson authored
-
David Wilson authored
-
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
-