Title: Add `_PyOnceFlag_CallOnceTimed` · Issue #115229 · python/cpython · GitHub
Open Graph Title: Add `_PyOnceFlag_CallOnceTimed` · Issue #115229 · python/cpython
X Title: Add `_PyOnceFlag_CallOnceTimed` · Issue #115229 · python/cpython
Description: Feature or enhancement Proposal: We may want to call a function once, but only wait for a given amount of time for the function to be called. For example, to extend the join operation in #115190 with a timeout argument, we need to be abl...
Open Graph Description: Feature or enhancement Proposal: We may want to call a function once, but only wait for a given amount of time for the function to be called. For example, to extend the join operation in #115190 wi...
X Description: Feature or enhancement Proposal: We may want to call a function once, but only wait for a given amount of time for the function to be called. For example, to extend the join operation in #115190 wi...
Opengraph URL: https://github.com/python/cpython/issues/115229
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Add `_PyOnceFlag_CallOnceTimed`","articleBody":"# Feature or enhancement\r\n\r\n### Proposal:\r\n\r\nWe may want to call a function once, but only wait for a given amount of time for the function to be called. For example, to extend the `join` operation in https://github.com/python/cpython/pull/115190 with a `timeout` argument, we need to be able to bound the amount of time we wait for the join operation to be called (in addition to how long the join takes once it's been called).\r\n\r\nIt seems like the natural place for such logic to live is in `_PyOnceFlag`, otherwise we would need to duplicate the `_PyOnceFlag` functionality and extend it to support timeouts. That said, I'm not sure how widely applicable this will be, so it may make sense to just duplicate the logic. Assuming we want to support such a use case, I propose adding `_PyOnceFlag_CallOnceTimed` with the following semantics:\r\n\r\n```\r\ntypedef enum {\r\n // Successfully called the function\r\n Py_CALL_ONCE_OK = 0,\r\n\r\n // Called the function, but it failed\r\n Py_CALL_ONCE_FAILED = -1,\r\n\r\n // Timed out waiting to call the function\r\n Py_CALL_ONCE_TIMEOUT = -2,\r\n \r\n // Interrupted while waiting to call the function\r\n Py_CALL_INTR = -3,\r\n } _PyCallOnceTimedResult;\r\n\r\n// Calls `fn` once using `flag`. The `arg` is passed to the call to `fn`.\r\n//\r\n// The `timeout_ns` argument specifies the maximum amount of time to wait for `fn` to be \r\n// called, with -1 indicating an infinite wait.\r\n//\r\n// If `fn` returns 0 (success), then subsequent calls immediately return 0.\r\n// If `fn` returns -1 (failure), then subsequent calls will retry the call.\r\nstatic inline _PyCallOnceTimedResult\r\n_PyOnceFlag_CallOnceTimed(_PyOnceFlag *flag, _Py_once_fn_t *fn, void *arg, _PyTime_t timeout_ns);\r\n```\r\n\r\n\r\n\r\n### Has this already been discussed elsewhere?\r\n\r\nNo response given\r\n\r\n### Links to previous discussion of this feature:\r\n\r\n_No response_","author":{"url":"https://github.com/mpage","@type":"Person","name":"mpage"},"datePublished":"2024-02-09T22:35:20.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":5},"url":"https://github.com/115229/cpython/issues/115229"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:b2468638-689c-f2aa-f32d-c1c9a451c1f3 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 989E:25BB40:89E6:AAF2:696AF7D2 |
| html-safe-nonce | 97ef3a21817633982eccff539142b13102b6da3c787be74d2281fa82b8109b06 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5ODlFOjI1QkI0MDo4OUU2OkFBRjI6Njk2QUY3RDIiLCJ2aXNpdG9yX2lkIjoiODU3MzA2MTU4MjgxODA0Nzk1NCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 8e4aa9aed862c1a5060eecdb17942dbc3862f920fbfc0a3edb064c562a44d9cd |
| hovercard-subject-tag | issue:2127935778 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/115229/issue_layout |
| twitter:image | https://opengraph.githubassets.com/45eebff86169da6ca67097f7bcc0396c563c5c1111905919fcd6e239f4ba7ace/python/cpython/issues/115229 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/45eebff86169da6ca67097f7bcc0396c563c5c1111905919fcd6e239f4ba7ace/python/cpython/issues/115229 |
| og:image:alt | Feature or enhancement Proposal: We may want to call a function once, but only wait for a given amount of time for the function to be called. For example, to extend the join operation in #115190 wi... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | mpage |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5f99f7c1d70f01da5b93e5ca90303359738944d8ab470e396496262c66e60b8d |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 82560a55c6b2054555076f46e683151ee28a19bc |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width