Files
boc/rust-service/target/debug/deps/libcrossbeam_utils-66e145216f0a822f.rmeta
T

781 lines
289 KiB
Plaintext
Raw Normal View History

rust
c€#rustc 1.96.0 (ac68faa20 2026-05-25)ÁíàÄTËŸ ÜJîÄ)'ß\¥!-3d1337db07d0b3aeÁÀ뉊]!ÜÛê(¹Þ—šên-5be7b69c3ff7b5b8Á¤²XctÔ'ÐÓ©z¨ɽÓ-a4945860e1c53b00Á¤°ð ¾ä-±($²ï=©Ã-7e98a21bfd32b0edÁòÖÀH•‘PIÓHã#£-055f30b747f859b6Árustc_std_workspace_coreÁ­Cçß^ò½èÝ$­Çÿ+Cé-c4878ee60b2242c9ÁŸÃï+Ñ]ŠqB<ÏïW#-8dd1dd90e70d0b6aÁ miniz_oxideÁ€š»J(P>àö÷g\K-1eb618da2918ab7fÁadler2ÁÆ;+Þ®5¥Ìýݰ¦ÛLˆ-f7919172d268e069Á hashbrownÁPäV9ÒÆèÜ"ÊÖVŽ\-0fc2184a5da6723aÁrustc_std_workspace_allocÁs&ØòØy¯s•bæ!‰ýŠ-97e4bf30be240674Á
std_detectÁhŠBîÙºÌI®ËÅš-9dbbf8346ba7ac8bÁrustc_demangleÁûë9´Ç×@Œ’ùXFº-f33013f239bf9f14Ácfg_ifÁÜLhž§Œaã¯>­-0a71c8f33a838301Á addr2lineÁ׎Þ!]8V$É@@-e618e6be60e87ba2ÁgimliÁ¸
°µ~Î1‹Ñt ðÁ€w-1f7768a68858f670ÁobjectÁ
áPÃ?­À¶¼QHJ¥-914cd6a4dbe590d1ÁmemchrÁ›º«8Ór­2Ù $¨ûib-cf21ca6f2bb15dcdÁë
‹ás«LÖ€îâƒ×ɯŒ-ee6f3747e38367f0Á primitiveÁL¥
crossbeam_loomÁtestsÁ,³š impl_consumeÁd•윕켪ü”.µ Öcrossbeam_sanitize_threadÁÌæüÏ1üË6ü‹yü‡~¸ââíÀÅhintÁçatomicÁ 
  
