rust ,5#rustc 1.98.1 (48a229cea 2026-09-01)ÁûÊÆÍRLñ.åSÛAúwjL-df1bddb45adbe94bÁ±ò‰<å%Z‰>¸64‡ËV`-2d2ab9fb0fe1def5ÁŠ AtomicUsizeÁ\§Óportable-atomicÁÜôû AtomicWakerÁ ƒ wakerÁWAITINGÁ REGISTERINGÁWAKINGÁ˜  AssertSyncÁregisterÁ wakeÁtakeÁ>ñ8888888´…´…WakerÁµ…ƒ‰…­3‹e]éö  ê ƒ ƒ¦ ì!&ÓŸg‹ýÆ‹ÿ ‹´…    öŸgýÆÿ 0ÁŸ0b01ÁŸ0b10ÁÌàF „àF • <ñFŸ 7¬ŽG$žG Å™Í% ,|ŽG š2řǙș­É™Ê™àË™óG*¤�R{9 Í‚“ ¢Gü¿Fo   ­G´Gü«E‰‹$ÁEÿ`ÿ`V�a¬â`½68ŸœRtŸc“2“2 UnsafeCellÁ•2�ñ.ç–\*=°"�ÓgÓg£”Ÿ ûÊT¯“2ñÅûcF4íš�F›�G<õ˜�G™�Ð<þ–�З�Ù,˜´… Š\á�  ü§�ü>; `futures::task::AtomicWaker` extracted into its own crate.Á?�tC # FeaturesÁR�üVGD This crate adds a feature, `portable-atomic`, which uses a polyfillÁüžHE from the [`portable-atomic`] crate in order to provide functionalityÁüçNK to targets without atomics. See the [`README`] for the [`portable-atomic`]Áü¶0- crate for more information on how to use it.Áç�üëA> [`portable-atomic`]: https://crates.io/crates/portable-atomicÁü­[X [`README`]: https://github.com/taiki-e/portable-atomic/blob/main/README.md#optional-cfgÁü•…ahttps://raw.githubusercontent.com/smol-rs/smol/master/assets/images/logo_fullsize_transparent.pngÁ„¡öl§ ûÎÊÏ“2ñÎûcFÍš�Fß›�G͘�Gß™�ÐÍ–�Ðà—�ÙÍ´… ŠÌ�  š� ´£—L¿‹ä΀ƒ`c?BŒŒ!üÍÓ¡ܪì©ü (.´Ùüµ0- A synchronization primitive for task wakeup.Áæ�üêIF Sometimes the task interested in a given event will change over time.Áü´ NK An `AtomicWaker` can coordinate concurrent notifications with the consumerÁüƒ LI potentially "updating" the underlying task to wake up. This is useful inÁüÐ JG scenarios where a computation completes in another thread and wants toÁü› PM notify the consumer, but the consumer is in the process of being migrated toÁ¼ì  a new logical task.Á„ �üˆ PM Consumers should call `register` before checking the result of a computationÁüÙ JG and producers should call `wake` after producing the computation (thisÁü¤ LI differs from the usual `thread::park` pattern). It is also permitted forÁüñ GD `wake` to be called **before** `register`. This results in a no-op.Á¹�ü½QN A single `AtomicWaker` may be reused for any number of calls to `register` orÁ\� `wake`.Á›�¬Ÿ # Memory orderingÁµ�ü¹JG Calling `register` "acquires" all memory "released" by calls to `wake`Áü„GD before the call to `register`. Later calls to `wake` will wake theÁüÌPM registered waker (on contention this wake might be triggered in `register`).Á��ü¡OL For concurrent calls to `register` (should be avoided) the ordering is onlyÁüñ$! guaranteed for the winning call.Á–�tš # ExamplesÁ©�ü­NK Here is a simple example providing a `Flag` that can be signalled manuallyÁ¬ü when it is ready.Á’�<– ```Áüž  use futures::future::Future;Áü¿41 use futures::task::{Context, Poll, AtomicWaker};Á¼ô use std::sync::Arc;ÁüŒ&# use std::sync::atomic::AtomicBool;Áü³-* use std::sync::atomic::Ordering::Relaxed;Á´á use std::pin::Pin;Áø�”ü struct Inner {ÁÜ� waker: AtomicWaker,ÁÄ« set: AtomicBool,Á,Ä }ÁÊ�¤Î #[derive(Clone)]Áäã struct Flag(Arc);Á€�|„ impl Flag {Áô” pub fn new() -> Self {Áü³! Flag(Arc::new(Inner {ÁüÕ*' waker: AtomicWaker::new(),Áü€,) set: AtomicBool::new(false),Á|­ }))ÁL½ }ÁÇ�ôË pub fn signal(&self) {Áüê,) self.0.set.store(true, Relaxed);Áü—  self.0.waker.wake();ÁL¸í%,™#È�ÔÌ impl Future for Flag {ÁÌç type Output = ();Á��ü…IF fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {ÁüÏA> // quick check to avoid registration if already done.Áü‘)& if self.0.set.load(Relaxed) {Áü»'$ return Poll::Ready(());Álã }Áñ�üõ.+ self.0.waker.register(cx.waker());Á¤�ü¨KH // Need to check condition **after** `register` to avoid a raceÁüôA> // condition that would result in lost notifications.Áü¶)¦)üà Poll::Ready(())Á¤€ } else {Áì• Poll::PendingÁl³‰*LÁí%,Ë™#<Ñ� \䋦 ì!&Ó ”ö,ö  ‹ üŽ ,Ž  À ¤ƒC<‰CŸÄåC\ëCŸœÖD4ÜDŸ„óD‹Ô«EäŠE Create an `AtomicWaker`.Á¸E‹Bÿ ´÷ETýEÿÆÌ÷Eÿ Þ0$‰FÖ0'è0Ö01è0'Ì™FÍü©W%üºG:7 Registers the waker to be notified on calls to `wake`.ÁùG�ü�HKH The new task will take place of any previous tasks that were registeredÁüÑHJG by previous calls to `register`. Any calls to `wake` that happen afterÁü IHE a call to `register` (as defined by the memory ordering rules), willÁüíILI notify the `register` caller's task and deregister the waker from futureÁü¾JIF notifications. Because of this, callers should ensure `register` getsÁüŒKC@ invoked with a new `Waker` **each** time they require a wakeup.ÁÔK�üÜKJG It is safe to call `register` with multiple other threads concurrentlyÁü«LGD calling `wake`. This will result in the `register` caller's currentÁì÷L task being notified once.Á™M�ü¡MKH This function is safe to call concurrently, but this is generally a badÁüñMKH idea. Concurrent calls to `register` will attempt to register differentÁüÁNLI tasks to be notified. One of the callers will win and have its task set,Áü’O>; but there is no guarantee as to which caller will succeed.ÁÕO�tÝOêðO�üøO<9 Here is how `register` is used when implementing a flag.Á¹P�<ÁP� üÍP   üòP4Ê ü«Q&¨!üÖQ-Ø!´ˆRŽ"£R�Œ«R struct Flag {ÁÜÁRÔ"ÄáRø",þR™#ˆS�Ô�S¶'̯SÙ'ÍS�üÕSIˆ(ü£TKH // Register **before** checking `set` to avoid a race conditionÁüóT74 // that would result in lost notifications.Áü¯U,) self.waker.register(cx.waker());ÁàU�üèU'$ if self.set.load(Relaxed) {Áü”V�,¤¸VÅ,ìÑVâ,lóV‰*L…Wí%,“W™#<�W� D°W  ‹  ÍBÿ ¹W $ºWƒ,ÀWÙX���ŸŸUÿþ?”¢~ü”}:7 Calls `wake` on the last `Waker` passed to `register`.ÁÓ}�üÛ}B? If `register` has not been called yet, then this does nothing.Á$©~! !‹þ?Bÿ ®~ $¯~ü–‚#ü‘PM Returns the last `Waker` passed to `register`, so that the user can wake it.Áæ�î�üö[X Sometimes, just waking the AtomicWaker is not fine grained enough. This allows the userÁüÖ€[X to take the waker and then wake it separately, rather than performing both steps in oneÁ”¶� atomic action.ÁÍ��üÕ�<9 If a waker has not been registered, this returns `None`.Á$�‚" "‹ÓBÿ ¢‚ $£‚ä÷Š‹÷¤š‹<�‹‹Bÿ üÕ‹‹ güû‹8þ‹#$% #‹ $€g€gŠ‚gê ûcƒgbufÁûcØ«q¢1È¡%ÀœÜÄœ¯ÅœóƜǜ€Èœó‘¥_¿´Òwþ?ĤĤŤErrorÁ Ñâó:½ÖàMBÿ ‚Œ $ƒŒœ ‰ŒüàŒ ‹ü„� ‹ ÇWÛ ãX ŒŒ Œ! (https://crates.io/crates/portable-atomicÁ>https://github.com/taiki-e/portable-atomic/blob/main/README.mdÁREADMEÁýI¡ÐIÀJýI¡ÐIÀJ¡Z»(èuF=qqÊ¿ôyÌ5.NÓ¦â_ë§™uŒ•rãhtá¿p¥d¹¶…«÷`ua–£©³­:q‘×½àsÚQI 4·+8ÁKÝ. *�æԼÈI$K¤ös�3¸Mn.ïå _í5Qƒ#‡i4o°A{„B6½ÐEì©{ú|f©h½Ægݾ;èÚšÞã§Êô%‡=ªË¨†øÏ¥ÂXòŠ3>+!êØ½3ñÕˆõ“—Ž[æÈu…‰wÎh%’(-'�õ› ˆðU§Éß³VlgUm@ ¹Ãd$2æ’ø'ìÿ]€Z³¥6f?©Ÿ]»0ÆÄ¬;å¥;â’8kq¸ 1£¤ø�uä�âÏ8Ü6 >`%EÐêoÂuz•:úÍ$s } K O V ] ` f l s { ›R Ùò 2F_¹ 22© ï í"#>#Z#‡$š$oÓR,ù"J#“$¦$n´Ýö"6œ¿]¸ µ"!#s#wB H K R Y ] c i o v — Õí.B[µ-¥ é è"#8#T#�$”$§$«$±$¶$»$¿$Æ$E O V ` f l s ” °Ùò 2„»E  œ"#Z#ª$¯$´$¹$½$Ä$Ë$»ç*>N«Ó(ŽæÚ Ø"õ"0#F#h$�$¢$µßø$8H£Á"‚½Î Ë"ï"(#@#[$‰$œ$½ë,@P±*’êÞ Ü"÷"4#H#l$‘$¤$µ�^¹ ¶""#t#�^¹ ¶""#t#ˆI©¤ ¡" #_#ÉAKVöÖ”¨¿ ¯¡µÌ¥¹Ðµ–â à"8#p$÷l®F¹ í">#‡$š$Ì¿¸»ÂÆÊÎÒÖÚÞâæøÿ +8<CTXgkv�…‹�–šž¤ª°¶¼ÂÎVWXYú"K#Î$Z,ÿ"P#“$¦$™ÓÍõaŸ«Xͱþ?± µ Ö Ú Ü Z»(èuF=qšøZÃ`*”£.T.X.|.l.“.ðODHT &@·Þm@ ¹Ã0ÆÄ¬;å[æÈu…‰ã§Êô%‡=ªË¨†øÏ¥Ô¼ÈI$K¤ ÂXòŠ3>+�õ› ˆðUq¸ 1£!wÎh%’(-'d$2æ’ø'ì!êØ½3uz•:ú%§Éß³VlgUÿ]€Z³¥6f©h½Æq‘×½àsÚQ.ïå _í 5Qƒ#‡i4 5.NÓ¦â_ëgݾ;èÚšÞa–£©³­:Ý. *�æ ¹¶…«÷`uI 4·+8ÁK½ÐEì©{ú|f?©Ÿ]»%EÐêoÂ$qÊ¿ôyÌZ»(èuF=q§™uŒ•rñÕˆõ“—Žös�3¸Mn ¥;â’8k ¤ø�uä�"o°A{„B6âÏ8Ü6 >`#ãhtá¿p¥dÿÿÿ r RÿR* ÿÿÿÿÿv}*ÿÿÿÿÿÿÿc( ÿÿÿuÿoS:%>] ÿÿÿÿf89G?5N0ÿÿ2ÿÿÿ r RÿR* ÿÿÿX/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/atomic-waker-1.1.2/src/lib.rsÁM/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/atomic-waker-1.1.2ÁX/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/atomic-waker-1.1.2/src/lib.rsÁ B`Ëÿ—à'ãzëO4ä\l¨�¨�»?HIO1B\ {x>)%$"1JOMKQQKMHR KHQP%O!5'."+- -! JB*(/LB*  &NO:ICMKNQPL8QP*MQP4OQMON7PNOJQJG# MNQMP-PLMCKQPL+$8LMQOOQ9O5NO9G!O!!'"%.* ?POMQNHOL"PPQCA %9+2  NP<1,$" ,F# >[/MFNO1QQPOS##R #ONCM?)OHI)LT*MVRTT>NNN7RS*FLBBB+@C!%DLPQBP'V ?G+ U``A*OK846C$8G$KQ] "?!$ül*ôˆ´†w-:q;%[%2x86_64-unknown-linux-gnuÁÇy‰ sÞ¹m=fȪ~N atomic_wakerÁ-ceab3fbea5b1afbaÁZ»(èuF=q÷iRÀ³üE&°<< $]<&]&&:&LL>>>W::>(&"&&""W(>  &L :>*�ñ rust-end-file