{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":751496355,"defaultBranch":"master","name":"gunicorn","ownerLogin":"sylt","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2024-02-01T18:13:49.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/1255922?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1726514188.0","currentOid":""},"activityList":{"items":[{"before":"116e6f9034d25461ae96f58a2732bd87ba18ebf0","after":"9968cfc3bdac495621e3e3683f526d2742651d4e","ref":"refs/heads/experiments","pushedAt":"2024-09-17T20:38:08.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Try always respect the graceful_timeout setting\n\nPreviously, a worker could be sent a second signal of the same type\nwithin the graceful timeout, and that could lead to trouble if the\nworker had already terminated; the worker would indicate that it'd got\nterminated by a signal rather than saying that it exited gracefully.","shortMessageHtmlLink":"arbiter: Try always respect the graceful_timeout setting"}},{"before":null,"after":"116e6f9034d25461ae96f58a2732bd87ba18ebf0","ref":"refs/heads/experiments","pushedAt":"2024-09-16T19:16:28.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Try always respect the graceful_timeout setting\n\nPreviously, a worker could be sent a second signal of the same type\nwithin the graceful timeout, and that could lead to trouble if the\nworker had already terminated; the worker would indicate that it'd got\nterminated by a signal rather than saying that it exited gracefully.","shortMessageHtmlLink":"arbiter: Try always respect the graceful_timeout setting"}},{"before":"445c5957209b7d7abed6ccfdb3615277cdbe39db","after":"7ecea2d54437ce9025aacd7f52a361d96cab4125","ref":"refs/heads/master","pushedAt":"2024-09-05T21:37:49.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Add Arbiter:wakeup() method\n\nIt accepts an optional \"due_to_signal\" argument which can be used to\ntell if the wakeup was made because a signal handler needs to be\nexecuted or not.","shortMessageHtmlLink":"arbiter: Add Arbiter:wakeup() method"}},{"before":"4ff9e9b44d39090a677c087b957f73f166cd86fb","after":"445c5957209b7d7abed6ccfdb3615277cdbe39db","ref":"refs/heads/master","pushedAt":"2024-09-04T22:06:28.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Respect timeout when killing workers\n\nPreviously, a worker could end up getting killed twice by SIGTERM,\nwhich could make it end up exiting by a signal, causing an error to be\nemitted.\n\nNow, we try to respect the timeout set for workers, and don't kill\nthem forcefully until it's time.","shortMessageHtmlLink":"arbiter: Respect timeout when killing workers"}},{"before":"7ecea2d54437ce9025aacd7f52a361d96cab4125","after":"4ff9e9b44d39090a677c087b957f73f166cd86fb","ref":"refs/heads/master","pushedAt":"2024-09-03T20:06:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Do basic rate limiting of signals\n\nIn the theoretical case that there are many signals directed to the\narbiter process for whatever reason, this change should keep the\nbacklog of signals fairly short to make the arbiter able to catch up.","shortMessageHtmlLink":"arbiter: Do basic rate limiting of signals"}},{"before":"562344733ffe73bec1ec2de43b275e4660b0d3e5","after":"497ad24ceb20c40a6f3c49281170f392ad0f68d4","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-08-22T20:43:28.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Just decide that socket is blocking.\n* Use time.monotonic() for timeouts in gthread.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":"c1064e7321a6f365bcbe3db429a32ce3b988a9ed","after":"7ecea2d54437ce9025aacd7f52a361d96cab4125","ref":"refs/heads/master","pushedAt":"2024-08-18T10:43:03.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Add Arbiter:wakeup() method\n\nIt accepts an optional \"due_to_signal\" argument which can be used to\ntell if the wakeup was made because a signal handler needs to be\nexecuted or not.","shortMessageHtmlLink":"arbiter: Add Arbiter:wakeup() method"}},{"before":"36bcf513e218f5df25ebca7ddf1519fc5168cc5e","after":"562344733ffe73bec1ec2de43b275e4660b0d3e5","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-08-17T15:32:14.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Just decide that socket is blocking.\n* Use time.monotonic() for timeouts in gthread.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":"bf456c503924cd15a93863917566b23e3b69c531","after":"36bcf513e218f5df25ebca7ddf1519fc5168cc5e","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-07-03T21:34:06.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Just decide that socket is blocking.\n* Use time.monotonic() for timeouts in gthread.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":"1bda38f1f9bfbfff8272da90ac1dfe0325ee7b9f","after":"bf456c503924cd15a93863917566b23e3b69c531","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-07-03T20:35:58.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Just decide that socket is blocking.\n* Use time.monotonic() for timeouts in gthread.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":"12590cd9a58deba31f4686c9045f798b99517328","after":"1bda38f1f9bfbfff8272da90ac1dfe0325ee7b9f","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-06-08T16:19:24.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Just decide that socket is blocking.\n* Use time.monotonic() for timeouts in gthread.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":"5848bc404f4dd2b866afe11dc8da65641b0729ed","after":"c1064e7321a6f365bcbe3db429a32ce3b988a9ed","ref":"refs/heads/master","pushedAt":"2024-06-08T16:15:59.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: clean up main loop\n\n* Look up handlers in __init__() to induce run-time error early on if\n something is wrong.\n\n* Since we now know that all handlers exist, we can simplify the main\n loop in arbiter, in such a way that we don't need to call wakeup().\n\nSo after this commit, the pipe in arbiter is only used to deliver\nwhich signal was sent.","shortMessageHtmlLink":"arbiter: clean up main loop"}},{"before":"04243f3f556b4b647726bce18d70ab0a65241483","after":"12590cd9a58deba31f4686c9045f798b99517328","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-06-08T15:56:01.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Just decide that socket is blocking.\n* Use time.monotonic() for timeouts in gthread.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":"17e7abfde58542185def7aae6136ba9abf9043b8","after":"04243f3f556b4b647726bce18d70ab0a65241483","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-02-18T17:24:01.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Just decide that socket is blocking.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":"ddb1ece82c36a7d09929773083c11ceb9ea39d70","after":"17e7abfde58542185def7aae6136ba9abf9043b8","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-02-18T12:32:32.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Just decide that socket is blocking.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":null,"after":"ddb1ece82c36a7d09929773083c11ceb9ea39d70","ref":"refs/heads/gthread-cleanup","pushedAt":"2024-02-17T23:37:36.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"workers/gthread: Remove locks + one event queue + general cleanup\n\nThe main purpose is to remove complexity from gthread by:\n\n* Removing the lock for handling self._keep and self.poller. This is\n possible since we now do all such manipulation on the main thread\n instead. When a connection is done, it posts a callback through the\n PollableMethodCaller which gets executed on the main thread.\n\n* Having a single event queue (self.poller), as opposed to also\n managing a set of futures. This fixes #3146 (although there are\n more minimal ways of doing it).\n\nThere are other more minor things as well:\n\n* Renaming some variables, e.g. self._keep to self.keepalived_conns.\n* Remove self-explanatory comments (what the code does, not why).\n* Remove fiddling with connection socket block/not blocked.\n\nSome complexity has been added to the shutdown sequence, but hopefully\nfor good reason: it's to make sure that all already accepted\nconnections are served within the grace period.","shortMessageHtmlLink":"workers/gthread: Remove locks + one event queue + general cleanup"}},{"before":null,"after":"dc9dae04e32dc243433cec3f84356ff77adac870","ref":"refs/heads/fix-deadlock","pushedAt":"2024-02-14T23:02:15.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"gthread: Remove locks + general clean-up\n\nThis change-set aims change so that we do everything non-related to\nthe request on the main thread. This way, we can hopefully avoid lots\nof strange race conditions and make it easier to reason about the code.\n\nThis also fixes #3146, but there are leaner ways of doing that.\n\nWork in progress.","shortMessageHtmlLink":"gthread: Remove locks + general clean-up"}},{"before":"11c6970ab9306df221b0067dc13fb981a7bfedf1","after":"5848bc404f4dd2b866afe11dc8da65641b0729ed","ref":"refs/heads/master","pushedAt":"2024-02-07T22:45:51.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: clean up main loop\n\n* Look up handlers in __init__() to induce run-time error early on if\n something is wrong.\n\n* Since we now know that all handlers exist, we can simplify the main\n loop in arbiter, in such a way that we don't need to call wakeup().\n\nSo after this commit, the pipe in arbiter is only used to deliver\nwhich signal was sent.","shortMessageHtmlLink":"arbiter: clean up main loop"}},{"before":"e9122473e5f395c39f5753d7f5b77dc3dae4f235","after":"11c6970ab9306df221b0067dc13fb981a7bfedf1","ref":"refs/heads/master","pushedAt":"2024-02-07T21:40:45.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: clean up main loop\n\n* Look up handlers in __init__() to induce run-time error early on if\n something is wrong.\n\n* Since we now know that all handlers exist, we can simplify the main\n loop in arbiter, in such a way that we don't need to call wakeup().\n\nSo after this commit, the pipe in arbiter is only used to deliver\nwhich signal was sent.","shortMessageHtmlLink":"arbiter: clean up main loop"}},{"before":null,"after":"d332976657d772aa046874d564556d807967edb2","ref":"refs/heads/dont_remove_workers_in_signal_handler","pushedAt":"2024-02-07T20:58:17.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Require methods for all declared signals\n\n... and clean up code, since we know we can't get any unknown signals.","shortMessageHtmlLink":"arbiter: Require methods for all declared signals"}},{"before":"60bca598c7716a18c8eb62ebaa762db5263aa9b2","after":"e9122473e5f395c39f5753d7f5b77dc3dae4f235","ref":"refs/heads/master","pushedAt":"2024-02-04T23:03:08.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: clean up main loop\n\n* Look up handlers in __init__() to induce run-time error early on if\n something is wrong.\n\n* Since we now know that all handlers exist, we can simplify the main\n loop in arbiter, in such a way that we don't need to call wakeup().\n\nSo after this commit, the pipe in arbiter is only used to deliver\nwhich signal was sent.","shortMessageHtmlLink":"arbiter: clean up main loop"}},{"before":"a0633e84385d826f703b8ff8545084d43901eb2a","after":"60bca598c7716a18c8eb62ebaa762db5263aa9b2","ref":"refs/heads/master","pushedAt":"2024-02-04T11:46:05.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Reinstall SIGCHLD as required by some UNIXes\n\nAccording to the python signal documentation[1], SIGCHLD is handled\ndifferently from other signals. Specifically, if the underlying\nimplementation resets the SIGCHLD signal handler, then python won't\nreinstall it (as it does for other signals).\n\nThis behavior doesn't seem to exist for neither Linux nor Mac, but\nperhaps one could argue that it's good practise anyway.\n\n[1] https://docs.python.org/3/library/signal.html","shortMessageHtmlLink":"arbiter: Reinstall SIGCHLD as required by some UNIXes"}},{"before":"0af511557d81f6424d75f88a459c172a8174f5b4","after":"a0633e84385d826f703b8ff8545084d43901eb2a","ref":"refs/heads/master","pushedAt":"2024-02-03T17:00:21.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Reinstall SIGCHLD as required by some UNIXes\n\nAccording to the python signal documentation[1], SIGCHLD is handled\ndifferently from other signals. Specifically, if the underlying\nimplementation resets the SIGCHLD signal handler, then python won't\nreinstall it (as it does for other signals).\n\nThis behavior doesn't seem to exist for neither Linux nor Mac, but\nperhaps one could argue that it's good practise anyway.\n\n[1] https://docs.python.org/3/library/signal.html","shortMessageHtmlLink":"arbiter: Reinstall SIGCHLD as required by some UNIXes"}},{"before":"fb6e5d203f045092be2bacf411ea3e3925139573","after":"0af511557d81f6424d75f88a459c172a8174f5b4","ref":"refs/heads/master","pushedAt":"2024-02-02T17:44:19.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Use waitpid() facilities to handle worker exit status\n\nThis change is meant to handle the return value of waitpid() in a way\nthat is more in line with the man page of said syscall. The changes\ncan be summarized as follows:\n\n* Use os.WIFEXITED and os.WIFSIGNALED to determine what caused\n waitpid() to return, and exactly how a worker may have exited.\n\n* In case of normal termination, use os.WEXITSTATUS() to read the exit\n status (instead of using a hand rolled bit shift). A redundant log\n was removed in this code path.\n\n* In case of termination by a signal, use os.WTERMSIG() to determine\n the signal which caused the worker to terminate. This was buggy\n before, since the WCOREFLAG (0x80) could cause e.g. a SIGSEGV (code\n 11) to be reported as \"code 139\", meaning \"code (0x80 | 11)\".\n\n* Since waitpid() isn't called with WSTOPPED nor WCONTINUED, there's\n no need to have any os.WIFSTOPPED or os.WIFCONTINUED handling.","shortMessageHtmlLink":"arbiter: Use waitpid() facilities to handle worker exit status"}},{"before":"97c695b84ff42a261d67bcacfe3adeeda1fa03b2","after":"fb6e5d203f045092be2bacf411ea3e3925139573","ref":"refs/heads/master","pushedAt":"2024-02-02T15:13:52.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Use waitpid() facilities to handle worker exit status\n\nThis change is meant to handle the return value of waitpid() in a way\nthat is more in line with the man page of said syscall. The changes\ncan be summarized as follows:\n\n* Use os.WIFEXITED and os.WIFSIGNALED to determine what caused\n waitpid() to return, and exactly how a worker may have exited.\n\n* In case of normal termination, use os.WEXITSTATUS() to read the exit\n status (instead of using a hand rolled bit shift). A redundant log\n was removed in this code path.\n\n* In case of termination by a signal, use os.WTERMSIG() to determine\n the signal which caused the worker to terminate. This was buggy\n before, since the WCOREFLAG (0x80) could cause e.g. a SIGSEGV (code\n 11) to be reported as \"code 139\", meaning \"code (0x80 | 11)\".\n\n* Since waitpid() isn't called with WSTOPPED nor WCONTINUED, there's\n no need to have any os.WIFSTOPPED or os.WIFCONTINUED handling.","shortMessageHtmlLink":"arbiter: Use waitpid() facilities to handle worker exit status"}},{"before":"b338f7c22c5d64f1977125778379e303ac7fd7b1","after":"97c695b84ff42a261d67bcacfe3adeeda1fa03b2","ref":"refs/heads/master","pushedAt":"2024-02-02T15:09:23.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Use waitpid() facilities to handle worker exit status\n\nThis change is meant to handle the return value of waitpid() in a way\nthat is more in line with the man page of said syscall. The changes\ncan be summarized as follows:\n\n* Use os.WIFEXITED and os.WIFSIGNALED to determine what caused\n waitpid() to return, and exactly how a worker may have exited.\n\n* In case of normal termination, use os.WEXITSTATUS() to read the exit\n status (instead of using a hand rolled bit shift). A redundant log\n was removed in this code path.\n\n* In case of termination by a signal, use os.WTERMSIG() to determine\n the signal which caused the worker to terminate. This was buggy\n before, since the WCOREFLAG (0x80) could cause e.g. a SIGSEGV (code\n 11) to be reported as \"code 139\", meaning \"code (0x80 | 11)\".\n\n* Since waitpid() isn't called with WSTOPPED nor WCONTINUED, there's\n no need to have any os.WIFSTOPPED or os.WIFCONTINUED handling.","shortMessageHtmlLink":"arbiter: Use waitpid() facilities to handle worker exit status"}},{"before":"2c9c2b74504dfd20e36fd3c5d5aeffe33de2d07f","after":"b338f7c22c5d64f1977125778379e303ac7fd7b1","ref":"refs/heads/master","pushedAt":"2024-02-02T07:30:21.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Use waitpid() facilities to handle worker exit status\n\nThis change is meant to handle the return value of waitpid() in a way\nthat is more in line with the man page of said syscall. The changes\ncan be summarized as follows:\n\n* Use os.WIF(STOPPED|CONTINUED|EXITED|SIGNALED) to determine what\n caused waitpid() to return, and exactly how a worker may have\n exited.\n\n* In case of normal termination, use os.WEXITSTATUS() to read the exit\n status (instead of using a hand rolled bit shift). A redundant log\n was removed in this code path.\n\n* In case of termination by a signal, use os.WTERMSIG() to determine\n the signal which caused the worker to terminate. This was buggy\n before, since the WCOREFLAG (0x80) could cause e.g. a SIGSEGV (code\n 11) to be reported as \"code 139\", meaning \"code (0x80 | 11)\".\n\n* SIGSTOP and SIGCONT are ignored. They are usually used by debuggers\n for stopping/continuing the process as they attach/detatch.","shortMessageHtmlLink":"arbiter: Use waitpid() facilities to handle worker exit status"}},{"before":"88fc4a43152039c28096c8ba3eeadb3fbaa4aff9","after":"2c9c2b74504dfd20e36fd3c5d5aeffe33de2d07f","ref":"refs/heads/master","pushedAt":"2024-02-01T22:24:26.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"sylt","name":null,"path":"/sylt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1255922?s=80&v=4"},"commit":{"message":"arbiter: Use waitpid() facilities to handle worker exit status\n\nThis change is meant to handle the return value of waitpid() in a way\nthat is more in line with the man page of said syscall. The changes\ncan be summarized as follows:\n\n* Use os.WIF(STOPPED|CONTINUED|EXITED|SIGNALED) to determine what\n caused waitpid() to return, and exactly how a worker may have\n exited.\n\n* In case of normal termination, use os.WEXITSTATUS() to read the exit\n status (instead of using a hand rolled bit shift). A redundant log\n was removed in this code path.\n\n* In case of termination by a signal, use os.WTERMSIG() to determine\n the signal which caused the worker to terminate. This was buggy\n before, since the WCOREFLAG (0x80) could cause e.g. a SIGSEGV (code\n 11) to be reported as \"code 139\", meaning \"code (0x80 | 11)\".\n\n* SIGSTOP and SIGCONT are ignored. They are usually used by debuggers\n for stopping/continuing the process as they attach/detatch.","shortMessageHtmlLink":"arbiter: Use waitpid() facilities to handle worker exit status"}}],"hasNextPage":false,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEuPga1gA","startCursor":null,"endCursor":null}},"title":"Activity ยท sylt/gunicorn"}