Õ seq_lockÁSeqLockÁ&º(æ (optimistic_readÁ(
validate_readÁ(writeÁSeqLockWriteGuardÁ-lockÁ-º02ã atomic_cellÁ4444444444 4
4 4 4
444
AtomicCellÁE¥E»4H¥4J¥4L¥4N¥4P¥Pæ P
into_innerÁStransmute_copy_by_valÁTSrcÁTDstÁT ConstHackÁWÖ
Wà
WsrcÁWdstÁP is_lock_freeÁPÈPswapÁPas_ptrÁ4`¥`takeÁ4c¥c¬4f¥fcompare_and_swapÁf f¾j4l¥lã4Õ 4impl_arithmeticÁ4 q fetch_andÁq
fetch_nandÁqfetch_orÁq fetch_xorÁ4
v¥v>4 y¥y÷4 |¥|×4
can_transmuteÁ4Ò LENÁLOCKSÁ  4
AtomicUnitÁˆ
4
ЬŠÈŠŠ¡4atomic_is_lock_freeÁ¥4¥4¥4 atomic_swapÁ¥4atomic_compare_exchange_weakÁ¥consumeÁšš
AtomicConsumeÁœValÁœ load_consumeÁšˆš impl_atomicÁ𡥡 cache_paddedÁ¥¥¥¥¥ª¥¥¬¥¥®¥®æ ®©
¥²¥²å²´¥¥¥¹¥¹×¥¼¥¼÷¥¿¥¿×backoffÁÃÃÃÃ
SPIN_LIMITÁà YIELD_LIMITÁÃBackoffÁÉstepÁÃËæ ËresetÁËspinÁËsnoozeÁË is_completedÁÃÑ×ÃÓ>çÖ once_lockÁ××××OnceLockÁÛ¥ÛonceÁÛ»×ߥ×á¥×ã¥ãæ ã get_or_initÁæã
initializeÁèè ã
get_uncheckedÁ×ì¥ìãÖparkerÁïïïïïïïïïï ï
ï ïParkerÁüunparkerÁü_markerÁïï>ïæ parkÁ park_timeoutÁ
park_deadlineÁºinto_rawÁfrom_rawÁïŠ×ïUnparkerÁŒinnerÁïïïunparkÁ´Äï×ïƒïEMPTYÁïPARKEDÁïNOTIFIEDÁïInnerÁºÒ cvarÁï Ÿ÷ŸÖ sharded_lockÁ¢¢¢¢¢¢¢¢¢¢ ¢
¢ ¢ ¢
¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢
NUM_SHARDSÁ¢ShardÁÀÒ À write_guardÁ¢ ShardedLockÁÃ¥ÃshardsÁû¢Ç¥¢É¥¢Ë¥¢Í¥¢Ï¥Ïæ Ñ Ï©
¢Ô¥Ô is_poisonedÁÔget_mutÁÔtry_readÁÔreadÁÔ try_writeÁÔ® ¢Ü¥Ü×ÞLockedPlaceholderÁß
Þá×¢ã¥ã>¢æ¥æ÷¢ 饢
ë¥ëåë´¢ ï¥ï×¢ ò¥ò×¢
õ¥¢÷¥÷ã¢ú¥ú×¢ý¥ý×¢¥å´¢¥¢
current_indexÁ ¢
ThreadIndicesÁmappingÁ free_listÁ
next_indexÁ¢thread_indicesÁTHREAD_INDICESÁinitÁ¢ RegistrationÁÖ thread_idÁ¢ãÖ
wait_groupÁ WaitGroupÁŸñð¡¡Ò ¡ü¥>§æ §waitÁªã¬ƒ®×ÖÖÖÖÖÖÖÖŠ¸¸¸¸¸¸¸¸¸¸ ¸
¸ ¸ ¸ SharedVecÁÆ¥¸ SharedOptionÁÈ¥¸scopeÁÊ'envÁÊÊ£Ê AbortOnPanicÁÎ
ÊÐãÊ Ê Ê ¸ScopeÁÕ÷&ÕhandlesÁÕ$Õʸ¸Û÷&ÛspawnÁÝ'scopeÁÝÝ¥ÛbuilderÁá›(¸ã׸å›(å÷&åÐ å
stack_sizeÁåŽ(êê¥ê ¸î¥¸ð¥¸ScopedJoinHandleÁò(ò¥òhandleÁò òŠòʸù¥ùjoinÁû ùЏúþþþþþƒ¥ƒ as_pthread_tÁƒinto_pthread_tÁ¸¥×4Š fetch_addÁŠ fetch_subÁŠàŠðŠŠŠ fetch_maxÁŠ fetch_minÁ4£+´+àðå+ö+4œ£+œ´+œàœðœœœå+œö+4¥£+¥´+¥à¥ð¥¥¥å+¥ö+4®£+®´+®à®ð®®®å+®ö+4·£+·´+·à·ð···å+·ö+4À£+À´+ÀàÀðÀÀÀå+Àö+4É£+É´+ÉàÉðÉÉÉå+Éö+4Ò£+Ò´+ÒàÒðÒÒÒå+Òö+4Û£+Û´+ÛàÛðÛÛÛå+Ûö+4ä£+ä´+äàäðäääå+äö+4í£+í´+íàíðíííå+íö+šööŸøšúúŸüšþþŸšŸšŸˆšŠŠŸŒšŽŽŸšŸš Ÿ˜š
ššŸœš žžŸ ¡Ÿ¢¥ CachePaddedÁ¤¥¤»¥§¥§ƒ¥ ª¥¥
¬¥¬>¥ ¯¥¯§±ù¥ ³¥¥
µ¥µ¥¸¥¸Ö¢ShardedLockReadGuardÁ»'aÁ»¥»Ò »_guardÁ»Ê¢ShardedLockWriteGuardÁÁç5Á¥ÁÒ ÁÊ¢ REGISTRATIONÁÆ__rust_std_internal_init_fnÁÆ È É__RUST_STD_INTERNAL_VALÁÈ Ë•7¸ScopedThreadBuilderÁÍ(Í÷&Íê&͹(¸Ò›(Ò÷&Ò×*
+
3
]
^
_
b
e
h
i
j
n
r
s
t
u
~
~
~

Œ

Ž
ž
µ
¸
»
»
»
Á
Á
Á
Í
Î
Ï
Ð
Ò
Ò
Ò
æ
è
ë
î












 
¡
Ö
×
Ø
Ù
Ú
Û
Þ
Þ
Þ
â
â
â
é
ë
î
ï
ñ
ñ
ñ
ò
ô
ô
ô
õ
÷
ù
ú
ü
ü
ü
ý
ÿ
ÿ
ÿ

ƒ



«
­
¯
¯
¯
Ê
Ñ
Ú
Ý
ã
ä
ä
ä
ê
î
ð
ù
ý
ƒ






Œ

Ž








˜

š


ž
Ÿ
 
¡
¢
£
¤
¦
§
¨
©
ª
«
¬
­
¯
°
±
²
³
´
µ

¸
¹
º
»
¼
½
¾
¿
Á
Â
Ã
Ä
Å
Æ
Ç
È
Ê
Ë
Ì
Í
Î
Ï
Ð
Ñ
Ó
Ô
Õ
Ö
×
Ø
Ù
Ú
Ü
Ý
Þ
ß
à
á
â
ã
å
æ
ç
è
é
ê
ë
ì
î
ï
ð
ñ
ò
ó
ô
õ
ø
ü


ˆ
Œ


˜
œ
 
¢
©
±
±
·
·
º
Õ
Õ
Õ
œŒ"--º .Ò /ºÕvÕz‹Ô_ÌìEEÌ G»4ãÄÔ–»=Rj¥ åB«½åB¬½åBŒ"åB³åBéåBC¿cåBœ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”&œ¤]¤]V¦]Á‚]üß3ø¤”& Cؤ¤ž4¦»¥¡¼»×ͬäCŠ üH³üHšeüHÐìüHµßüHüHüHÌìüH üHé!üHö!üH¿cüHéüHCÄcüH¿cÉÉüÊÃuV(4;G³ÀJ Ûۣݻ×Þ»×$"zM'øCÌìÿJŒ"ÿJÌìüü¬ýºïþÊï¾
ðῊ<¿³ÙK¿cÙKÌ쌌áñïv˜¼weŠw ¯L¿c¯LدLÌìÃÈţ¢Æ»¢¬3Jd½U+bC ƒM«½ƒM¬½ƒM¿cƒM¿cßßàˆ  Æ…Hã „¡³ƒMéƒMC »»Ë5¾Ò ¢¿6¢ÀÊ¢BFVÚcž^8¥é!µN¿cµNÄcµN ÁÁ—6ÄÒ ¢ÅÊ¢Åw·Ž8€OŒ"«O¿c«OÄc«Oé!«Oö!«OŒ"Ç#Ö¢ã#¢²i4R­¢³ŸŸÀ$ ñÆÔgf¾Œ"çPØçP¿cçPŒ"ÎÎÏ“' WËÆG©!w ÕÕÈ'×Ý'¸Ø$¸Ùʸî)àZym¬8¿cçQ¿cÍÍÁ7Ðê&¸Ñ¹(¸ÿ;x]^²(÷&ÌìòòÃ)õë)¸ö ¸÷ЏøÊ¸å Q¥ãL8€O SŠ*S¿cS2-lÛ÷ÁªŸÐÎH¤áÛÿüŽŒÇÃîòJ¤ßÛŒÉÃé»õÁÚÕðòLÃNÃv¤ÓÉüãÃ¥Ÿy¤æÃ|¤ÑÉŠüŒÜÃáßï»úÁ®ŸãÕÒÍòö¤]ú¤]þ¤]‚¤]†¤]Ф]ޤ]’¤]–¤]š¤]ž¤]¡¤]§¤Œ¬Ÿª¤¯¤³¤µ¤¸¤²¤ë»Á¤Á¿¤ò»ýÁƒòŒ"Ìì- /«½=¬½ ³ é(¿c
œ YØTŠ šeÐìµßé!ö!ÄcŠ*œË
„Ë
ŒÄ ÜÊD>ü±8 & èï)ü…j&&ä
'º„7½4ϱšD¯Eüž&¬®¿
"„®
ñC3D ÂY
`
õ0ÑÛÑÛ MaybeUninitÁÓÛuninitÁÝÔÛ»ÝÍõƒ«%9C¿Ñ ÃüþQ EC ÎÕüÊRåBCÛî0î0
UnsafeCellÁð0»Ì-·}—KEüC£¸[p¸[oCo¹\$„&Üî%
 ”%
TåBC6, ˆ&&ü„SC ¥åBåBA
ø¹7   (üÁ.¬Á
œÁ
ÀÖ
 /¬Ú
œÚ
Àà
 /o îð ï üØ!oüØ!Z´‰" "
 
-
4Œ‰"
¼å_
E  VϢdk
sy
àW@ 
 ˜ ž"
° Wå_˜` ±" ÜÃÛÃÛ ManuallyDropÁÅÛ»¬µÜÀ,%*˜`ü®!¨
 Ä®!
½˜`L . Õ" ß"à"üÍ 0 T1 ˜`Šå_ýæ`°ÊDˆÊD]ÎàbêWWê
Zˆ4[4 YB¹D‡Rxå_˜` ÃÛÃÛìaÅÛ»¬µÜÀ,%*å_På_PˆÁÔ€0
 Ā0
C% 0\üÒ/N$ñ/„™:T™:ú\!
(¤:
û0¸[8,¤: ¨:ä™:
 $ª:
¸[C{\ª: ´:»:_üê9QðH4ˆ: åB,þ9 ¸[Ç ú\ÉBü­‡,œ®‡
Œ®‡
À0œÅ‡
ŒÅ‡
À0r ؇ ü܇.¤Ý‡
”݇
ʈi-¤õ‡
”õ‡
ʼi-l ‰ˆ ü­‡] "(Œˆü¤†è$ƆcÊDaÊD5êÊDçÊD½DCÊD67ÁtÙ”
dÙ”
)(üÈ” 
 „È”
°þYQ- ç”ü¨”A¤¤ž4¦»¥¡¼»×ͬäþY¤±”þY¾]CÊDLENÁCÊDLENÁø˜Î^ið˜Ñ^
à˜Ñ^
Cˆˆ¨ —ñ˜2zÁÅ¿TZ˜‚_$ê› ˜¶_
¨˜·_ æ`4:ø™Î^ið™Ñ^
à™Ñ^
CE17‚_ ¯·¶_ 
T·_ æ`4:øšÎ^i
ðšÑ^ 
àšÑ^
CùE 17  š_
[dš¶_

 
š·_
 æ`4 :
ø›Î^ið›Ñ^
à›Ñ^
CçF
17 _ ¶_
°·_ æ`4:øœÎ^iðœÑ^
àœÑ^
CÕG
17œ‚_·Àœ¶_
^ œ·_ æ`4:,ð› ×eù›ü©›Pø˜þ^9ø™þ^9øšþ^9ø›þ^9øœþ^9$Λæ`Oæ`ø˜ð^G Ãn½æ`fbø™ð^G ‹E3æ`ßÛøšð^G ùE¬æ`VRø›ð^G çF#æ`ÍÉøœð^G ÕGš_aÁ^Ýv» Ýv
ÝvyÝv×M ·4ì4 ¤C ¹4À4°üê3VüHt„4C û3Cg¿4”G
”G10Á

þ8'üÓ&¬ã
ϋ
òC+8
?²[IZ øüšj ÛC ƒŠåüîœÿJ$‹ï8ï8OnceÁð8ñé8ãTPàVçaú\ó¸[ñ]ÊDÊDÊDÊDùê·e
éê·e
¾¦PùêÕúeÈÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¦P ¦P’}²âùéfaÆ®®£°ñ¨it§ÅLS¶¦Páé¢faZÈ’}’}ùêðe
éêðe
ЦP17ùꦮe
 ÉïE—}ª~æ`0’} ê¿eùêíÔeùê‚!­e
 ËïE¡€æ`%} ê!eQ êÀ$eùêÛôeÈ’} ÉïE¡€æ`îËïE¡€æ`¦V¥ÃÖ¸íÀë ž4\‘¤ÂüÉÕü¸ü30 Miscellaneous tools for concurrent programming.Á4út8 ## AtomicsÁGúüK<9 * [`AtomicCell`], a thread-safe mutable memory location.ÁüˆYV * [`AtomicConsume`], for reading from primitive atomic types with "consume" ordering.Áâúìæ ## Thread synchronizationÁúüˆ-* * [`Parker`], a thread parking primitive.Áü¶OL * [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads.Áü†PM * [`WaitGroup`], for synchronizing the beginning or end of some computation.Á×ú„Û
## UtilitiesÁìúüð96 * [`Backoff`], for exponential backoff in spin loops.ÁüªVS * [`CachePadded`], for padding and aligning a value to the length of a cache line.ÁüQN * [`scope`], for spawning threads that borrow local variables from the stack.ÁÓúü×&# [`AtomicCell`]: atomic::AtomicCellÁüþ,) [`AtomicConsume`]: atomic::AtomicConsumeÁä« [`Parker`]: sync::ParkerÁüÈ&# [`ShardedLock`]: sync::ShardedLockÁüï" [`WaitGroup`]: sync::WaitGroupÁä’ [`scope`]: thread::scopeÁüï ü™6¥ÃÖ¸íüÀýž4ü¤ÂüûÉÕ=@C„Þ :Ö„§Üžœç spin_loopÁL   ¬”œµK²†JCondvarÁ<·‡>¤µ>¬Ó¦t› ›_
®¼À
AtomicBoolÁT¤¬]
AtomicI16ÁL°£ÁAtomicI8ÁD»ÕÀ AtomicIsizeÁ\ÅÝà AtomicU16ÁLÒÊÁAtomicU8ÁDÝüÀ AtomicUsizeÁ\ç„Ä AtomicI32ÁL´ñÁ AtomicU32ÁL¿˜Â AtomicI64ÁLͿ AtomicU64ÁLØæÂ”†il\_”þHK25ìîÔÖ¹»”Ÿ¤¦”¸vx]_L¦ñôäçŒ Atomic types.Áúü<æ‚üSY¬ƒÌ Eÿ
œ¤óµ Ì´ü®!Ö„ÙÜÐ&-í
ë Õ $(]"øŽ\.„Ä#®D;¼À$ü<RÉ%ÕLa”T4FH79tK+Ìw<‰þY„7½4ϱš'”Û&&DdòþY)*+,ü…!þY((¨lüû5|‰Ö ÖþYÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÊD( (
*üæ8× ×þYÊD( (
+stampÁ,‰ ü¼
7
 þY©B((
,
üÓ#Œå©BÕvÕz‹Ô_./3´–$--¶—--ÊD´æ©B1ÌË©Bæ`00
1ü³©B3"3”çØ Ø©Bæ`2 ï2
3óµ ÌÒüÌ!Ö„êÜá\ EˆÕ $€46®D†¼À47 ž4\œ¤48„\T¹î049Ï4:×Þ `4;íë4=ìadùÃÛ4>ÄZ\‡ÑÛ4?
RefUnwindSafeÁl§¬½4A
UnwindSafeÁT¶«½4Bµ Í4Cä
&4Dô_4w ”•ÿ´­îLÉáLØÔLçÇíº¼ª¬\™wyLÇkÄ×^ĸüò*' A thread-safe mutable memory location.Áúü¡]Z This type is equivalent to [`Cell`], except it can also be shared among multiple threads.Áÿúüƒ`] Operations on `AtomicCell`s use atomic instructions whenever possible, and synchronize usingÁüä]Z global locks otherwise. You can call [`AtomicCell::<T>::is_lock_free()`] to check whetherÁüÂ.+ atomic instructions or locks will be used.Áñúüõ]Z Atomic loads use the [`Acquire`] ordering and atomic stores use the [`Release`] ordering.ÁÓúì× [`Cell`]: std::cell::CellÁüõA> [`AtomicCell::<T>::is_lock_free()`]: AtomicCell::is_lock_freeÁü·52 [`Acquire`]: std::sync::atomic::Ordering::AcquireÁüí52 [`Release`]: std::sync::atomic::Ordering::ReleaseÁ¥FFÍìC ÎåBãÄÔ–»=RjGn üƒ!4EEú\ü©+¥IIê£ µÌìCåBüØ+¥KKê£ äÞ¤åBüˆ$¥MMê£ åB ü°'¥OOê£ µåB ¬Ü¥QQê£ áåBRS\]^_üÊ)üø52 Creates a new atomic cell initialized with `val`.Á²ú # ExamplesÁÍú ```Áüá,) use crossbeam_utils::atomic::AtomicCell;Áúüš let a = AtomicCell::new(7);Áݦ×CåBPP
RC¹"&ü„"üÛ85 Consumes the atomic and returns the contained value.Á˜úü UR This is safe because passing `self` by value guarantees that no other threads areÁüú+( concurrently accessing the atomic data.Áªúº¦ÅúݦüÙ,úü’°§ܶ let v = a.into_inner();ÁÖú¬Þ assert_eq!(v, 7);ÁݦTåBCPP
SC 'üÍ@.\¹¬Ý4å_˜`Ö
Uà
VVUÍìå_óÍì˜`ø
Tå_˜`ˆÁ$')$&̳4Ö
Xà
YXYÅ­ÃÕ­Èçd YB¹D‡RxZ[%'*,´ßß4WW¦e´‡4WWàbüÒ/#ü—&FC Returns `true` if operations on values of this type are lock-free.Áâ&úüê&VS If the compiler or the platform doesn't support the necessary atomic instructions,ÁüÅ'\Y `AtomicCell<T>` will use global locks for every potentially concurrent atomic operation.Á¦(út®(º¦Á(ú<É(ݦüÕ(,)úüŽ)UR // This type is internally represented as `AtomicUsize` so we can just use atomicÁüè)! // operations provided by it.ÁüŽ*:7 assert_eq!(AtomicCell::<usize>::is_lock_free(), true);ÁÍ*úüÕ*'$ // A wrapper struct around `isize`.Á+
struct Foo {Áœ–+ bar: isize,Á,®+ü¸+IF // `AtomicCell<Foo>` will be internally represented as `AtomicIsize`.Áü†,85 assert_eq!(AtomicCell::<Foo>::is_lock_free(), true);ÁÃ,úüË,;8 // Operations on zero-sized types are always lock-free.Áü‹-74 assert_eq!(AtomicCell::<()>::is_lock_free(), true);ÁÇ-úüÏ-\Y // Very large types cannot be represented as any of the standard atomic types, so atomicÁü°.LI // operations on them will have to use global locks for synchronization.Áü/@= assert_eq!(AtomicCell::<[u8; 1000]>::is_lock_free(), false);Á<Æ/ݦdß/PP
\CÜÇ2ü¦0&# Stores `val` into the atomic cell.ÁÑ0útÙ0º¦ì0ú<ô0ݦü€1,1úü¹1°§Ý1úäå1 assert_eq!(a.load(), 7);Á|†2 a.store(8);Áäš2 assert_eq!(a.load(), 8);Á<»2ݦ,Î2Ù ÙåBCæ`P Ô2P
8²š8¬ ¶š ¸š8"4ºš Áš ïš Ú
Äš Åš íš 8$Æš Êš8Á4Ëš Ñš Òš8Ôš
ך8,Øš8Õ 4Þš'äš, æš8Õ 4çš% ðš8¬ Š› ‹›8£+LŒ› •› «›8¹–›$ ™›8®D››'£›8F4¥›$ › Ø› ÿ8ò›864ö› ý›8Ò $ÿ› ƒœ šœ8$„œ ˆœ8Á4‰œ œ œ8’œ8¬,•œ ›œ8® ,œœ ¡œ ¢œ% £œ8½œ8»,Áœ Çœ8"4Éœ М èœ Òœ8Óœ
ל Øœ æœ8$Ùœ Ýœ8Á4Þœ äœ åœ% éœ8ƒ8­ò 
8»% 
­8» ´8» »8æ È Ì8¹É% Í8­òç<¾óü®žI<ú„Ÿ<ôü”Ÿ&<úÇŸ<º¦tן<úòŸ<ݦ< <î¦ü– ,<úÏ + ß  à  ï 8Óá  å , ç 8Ýê<è <úý <Þõü¡"<Šö伡<ݦ<å¡+ ù¡ ú¡ ¢8Ý4û¡8¢8 “¢8´+L–¢ Ÿ¢ ®¢  ¢8$¡¢$ ¥¢8¹§¢& ª¢, ¬¢8¿ ­¢(°¢, ³¢8¿ ´¢ ¶¢ ‰§8Õ 4È¢ ΢ Т û¦, æ¢8¿ ç¢$ è¢8Ývê¢$ ì¢ ‚£ «¤
8œ£8¬  £ ¢£8"4¤£ «£ Ù£ ­£
®£ ¯£ ×£ 8$°£ ´£8Á4µ£ »£ ¼£8¾£
Á£8,£8Õ 4È£'Σ, У8Õ 4Ñ£% Ú£8¬ ô£ õ£8´+Lö£ ÿ£ •¤8¹€¤$ ƒ¤8®D…¤'¤8F4¤$ ¬¤ ¤ é¦8ܤ864ठç¤8Ò $é¤ í¤ „¥8$î¤ ò¤8Á4ó¤ ù¤ ú¤8ü¤8¬,ÿ¤ …¥8® ,†¥ ‹¥ Œ¥% ¥8§¥8»,«¥ ±¥8"4³¥ º¥ Ò¥ ¼¥8½¥
Á¥ Â¥ Ð¥8$Ã¥ Ç¥8Á4È¥ Î¥ Ï¥% Ó¥8í¥8­òñ¥ õ¥
÷¥8»,ø¥% ý¥
—¦8»,˜¦ ž¦8», ¦ ¥¦8ëd¦¦ ²¦ ¶¦8¹³¦% ·¦8­òѦ< ûü˜§N<úó§<º¦tƒ¨<úž¨<ݦ<®¨<î¦ü¨,<úû¨+ ‹© Œ© ›©8Ó© ‘©, “©8Ýê<”©<ú©©<‰ýü¹©"<µýäè©<ݦ<‘ª+ ¥ª ¦ª ­ª8Ý4§ª8»ª8 ¿ª8àLª ˪ Úª ̪8$ͪ$ Ѫ8¹Óª& Öª, ت8¿ Ùª(ܪ, ߪ8¿ ઠ⪠¢¯8Õ 4ôª úª üª ”¯, ’«8¿ “«$ ”«8Ýv–«$ ˜« ®« ׬
8È«8¬ Ì« Ϋ8"4Ы ׫ …¬ Ù«
Ú« Û« ƒ¬ 8$Ü« à«8Á4á« ç« è«8ê«
í«8,î«8Õ 4ô«'ú«, ü«8Õ 4ý«% †¬8¬  ¬ ¡¬8àL¢¬ «¬ Á¬8¹¬¬$ ¯¬8®D±¬'¹¬8F4»¬$ ج î¬ ‚¯8ˆ­864Œ­ “­8Ò $•­ ™­ °­8$š­ ž­8Á4Ÿ­ ¥­ ¦­8¨­8¬,«­ ±­8® ,²­ ·­ ¸­% ¹­8Ó­8»,×­ Ý­8"4ß­ æ­ þ­ è­8é­
í­ î­ ü­8$ï­ ó­8Á4ô­ ú­ û­% ÿ­8™®8­ò® ¡®
£®8»,¤®% ©®
î8»,Įʮ8¹Í®% Ю8­òê®<¡‚ü±¯O<ú°<º¦t°<ú¸°<ݦ<Ȱ<î¦üܰ,<ú•±+ ¥± ¦± µ±8Ó§± «±, ­±8Ýê<®±<úñ<‹„üÓ±#<¸„üƒ²#<ݦ<³²+ Dz Ȳ ϲ8Ý4ɲ8ݲ8 á²8ðTä² î² ý² ï²8$ð²$ ô²8¹ö²& ù², û²8¿ ü²(ÿ², ‚³8¿ ƒ³ …³ η8Õ 4—³ ³ Ÿ³ À·, µ³8¿ ¶³$ ·³8Ýv¹³$ »³ ѳ û´
8ë³8¬ ï³ ñ³8"4ó³ ú³ ¨´ ü³
ý³ þ³ ¦´ 8$ÿ³ ƒ´8Á4„´ Š´ ‹´8´
´8,‘´8Õ 4—´'´, Ÿ´8Õ 4 ´% ©´8¬ ô Ä´8ðTÅ´ Ï´ å´8¹д$ Ó´8®DÕ´'Ý´8F4ß´$ ü´ ’µ ®·8¬µ864°µ ·µ8Ò $¹µ ½µ Ôµ8$¾µ µ8Á4õ ɵ ʵ8̵8¬,ϵ Õµ8® ,Öµ Ûµ ܵ% ݵ8÷µ8»,ûµ 8"4ƒ¶ ж ¢¶ Œ¶8
‘¶ ’¶  ¶8$“¶ —¶8Á4˜¶ ž¶ Ÿ¶% £¶8½¶8­òÁ¶ Ŷ
Ƕ8»,ȶ% Ͷ
ç¶8»,è¶ î¶ ð¶ ñ¶ û¶8­òò¶ ö¶8¹ø¶% ü¶8­ò–·<Ó‰üÝ·M<ú·¸<º¦tǸ<úâ¸<ݦ<ò¸<î¦ü†¹,<ú¿¹+ Ϲ й ß¹8Óѹ Õ¹, ×¹8Ýê<ع<úí¹<Ëüý¹"<ð‹쬺<ݦ<Öº+ êº ëº òº8Ý4ìº8€»8 „»8D‡» » ž» »8$‘»$ •»8¹—»& š», œ»8¿ »( », £»8¿ ¤» ¦» å¿8Õ 4¸» ¾» À» ׿, Ö»8¿ ×»$ Ø»8ÝvÚ»$ Ü» ò» š½
8Œ¼8¬ ¼ ’¼8"4”¼ ›¼ ɼ ¼
ž¼ Ÿ¼ Ǽ 8$ ¼ ¤¼8Á4¥¼ «¼ ¬¼8®¼
±¼8,²¼8Õ 4¸¼'¾¼, À¼8Õ 4Á¼% ʼ8¬ ä¼ å¼8Dæ¼ î¼ „½8¹ï¼$ ò¼8®Dô¼'ü¼8F4þ¼$ ›½ ±½ Å¿8˽864Ͻ Ö½8Ò $ؽ ܽ ó½8$ݽ á½8Á4â½ è½ é½8ë½8¬,î½ ô½8® ,õ½ ú½ û½% ü½8–¾8»,š¾  ¾8"4¢¾ ©¾ Á¾ «¾8¬¾
°¾ ±¾ ¿¾8$²¾ ¶¾8Á4·¾ ½¾ ¾¾% ¾8ܾ8­òྠä¾
æ¾8»,ç¾% ì¾
†¿8»,‡¿¿8¹¿% “¿8­ò­¿<£‘üô¿N<úÏÀ<º¦tßÀ<úúÀ<ݦ<ŠÁ<î¦üžÁ,<ú×Á+ çÁ èÁ ÷Á8ÓéÁ íÁ, ïÁ8Ýê<ðÁ<ú…Â<›“ü•Â"<È“äÄÂ<ݦ<íÂ+ à ‚à ‰Ã8Ý4ƒÃ8—Ã8 ›Ã8LžÃ §Ã ¶Ã ¨Ã8$©Ã$ ­Ã8¹¯Ã& ²Ã, ´Ã8¿ µÃ(¸Ã, »Ã8¿ ¼Ã ¾Ã þÇ8Õ 4Ðà Öà ØÃ ðÇ, îÃ8¿ ïÃ$ ðÃ8ÝvòÃ$ ôà ŠÄ ³Å
8¤Ä8¬ ¨Ä ªÄ8"4¬Ä ³Ä áÄ µÄ
¶Ä ·Ä ßÄ 8$¸Ä ¼Ä8Á4½Ä ÃÄ ÄÄ8ÆÄ
ÉÄ8,ÊÄ8Õ 4ÐÄ'ÖÄ, ØÄ8Õ 4ÙÄ% âÄ8¬ üÄ ýÄ8LþÄ ‡Å Å8¹ˆÅ$ ‹Å8®DÅ'•Å8F4—Å$ ´Å ÊÅ ÞÇ8äÅ864èÅ ïÅ8Ò $ñÅ õÅ ŒÆ8$öÅ úÅ8Á4ûÅ Æ ‚Æ8„Æ8¬,‡Æ Æ8® ,ŽÆ “Æ ”Æ% •Æ8¯Æ8»,³Æ ¹Æ8"4»Æ ÂÆ ÚÆ ÄÆ8ÅÆ
ÉÆ ÊÆ ØÆ8$ËÆ ÏÆ8Á4ÐÆ ÖÆ ׯ% ÛÆ8õÆ8­òùÆ ýÆ
ÿÆ8»,€Ç% …Ç
ŸÇ8», Ç¦Ç8¹©Ç% ¬Ç8­òÆÇ<ú˜üÈA<Æ™üÛÈ#<ú‹É<º¦t›É<ú¶É<ݦ<ÆÉ<î¦üÚÉ,<ú“Ê+ £Ê ¤Ê ³Ê8Ó¥Ê ©Ê, «Ê8Ýê<¬Ê<úÁÊ< assert_eq!(a.fetch_max(9), 7);ÁüÑÊ"<ÃÙä€Ë<ݦ<©Ë+ ½Ë ¾Ë ÅË8Ý4¿Ë8ÓË8 ×Ë8å+LÚË ãË òË äË8$åË$ éË8¹ëË& îË, ðË8¿ ñË(ôË, ÷Ë8¿ øË úË ÈÐ8Õ 4ŒÌ ’Ì ”Ì ºÐ, ªÌ8¿ «Ì$ ¬Ì8Ýv®Ì$ °Ì ÆÌ ïÍ
8àÌ8¬ äÌ æÌ8"4èÌ ïÌ Í ñÌ
òÌ óÌ ›Í 8$ôÌ øÌ8Á4ùÌ ÿÌ €Í8‚Í
…Í8,†Í8Õ 4ŒÍ'’Í, ”Í8Õ 4•Í% žÍ8¬ ¸Í ¹Í8å+LºÍ ÃÍ ÙÍ8¹ÄÍ$ ÇÍ8®DÉÍ'ÑÍ8F4ÓÍ$ ðÍ †Î ¨Ð8 Î864¤Î «Î8Ò $­Î ±Î ÈÎ8$²Î ¶Î8Á4·Î ½Î ¾Î8ÀÎ8¬,ÃÎ ÉÎ8® ,ÊÎ ÏÎ ÐÎ% ÑÎ8ëÎ8»,ïÎ õÎ8"4÷Î þÎ –Ï €Ï8Ï
…Ï †Ï ”Ï8$‡Ï ‹Ï8Á4ŒÏ ’Ï “Ï% —Ï8±Ï8­òµÏ ¹Ï
»Ï8»,¼Ï% ÁÏ
ÛÏ8»,ÜÏ âÏ8äÏ'çÏ8Ë éÏ ìÏ õÏ8­òíÏ$ ðÏ8¹òÏ% öÏ8­òÐ<¡¡ü×ÐA<Æ™ü¥Ñ#<úÕÑ<º¦tåÑ<ú€Ò<ݦ<Ò<î¦ü¤Ò,<úÝÒ+ íÒ îÒ ýÒ8ÓïÒ óÒ, õÒ8Ýê<öÒ<ú‹Ó<›£ü›Ó"<¨ÌäÊÓ<ݦ<óÓ+ ‡Ô ˆÔ Ô8Ý4‰Ô8Ô8 ¡Ô8ö+L¤Ô ­Ô ¼Ô ®Ô8$¯Ô$ ³Ô8¹µÔ& ¸Ô, ºÔ8¿ »Ô(¾Ô, ÁÔ8¿ ÂÔ ÄÔ ’Ù8Õ 4ÖÔ ÜÔ ÞÔ „Ù, ôÔ8¿ õÔ$ öÔ8ÝvøÔ$ úÔ Õ ¹Ö
8ªÕ8¬ ®Õ °Õ8"4²Õ ¹Õ çÕ »Õ
¼Õ ½Õ åÕ 8$¾Õ ÂÕ8Á4ÃÕ ÉÕ ÊÕ8ÌÕ
ÏÕ8,ÐÕ8Õ 4ÖÕ'ÜÕ, ÞÕ8Õ 4ßÕ% èÕ8¬ ‚Ö ƒÖ8ö+L„Ö Ö £Ö8¹ŽÖ$ ‘Ö8®D“Ö'›Ö8F4Ö$ ºÖ ÐÖ òØ8êÖ864îÖ õÖ8Ò $÷Ö ûÖ ’×8$üÖ €×8Á4× ‡× ˆ×8Š×8¬,× “×8® ,”× ™× š×% ›×8µ×8»,¹× ¿×8"4Á× È× à× Ê×8Ë×
Ï× Ð× Þ×8$Ñ× Õ×8Á4Ö× Ü× Ý×% á×8û×8­òÿ× ƒØ
…Ø8»,†Ø% ‹Ø
¥Ø8»,¦Ø ¬Ø8®Ø'±Ø8Ó¨³Ø ¶Ø ¿Ø8­ò·Ø$ ºØ8¹¼Ø% ÀØ8­òÚØ% £Ù¬­ãEEÌ G»4ãÄÔ–»=Rjrstuüùæ*üÉãNK Applies logical "and" to the current value and returns the previous value.Áœäút¤äº¦·äú<¿äݦüËä,î¦üäúü„å" let a = AtomicCell::new(true);Á«åúü³å(% assert_eq!(a.fetch_and(true), true);Áüàå assert_eq!(a.load(), true);Á„æúüŒæ)& assert_eq!(a.fetch_and(false), true);Áüºæ  assert_eq!(a.load(), false);Á<ßæݦL€çâ âöÿq Šçq
r$‹ç¹‘çü‡ï+üøêOL Applies logical "nand" to the current value and returns the previous value.ÁÌëútÔ뺦çëú<ïëݦüûë,ìúü´ì"ç€Ûìúüãì*' assert_eq!(a.fetch_nand(false), true);Áü’íÔ¶íúü¾í)& assert_eq!(a.fetch_nand(true), true);Áüìí ¿‚‘îúü™î+( assert_eq!(a.fetch_nand(false), false);ÁüÉîÔ<íîݦTŽïã ãöÿq ™ïq
s$šï¹ ïüÀö)üóMJ Applies logical "or" to the current value and returns the previous value.Áâóútêóº¦ýóú<…ôݦü‘ô,î¦ÂôúüÊô# let a = AtomicCell::new(false);Áòôúüúô)& assert_eq!(a.fetch_or(false), false);Áü¨õ ¿‚ÍõúüÕõ(% assert_eq!(a.fetch_or(true), false);Áü‚öÔ<¦öݦDÇöä äöÿq Ðöq
t$Ñö¹×öüíý*ü½úNK Applies logical "xor" to the current value and returns the previous value.Áûút˜ûº¦«ûú<³ûݦü¿û,î¦ðûúüøû"瀟üúü§ü)& assert_eq!(a.fetch_xor(false), true);ÁüÕüÔùüúüý(% assert_eq!(a.fetch_xor(true), true);Áü®ý ¿‚<ÓýݦLôýå åöÿq þýq
u$ÿý¹…þüê*¥wwê£ ïªÂåBx´x웂<ž‚åBvv
xCüê‚!¥zzê£ ï‚åB{ë{ü ƒ $£ƒCåByy
{C¹¨ƒüéƒ7¥}}ê£ îƒþÅ$ñƒ¿cCTøƒåB~Àc~*,ü§„8ª„æçè æåB ç c cˆ¢cµ
 `£cbufÁ `àB¤GS
èÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
æ`ŸÈŸÈ ÈErrorÁ O˜éBL| ®„|
~C$¯„± µ„ü¤†&l­†4Íìˆi »†Íì¼i ¾†
ˆi¼i"$ ü–Œ(.\ŠŒ$™Œ4ÊD¶—
addrÁ$žŒ“”4ÊD쨔 ®”4müî”),õ”4mÇ€Cÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€C“•ÊDž•ÊDŒ¹—TÀ—4Ãn—ñ˜2zÁÅ¿/*4ˆˆÃn|Í—Ãn‹ŒŽüñ— $ô—4é éÃn¼À½À¾ÀË¿ÀÀÀÌÁÀÂÀGÃÀÄÀFÅÀÆÀ×`šÁ¬S øBæ`Š ù—Š
$ú—_orderÁ4€˜ü¨˜+,«˜4ê êÃnæ`ç¡æ`Š ±˜Š
Œ$²˜_valÁ$¸˜ü¡4˜üê˜*$í˜4ë ëÃnæ`ç¡æ`Š ò˜Š
$ó˜è¢$ù˜ü¡4ƒ™ü«™ ¬®™4ì ìÃnæ`æ`ç¡ç¡Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
æ`æ`Š Í™Š
Ž$Ι_currentÁDÜ™_newÁ$ò™_successÁD„š_failureÁD šü©›)œ²›4¥ê£ Æ›¢f  ü£=\­4ðHC¥ê£ ¹þÅ
Cˆ¼!üª.d™ª4ðHCæ`¥ê£ ¦ª
C©ª¹¶ª!ü§®2\±®4ðHCC¥ê£ ½®
CÀ®¹Í®!ü°´v亴4ðHCC•Ó¥˜˜ê£ ×´þÅ$œµÏÈ£µ
CÚ´ÞÍ<ë´æ ÷´;=¼Ô ÀH\î œ®D9¼Àšä%¼˜üDSP Trait which allows reading from primitive atomic types with "consume" ordering.ÁœœÎìü˜¸œЬЬ žžÍìج‰­žü¶$! Type returned by `load_consume`.Á䜜üª$üîDA Loads a value from the atomic using a "consume" memory ordering.Á·úü¿IF This is similar to the "acquire" ordering, except that an ordering isÁüLI only guaranteed with operations that "depend on" the result of the load.ÁüÞGD However consume loads are usually much faster than acquire loads onÁüªJG architectures with a weak memory model since they don't require memoryÁ¼ù fence instructions.ÁúüKH The exact definition of "depend on" is a bit vague, but it works as youÁüíJG would expect in practice since a lot of software, especially the LinuxÁü¼" kernel, rely on this behavior.ÁãúüëHE This
+ Ø
 Ù
 à
8Ý
8 ê
8Ÿ
 ù
 ÿ
 ú
8
(8$„'ˆ8Š Ž Ñ8#œ8, '¥8Å'°8ç'8Õ 4¸'¾8¦% Î8Ü8  ç8 í8¬ ò 8®'û8Ë% 8¦t“ ¡ ³8®'ª8G% ´8 % ØÄ­ Æ » Ì ã , Í8Õ & Ô8¼$ Ú, Ü8¹Ý& à8´á*å è ¸+ ò ó 8âô ÷ 8
ø û 8×´œü8$8ÿl 8
®8í'8ç$¸'¼8Õ 'Ä, Æ8Õ  Î 
8!8á å, ç8¹è% ë8ˆ   % ˆ+ œ  ±8âž ¡ °8Ö88ÿ8
Î8loomÁ'Ö8ç'Ü8Õ 'ä, æ8Õ  î ²
8!8 , 8¹ˆ% 8ˆd™ ¥ ¦ §% ¨% ¹üª:×´œ“¬’ü‰ ¥¢¢ê£ ¯ÃH£¢ž¢ð¡¡ðH´ƒ
ÑH„â¤×
 `¥¦r,é!¥¨DerefMutÁD&ö!¥©LCL57ü1,¥««ê£ œ1Þ¤$Ÿ1üHüÀ1,¥­­ê£ Ì1 C$Ï1üH´ñ1¥¯¯ê£ ö1üH°±
üê3(üŽ2:7 Pads and aligns a value to the length of a cache line.ÁÍ2útÕ2º¦è2ú<ð2ݦüü2%" use crossbeam_utils::CachePadded;Á¦3úü®3+( let padded_value = CachePadded::new(1);Á<Þ3ݦ÷3CüH®®
°C¿<äÑ6äÆ4 Returns the inner value.Áç4útï4º¦5ú<Š5ݦü–5%òÂÀ5úüÈ5+( let padded_value = CachePadded::new(7);Áüø5*' let value = padded_value.into_inner();Á̧6 assert_eq!(value, 7);Á<Å6ݦTØ6üHC®®
±C$ã6üŒ7 ¥³³ê£ ‘7üH´µê!ë!µ\³74¸7²²C¬É7,Ì7î îüH îC² Ò7²
µC$Ó7üþ7#¥··ê£ ƒ8üH¸÷!¸ü¨8!L«8ï ïüH ïC µ8
¸C$º8üí81¥ººê£ ò8»’Tõ8üH»Àc»ü¥98¨9ðñò ðüH ñ c cˆ¢cµ
 `£cÈ’ `àB¤GS
ò ¬9¹
»C$­9± ³9üÎ:"¥½½ê£ Ó:üH¾ë¾¬÷:$ú:CüH¼¼
¾C¿ ÿ:ü´;5¥ÀÀê£ ¹;ÄcCd¼;üHÁÅcÁ!#üð;8ó;óôõ óüH ô c cˆ¢cµ
 `£cÈ’ `àB¤GS
õï“¿ ÷;¿
ÁC$ø;± þ;üü Î@\ŸÇÈÉ¿ $ÃÄa$,á.ÃÅ×< `ÃÆ´:„ -L6¬BTHÔG´]\cÔG”ü{/, Performs exponential backoff in spin loops.Á«úü¯RO Backing off in spin loops reduces contention and improves overall performance.Áúü†c` This primitive can execute *YIELD* and *PAUSE* instructions, yield the current thread to the OSÁüêa^ scheduler, and tell when is a good time to block the thread using a different synchronizationÁüÌ^[ mechanism. Each step of the back off procedure takes roughly twice as long as the previousÁ step.Áµúº¦ÈúüÌ$! Backing off in a lock-free loop:Áñúݦüý! use crossbeam_utils::Backoff;ÁüŸ'$ use std::sync::atomic::AtomicUsize;ÁüÇ,) use std::sync::atomic::Ordering::SeqCst;Áôúüø63 fn fetch_mul(a: &AtomicUsize, b: usize) -> usize {Áü¯%" let backoff = Backoff::new();Á loop {Áüä%" let val = a.load(SeqCst);ÁüŠUR if a.compare_exchange(val, val.wrapping_mul(b), SeqCst, SeqCst).is_ok() {ÁÜà return val;Á
ÜŠ backoff.spin();Áñ³ݦ¾úüÂ30 Waiting for an [`AtomicBool`] to become `true`:Áöúݦü‚ !âÔü¤ &# use std::sync::atomic::AtomicBool;ÁüË ,¾Õø úüü &# fn spin_wait(ready: &AtomicBool) {Áü£
%ÀÖüÉ
# while !ready.load(SeqCst) {Áìí
 backoff.snooze();ÁL ñØ,• ñ³<› ݦ£ úü§ \Y Waiting for an [`AtomicBool`] to become `true` and parking the thread after a long wait.Áü„ a^ Note that whoever sets the atomic variable to `true` must notify the parked thread by callingÁŒæ  [`unpark()`]:Áø ú ݦü„
!âÔü¦
&ŽÚüÍ
,¾Õ¤ú
 use std::thread;Áúü“*' fn blocking_wait(ready: &AtomicBool) {Áü¾%ÀÖüä#–Ûüˆ'$ if backoff.is_completed() {Áü° thread::park();Á¤Ð } else {Áüå! backoff.snooze();Ál‡·ØL•ñØñ³ݦ­úü±+( [`is_completed`]: Backoff::is_completedÁüÝ.+ [`std::thread::park()`]: std::thread::parkÁüŒ# [`Condvar`]: std::sync::CondvarÁü°1. [`AtomicBool`]: std::sync::atomic::AtomicBoolÁüâ-* [`unpark()`]: std::thread::Thread::unparkÁ<ÀJuV(4;GÊÃÉÉá.á.aã.»Ì-IÜžB2®”Gd½ÀJÌÍÎÏФŽäÐ Creates a new `Backoff`.Áñúº¦Œú<”ݦü !âÔÆúüÎ! let backoff = Backoff::new();ÁݦÀJËË
Ìœ«Ì× Resets the `Backoff`.Áõúº¦úݦü¤!âÔÊúüÒ!µå¤ø backoff.reset();Á<ݦö öÀJæ`Ë ¸Ë
Í”Äüæ" Backs off in a lock-free loop.Áúü•]Z This method should be used when we need to retry an operation because another thread madeÁ
progress.Áúü‘EB The processor may yield using the *YIELD* or *PAUSE* instruction.ÁÛúº¦öúüþ$›Ô§úݦü»!âÔüá'Õü,¾Õ¾úüÆ6€Öü%ÀÖîÖü¾%†×üèUµ×Ü“طØÜôÍØL”ñØñ³¬úü´  let a = AtomicUsize::new(7);ÁüÙ$! assert_eq!(fetch_mul(&a, 8), 7);Áü‚# assert_eq!(a.load(SeqCst), 56);Áݦ÷ ÷ÀJæ`Ë ÐË
Τ¸.ü® ! Backs off in a blocking loop.ÁÔ úüÜ XU This method should be used when we need to wait for another thread to make progress.Á¹!úüÁ![X The processor may yield using the *YIELD* or *PAUSE* instruction and the current threadÁü¡";8 may yield by giving up a timeslice to the OS scheduler.Áá"úüé"GD In `#[no_std]` environments, this method is equivalent to [`spin`].Áµ#úü½#[X If possible, use [`is_completed`] to check when it is advised to stop using backoff andÁü$QN block the current thread using a different synchronization mechanism instead.Áó$úÜû$ [`spin`]: Backoff::spinÁü›%+¥áË%útÓ%º¦æ%úüî%3ªÙ¦&ú<®&ݦüº&!âÔ¼à& use std::sync::Arc;Áüü&&ŽÚü§',¾Õ¤Ø'ÉÞäñ' use std::time::Duration;Á(úüš(&ØÚüÅ(%ÀÖüï(#–Ûì—)ÂÛL¹)ñØ,Ç)ñ³Ñ)úüÙ)1. let ready = Arc::new(AtomicBool::new(false));Áü* let ready2 = ready.clone();Á³*úÜ»* thread::spawn(move || {ÁüÛ*2/ thread::sleep(Duration::from_millis(100));Áü’+# ready2.store(true, SeqCst);Á<º+ });ÁÆ+úüÎ+*' assert_eq!(ready.load(SeqCst), false);Á´ý+ spin_wait(&ready);Áü˜,)& assert_eq!(ready.load(SeqCst), true);ÁüÆ,• # std::thread::sleep(std::time::Duration::from_millis(500)); // wait for background threads closed: https://github.com/rust-lang/miri/issues/1371Á<à-ݦì-úüô-1¿â4¿.ø øÀJæ`Ë Æ.Ë
Ï$Ç.üÿ="ü½2[X Returns `true` if exponential backoff has completed and blocking the thread is advised.Á3út¥3º¦¸3úüÀ3\Y Waiting for an [`AtomicBool`] to become `true` and parking the thread after a long wait:Á¡4ú<©4ݦüµ4!âÔ¼Û4²ôü÷4&ŽÚü¢5,¾Õ¤Ó5ÉÞäì5ûô6úü•6*óÞüÄ6%ÀÖüî6#–Ûü–7'ÃßüÂ7ôߤæ7œàüÿ7!ºàl¥8·ØL·8ñØ,Å8ñ³Ï8úü×81Šöü9Åöü±9# let waiter = thread::current();ÁÙ9úÜá9ùöü:2ž÷ü¸:#Ú÷Äà: waiter.unpark();Á<ý:†ø‰;úü‘;*£øÔÀ; blocking_wait(&ready);Áüß;)öøü<•ªù<§=ݦ³=úü»=1¿âd†>ù ùÀJË “>Ë
Ð$”>ÜÓ>ÀJÒÀcÒüõ>8ø>úûü úÀJ û c cˆ¢cµ
 `£cÈ’ `àB¤GS
üï“Ñ ü>Ñ
Ò$ý>± ƒ?ÄÑ@ÀJÔ´Ô¼ð@<ó@ÀJÓÓ
Ô¼´à@dæü& # Thread synchronization primitives.Á' úü+- Í„üYO „…ü©P Ý…»À¼Î× ü±áD Œ²ˆ ôË5¤á »µ—6¬÷ ÁÀ$L© Ÿ·l— Öt… „„ Üû L› ÖÛ„\T»î0רÄZ\ÖÑÛ×Ù¿z$òï8×Ú´¯A´Ë2|ç"ìùD¥ÜÜê£ ÿJ$"zM'øÝÞî"$T$×ÛÛµ{ü­!×ÛÛú\üÀ0¥ààê£ Ì“ÂÞ¤ÿJüô)¥ââê£ Þ¤ÿJœ¢¥ääê£ §ÿJåæèëüî!.\ÞÿJãã
åCü‚ S\ ý ýÿJ˜Û ýCãçç Ÿ ãÁÛ œ –"˜Ûæ` ˜Ûæ`˜"C Ó 
æC˜Û ± ¦ GIü«A×þ þÿJ˜Ûæ`ãéé ¼ãÁÛ ¹ÆŒÙŒ ê
èC˜Û± Ã/1µè<closure_kind>Áê<closure_signature>Áê<upvars>ÁêêèêC˜ÛËGæ`æ`˜Û «hüè$×ÿ ÿÿJ ÿCã ã
ëC$äð¥ííê£ õÿJî"$– ÿJæ`ì ì
îC  ÖüŒ˜šøŽ\%
„Äïñ×4<
ÅÀïòׯÀïòKb
†JïôêŒ<g
‡>ïõ¤,p
µ>ïö×
¤,ï÷ PhantomDataÁ\—
ïøû‘ïøDurationÁD´
­ÖïúInstantÁ<¾
óTïûô

„2
þ´I
ÙÛÅDz´D|
¢ÄŠ
ˆ
[]BDΐ
üÉ
 A thread parking primitive.Áé
úüíW
T Conceptually, each `Parker` has an associated token which is initially not present:ÁÅ
úüÉ^
[ * The [`park`] method blocks the current thread unless or until the token is available, at矬6
3 which point it automatically consumes the token.Áß
úüãa
^ * The [`park_timeout`] and [`park_deadline`] methods work the same as [`park`], but block for矁
 a specified maximum time.Áå
úüéb
_ * The [`unpark`] method atomically makes the token available if it wasn't already. Because theÁüÌ_
\ token is initially absent, [`unpark`] followed by [`park`] will result in the second callÁä¬
 returning immediately.ÁÉ
úüÍb
_ In other words, each `Parker` acts a bit like a spinlock that can be locked and unlocked usingÁä°
 [`park`] and [`unpark`].ÁÍ
ú
º¦à
ú
ݦ¤ì
ÉÞä
ûôüž&
# use crossbeam_utils::sync::Parker;ÁÅ
úÔÉ
 let p = Parker::new();Áüä!
 let u = p.unparker().clone();Á
úüŠ
 // Make the token available.Á
u.unpark();Áü» 3
0 // Wakes up immediately and consumes the token.Á
p.park();Áý
úÜ
ùöü
2
/ thread::sleep(Duration::from_millis(500));ÁœÐ
 u.unpark();Á
†øì
úüð
5
2 // Wakes up when `u.unpark()` provides the token.Á
šü´ 
ªù
ݦÒ
úÔÖ
 [`park`]: Parker::parkÁüñ *
' [`park_timeout`]: Parker::park_timeoutÁüœ
,
) [`park_deadline`]: Parker::park_deadline矃
 [`unpark`]: Unparker::unparkÁ
ÙK¾
ðῊ<¿ýþ”‚
D
ïüü¯Lüš

ïüüû‘Fu\»Ÿ æ`ܾ
ÙK¼Þ
ÙK´¤ü
<ÿ
ÙK

ÙKƒˆ´’
ÜÝ
 Creates a new `Parker`.Áý
út…
º¦˜
ú< 
ݦü¬&
†›×
úÔß
Á›
ݦŠ
ú
ÙK
ƒ”Ù
üÎ@
= Blocks the current thread until the token is made available.Á
út
º¦®
ú
ݦüÂ&
†›í
úÔõ
Á›ü”!
固
úüÂ
œœ
Åœû
úüƒ3
ޜ
š
ݦ
 ÙKæ` å


üÇ-
ü¡]
Z Blocks the current thread until the token is made available, but only for a limited time.Áƒ
út
º¦ž
ú
ݦä²
ûôüÓ&
†›þ
úÔ†
Á›¥
úü­U
R // Waits for the token to become available, but will not wait longer than 500 ms.Áü‡/
, p.park_timeout(Duration::from_millis(500));Á
ݦ
 ÙK­Ö­Ö±’®ÖsecsÁâ}¯ÖnanosÁâ}Zµ–²ªæ` Û


timeoutÁ<â
ü .
ü]
Z Blocks the current thread until the token is made available, or until a certain deadline.Áÿ
út‡
º¦š
ú
ݦü®'
$ use std::time::{Duration, Instant};ÁüÚ&
†›
úÔ
Á›ü¬?
< let deadline = Instant::now() + Duration::from_millis(500);Áð
úüøU
€©ôÒ
 p.park_deadline(deadline);Á
ݦlˆ
ƒ ƒÙKóTóTôTÏ’õTˆA t( ¼Í¥Šæ`

$—
deadlineÁD
ü¥%#
üî 6
3 Returns a reference to an associated [`Unparker`].Á©!
úü±![
X The returned [`Unparker`] doesn't have to be used by reference - it can also be cloned.Á"
út™"
º¦¬"
ú<´"
ݦüÀ"&
†›ë"
úÔó"
Á›ü’#!
囸#
úüÀ#
œœ|å#
Åœüù#3
Þœl±$
š<Ã$
ݦÏ$
úÔ×$
®Ÿüö$*
ÒŸD¬%
 ÙK ¯L µ%

$¶%
ü…(*
üí%+
( Converts a `Parker` into a raw pointer.Á&
út¥&
º¦¸&
ú<À&
ݦüÌ&&
†›÷&
úÔÿ&
Á›üž'"
 let raw = Parker::into_raw(p);矁'/
, # let _ = unsafe { Parker::from_raw(raw) };Á<ù'
ݦDŒ(
ÙKà¢
ˆthisÁ$•(
üö+0
üç(+
( Converts a raw pointer into a `Parker`.Á—)
údŸ)
# SafetyÁ°)
úü¸)S
P This method is safe to use only with pointers returned by [`Parker::into_raw`].Á*
út˜*
º¦«*
ú<³*
ݦü¿*&
†›ê*
úÔò*
Á›ü‘+"
ä´ü¸+-
* let p = unsafe { Parker::from_raw(raw) };Á<ê+
ݦD„,
à¢ÙK
µ ,
Ôž-
ÙK‹Àcü¿-8
Â-
 ÙK  c cˆ¢cµ
 `£cÈ’ `àB¤GS
 Æ-
Š
$Ç-
± Í-
φ.
ü¢.9
6 Unparks a thread parked by the associated [`Parker`].ÁDç.
¯Lv˜¼weŠwŒö.
,ö.
†J†JK‰Jµ 7ŠJphantomÁ7J¤7·0ØQdèðœºïÒ ïžïü躷 ÓuçEçEèEGlobalÁ ¿±‡§í#ìŒ/
¯Lì­/
¯LlÏ/
¯L‘¤Ð6
üã/>
; Atomically makes the token available if it is not already.Á¦0
úü®0\
Y This method will wake up the thread blocked on [`park`] or [`park_timeout`], if there isÁD1
 any.Áœ1
út¤1
º¦·1
ú<¿1
ݦ¤Ë1
ÉÞää1
ûôü…2&
†›°2
úÔ¸2
Á›ü×2!
å›ý2
úÜ…3
ùöü¥32
ÊœÜ3
…ž<ô3
†ø€4
úüˆ45
»žlÂ4
šüÔ4•
ªù<î5
ݦú5
úÔ‚6