Files
archy/core/target/debug/deps/libparking_lot-a884bf84cf7b81c5.rmeta
T

794 lines
140 KiB
Plaintext
Raw Normal View History

2026-01-24 22:59:20 +00:00
rust
.#rustc 1.93.0 (254b59607 2026-01-19)Áõ…·fÊ ¦%g--c48c539199cbc88bÁ³VOÐêùÿ²?ÑL¼§Ì±-a7a40eb546f9e2b0Áá\ƒ¦è3$|]åŒ[IÚ tæ-14b12edc9f8cd90bÁë&Gf·Ã ¬ëñq:¤»b-bb76018b1173caf6Áà 9m Ù„«ÐÒþá•cB;-030c5b0bba47cc8fÁrustc_std_workspace_coreÁÛ¹þÓ7>H%¸ÚÉ­-4b81d37a5530864dÁüÃùs<Uß7VyóHr#QÏ-c66cc7807550ce25Á miniz_oxideÁõFÖˆÚ™ª‹"ÞXzLVª-62cbc7af83058505Áadler2Á—wÉD‘嵯|6¨%Œ
+-2f171dd2394b4b62Á hashbrownÁ,ïcV¼¨ø¢:Ê\'È߈-9571ba9e0f6c7a90Árustc_std_workspace_allocÁ%¥Èxµù·¼5Ä3Bœ-aac566ad65903fa4Á
std_detectÁMmáýZ^9õ Îà§e˜÷e-2edb296e590136d8Árustc_demangleÁ@¼§VÉNb˜æ¨fHÌ+V3-53b132e4a2fa6e26Ácfg_ifÁfÝv.Å"ÒÜuPp¹ˆ¶-f76b385d7d4d7f3eÁ addr2lineÁÕú-WiúQVÓ¬
µT§5-fe25100bd73e48e4ÁgimliÁ¹xLáÇí÷‘o±Ñ8£Å-265ba9e6e4f70b3fÁobjectÁÔ³ÝzÓÿ¶ò°öM›¼òü`-9ae0d1f8ea52a318ÁmemchrÁRÎ÷׎™te~QÓ¿ØC\Ò-0bff3c8e8f4e489eÁ  –©HtGNÏ·ˆ!á-d69228d077d46f36Álock_apiÁ^¬ëDÈýp–¢ …¡Ão-0505e0f5062627a1Á
2026-01-24 22:59:20 +00:00
scopeguardÁüÕ½«—fûh‰­?1³ß-f245d02bea2a9ebfÁparking_lot_coreÁ’µ÷³€BQ~×_‡vm­-ee32c1951ba27358ÁsmallvecÁ,J^
¢¢ ü‚rçÅ-445f50e307365817Á®#ìöæT$’ÖÜm{à$ÖÈ-7228978f4fcb9234Áà ¶i(¹Ð áͬÞbå-93287e1189e2c543ÁtestsÁ,•Ÿà$ŠŸwebkit_queue_testÁŒñôà$æôPå ,"à$÷!\å ,¸%à$­%hå ,ÜTà$ÑTßå ,úàõå ,Æ,à$»,deadlockÁD¡deadlock_detectionÁ¤‚ôøcheck_deadlockÁtÒ<¬ ¤—ôå ,ì à GuardMarkerÁ\ 
send_guardÁdù´ï
ArcMutexGuardÁlõarc_lockÁTʤÀArcReentrantMutexGuardÁ´„<ß 202ArcRwLockReadGuardÁ”œfß \Z\ArcRwLockUpgradableReadGuardÁä°šß ŽArcRwLockWriteGuardÁœÒÅß »¹»condvarÁ 
  
 timed_outÁCondvarÁ! !
notify_oneÁ!notify_one_slowÁ$ $ !
notify_allÁ!notify_all_slowÁ( ( !waitÁ+!
wait_untilÁ-!wait_until_internalÁ/ / / !wait_forÁ3!wait_while_until_internalÁ55!
wait_whileÁ88Í!wait_while_untilÁ;;Í!wait_while_forÁ>>ÍA>CÍelisionÁEEAtomicElisionExtÁGIntTypeÁG elision_compare_exchange_acquireÁGelision_fetch_sub_releaseÁE have_elisionÁELúLˆL¯
fair_mutexÁPP FairMutexÁRPconst_fair_mutexÁTPFairMutexGuardÁV'aÁVPMappedFairMutexGuardÁYÚYmutexÁ\\Ë^\ const_mutexÁ`\ÌbÚb\MappedMutexGuardÁeÚeonceÁhhhhhhhhhh h
h h hDONE_BITÁh
POISON_BITÁh
LOCKED_BITÁh
PARKED_BITÁhzpoisonedÁzdoneÁhOnceÁ}
}ìh ƒÍƒ call_once_forceÁÍ call_once_slowÁ   
PanicGuardÁ
ÚìÚ²h>hÍraw_fair_mutexÁ˜˜˜ RawFairMutexÁ
옞INITÁž žlockÁžtry_lockÁžunlockÁž is_lockedÁ˜¥ unlock_fairÁ¥bumpÁ˜¨¨¯¨try_lock_untilÁ¨ try_lock_forÁ raw_mutexÁ­­­­­­­­­­ ­
­ ­ ­
­­­­ TOKEN_NORMALÁ­
TOKEN_HANDOFFÁ­ã­ô­RawMutexÁíÅÄÅ ÅØÅäÅôŭ̘̫­ÏϯÏÌÏâ­Ômark_parked_if_lockedÁÔ mark_parkedÁÔ lock_slowÁ× × × Ô unlock_slowÁÛ Ô bump_slowÁ
raw_rwlockÁÞÞÞÞÞÞÞÞÞÞ Þ
Þ Þ Þ
ÞÞÞÞÞÞÞÞÞÞÞÞÞÞôÞWRITER_PARKED_BITÁÞUPGRADABLE_BITÁÞ
WRITER_BITÁÞ READERS_MASKÁÞ
ONE_READERÁÞ TOKEN_SHAREDÁÞTOKEN_EXCLUSIVEÁÞTOKEN_UPGRADABLEÁÞ RawRwLockÁƒÞÄ lock_exclusiveÁtry_lock_exclusiveÁunlock_exclusiveÁ lock_sharedÁtry_lock_sharedÁ
unlock_sharedÁis_locked_exclusiveÁÞunlock_shared_fairÁunlock_exclusive_fairÁ bump_sharedÁbump_exclusiveÁÞ downgradeÁÞ¯try_lock_shared_forÁtry_lock_shared_untilÁtry_lock_exclusive_forÁtry_lock_exclusive_untilÁÞžlock_shared_recursiveÁžtry_lock_shared_recursiveÁÞ¡try_lock_shared_recursive_forÁ¡try_lock_shared_recursive_untilÁÞ¤lock_upgradableÁ¤try_lock_upgradableÁ¤unlock_upgradableÁ¤upgradeÁ¤ try_upgradeÁÞªunlock_upgradable_fairÁªbump_upgradableÁÞ­downgrade_upgradableÁ­downgrade_to_upgradableÁÞ °try_lock_upgradable_untilÁ°try_lock_upgradable_forÁ°try_upgrade_untilÁ°try_upgrade_forÁÞ
µtry_lock_shared_fastÁµtry_lock_shared_slowÁµtry_lock_upgradable_fastÁµtry_lock_upgradable_slowÁµlock_exclusive_slowÁº µunlock_exclusive_slowÁ¼ µlock_shared_slowÁ¾ µunlock_shared_slowÁÀ µlock_upgradable_slowÁ µunlock_upgradable_slowÁÄ µtry_upgrade_slowÁµ upgrade_slowÁµdowngrade_slowÁÈ µdowngrade_to_upgradable_slowÁÊ µbump_shared_slowÁµbump_exclusive_slowÁµbump_upgradable_slowÁµwake_parked_threadsÁÏ/impl FnOnce(usize, UnparkResult) -> UnparkTokenÁÏ Ï µwait_for_readersÁÓ Ó Ó Ó µ lock_commonÁØimpl FnMut(&mut usize) -> boolÁØ Ø Ø µdeadlock_acquireÁµdeadlock_releaseÁremutexÁßßßßßß RawThreadIdÁå
ßçÄçnonzero_thread_idÁé ßReentrantMutexÁëßconst_reentrant_mutexÁíßReentrantMutexGuardÁïÚïßMappedReentrantMutexGuardÁòÚòrwlockÁõõ÷õ const_rwlockÁùõûÚûõþÚþõMappedRwLockReadGuardÁÚõMappedRwLockWriteGuardÁÚõRwLockUpgradableReadGuardÁÚutilÁŠŠŠŠUncheckedOptionExtÁŽŽunchecked_unwrapÁŠó2ŠßŠ to_deadlineÁ   
  
 !"WaitTimeoutResultÁ½
½ìÀÍÃÕŘ 
ÉÈh OnceStateÁËNewÁÌ
ËPoisonedÁÎ
Ë
InProgressÁÐ
ËDoneÁÒ
hhhÖÈhؘhh ÛÕh
ÝÍéKEYÁß__rust_std_internal_init_fnÁß á â__RUST_STD_INTERNAL_VALÁá ä7#
$
'
(
+
+
+
-
-
-
/
/
3
3
3
5
5
5
5
8
8
8
8
;
;
;
;
>
>
>
>
D
D
D
I
J
N
O

ƒ







¡
¢
£
¤
¦
§
«
¬
È
É
Ê
Ë
Í
Î
Ò
Ó
Õ
Ö
×
Û
Ý
ˆ

Š

Œ

Ž






š

œ

Ÿ
 
¢
£
¥
¦
§
¨
©
«
¬
®
¯
±
²
³
´

·
¸
¹
º
º
¼
¾
¾
À
Â
Â
Ä
Æ
Ç
È
Ê
Ì
Í
Î
Ï
Ó
Ø
Ø
Ý
Þ
é
Á
Á
Á
Ä
Ä
Æ
Ê
×
Ù
Ü
Ü
Þ
Þ
Þ
à`½½¾ß4¿ì Á>ßœún¿l¬âæ=žæ=æ=£æ=þæ=áæ=Þæ=Ä ywj"V|à`Ý>G®¸®¸b¯¸ÓZiVwƒ'þËÌÍÑ5ÎÏá5ÐÑö5ÒÓ6‘¤dê=WýáÎ?ÞÎ?£Î?¬âÎ?žÎ?Î?à`Î? ެìh ý˘»#
ßÚÄ}}~£ìh ½ä¹ã-H©à`§Aœžì˜ v£³Ü∯ãAãAÃÃÄ­kîŸöo(׬B¬BÃã ÞÖ$‘Wõ6ÎòBÓòBÕòBÜòBßòBâòBèòBëòBîòBÞååæÛ. ău^´wŽø°ú°û°Ðü°ý°þ°ìHˈXêE>ðDÀ½CÝ˽ÚËýÛËŽØËǽÔËȽÕËɽÖËA}L®¸žÅÃ¥ÌèÏÞƒ¡ƒ¤ƒªƒ­ƒ°ƒçåø°à`¬âž£þáÞÄG  ÃÎÓÕÜßâèëîÞŽü

¸¬B*7
>t
[¬BN_ »ü€G
 ÆÍ"üØuÝ>çZçZ\éZÓZ{Ð%¶Òý¬Bß ¬BßU½üüE

¤ü
6ãAðDü‘*ãAãAKA ÀÃü½T""Ë%@ &dataÁ ˆüPwTµ¹¼ãAðDðDÞðDÓ{µãAãAüÖ=

„Ö
6¬BðDüç&¬B¬BKA ü u`""Ë%@ &—J ˆüPwTµ¹¼¬BðDðD¼ðDÎv°¬B¬BøMøMøM„Ÿ

œµ ­øM 7´š
} ¯üõA§A$‹’µ’µ]“µ«>ÓZß#ñ+cäg®Küª4
ü·&¬B¬Bü—HŸãA%<¬B¬Bt„
  ü×< ¿š UnparkTokenÁì òjjt™CBŒ [
 É ýPü= ÀQ %øM0b01ÁøM0b10Á„È 
 ÅN Ö øM 3ü®1
Ã Þ ü—I ƬB ¨O},ýP0b0001ÁýP0b0010ÁýP0b0100ÁýP0b1000Á

ýPüÅ$
þýP
%ýP0b10000Á¬œ
§
ÿýPüü6
§§¨ ParkTokenÁ©ì ãžúcL
YmÿýP¬Ö
§
ýýPü³9
ŸV
%9ýýPÜ›

T
ÿýP
üýPü‘&
§ 
üíK
ŸVL…
ýPs,mÿýPjüýPœŽ

„Ž

¸¸ Ÿ
ýP>üó5
ƒ §
üÛN
òB
–?ˆ,
åüÃ&è€D% RawThreadIdÁùL¼X

éL¼X
øMùLÚúXáø°ú°û°Ðü°ý°þ°ìHˈXêE> ø°ú°û°Ðü°ý°þ°ìHˈXêE>øM øM¹[¯ÝùKÒvTßÊinnerÁM¨Þ@§ øMáKävT\á¹[¹[ùLõX
éLõX
¨øM/5ùL«®X 
â¾[Ï\/¹[XùLòÔXùL‡!­X 
äÂ^Å^Ô^#¹[ L !XM LÅ$XùLàôXá¹[âÂ^Å^Ô^åäÂ^Å^Ô^ŸSôüë
 Ìë
 ¬B€DðDüŽ&¬B¬Bü¾,߀D€DdZ ýü¢Þíž/@ËŒ—JËœM¸öq0.¬B€DðDŒÓðDÈðDòϬB¬BÉ߀D€Dß ü£ @

Σ 
òBðDüµ (ÄòBòBMC â å üëzùóóö@»÷—J»+$BZ[eòBðDL“ ðDˆ ðD×}¸ÄòBòBäÝ
½¾%æ=06=|—
}~#§A.¨O5<¬¤H
Ž'ެìh ý˘»#
ßa §Akr¼½
œ%ãA0¬B7>EP\h˜­ÞßõŠšÂ<—
œß4Œ 
½§„Ï
 TŸ
R Å
V¡ê¤ü
Y¢±  `¤ß„¶ e¥Ë ^¦Ì b§£ }©À5L÷ ˪ž « ìã Lì ƒ­¼/¬”
 í¯Œ0Ì«
ò°Û.\Æ
å±Û.汞/tÓ
ë²á/œç
ï³ß0d› ùµ«1¬©Ø1´À·÷¸û¹†2Ìõºþ»Ä¼üÍœüÍMJ This library provides implementations of `Mutex`, `RwLock`, `Condvar` andÁü›LI `Once` that are smaller, faster and more flexible than those in the RustÁüè?< standard library. It also provides a `ReentrantMutex` type.ÁEP\h˜­ÞßõŠš Â!œß4 ½§ TŸR ÅV¡êY¢± `¤ße¥Ë^¦Ìb§£}©À5˪ž«Ã¬ã ƒ­¼/ í¯Œ0ò°Û.å±Û.!汞/ë²á/ï³ß0 ùµ«1
Ø1 · ÷¸
û¹†2 ºþ»Ä¼½¾ÌbD‚Ãï ÀÛd› ¿ 
¶2$ÀŠ Í×Á]
÷ Üê\LôçZÕDÿд RawMutex_ÁL§¨
ParkResultÁTÏË RequeueOpÁLÛñ UnparkResultÁdæÞDEFAULT_PARK_TOKENÁ”ô JDerefMutÁD—ùëʯÙQÄÑ©üï9Ÿ¢ˆ¼®|orüË@gjZ]PSCF”‘0ü¶Q&„¶ûýàâ¿Á”­ô¥ ¢’´‚æ=ôëüŸ96 Returns whether the wait was known to have timed out.ÁLòæ=
”¡Ĥ A Condition VariableÁ½ËüÁLI Condition variables represent the ability to block a thread such that itÁüŽ GD consumes no CPU time while waiting for an event to occur. ConditionÁüÖ MJ variables are typically associated with a boolean predicate (a condition)Áü¤
LI and a mutex. The predicate is always verified inside of the mutex beforeÁüñ
'$ determining that thread must block.Á Ëü KH Note that this module places one additional restriction over the systemÁüé JG condition variables: each condvar can be used with only one mutex at aÁü´ LI time. Any attempt to use multiple mutexes on the same condition variableÁü
LI simultaneously will result in a runtime panic. However it is possible toÁüÎ
LI switch to a different mutex if there are no threads currently waiting onÁÜ› the condition variable.Á·Ëü»52 # Differences from the standard library `Condvar`ÁñËüõMJ - No spurious wakeups: A wait will only return a non-timeout result if itÁüÃ30 was woken up by `notify_one` or `notify_all`.Áü÷KH - `Condvar::notify_all` will only wake up a single thread, the rest areÁüÃLI requeued to wait for the `Mutex` to be unlocked by the thread that wasÁ| woken up.Áü KH - Only requires 1 word of space, whereas the standard library boxes theÁüì,) `Condvar` due to platform limitations.Áü™$! - Can be statically constructed.Áü¾2/ - Does not require any drop glue when dropped.Áüñ0- - Inline fast path for the uncontended case.Á¢Ë # ExamplesÁµË ```ÁüÁ&# use parking_lot::{Mutex, Condvar};Á¼è use std::sync::Arc;Á¤€ use std::thread;ÁËü™=: let pair = Arc::new((Mutex::new(false), Condvar::new()));Áì× let pair2 = pair.clone();ÁõËüùLI // Inside of our lock, spawn a new thread, and then wait for it to startÁÔÆ thread::spawn(move|| {Áüá,) let &(ref lock, ref cvar) = &*pair2;ÁüŽ&# let mut started = lock.lock();Áĵ *started = true;ÁÔÎ cvar.notify_one();Á });ÁñËüõ&# // wait for the thread to start upÁüœ'$ let &(ref lock, ref cvar) = &*pair;ÁüÄ" let mut started = lock.lock();Á”ç if !*started {Áüú  cvar.wait(&mut started);Á,ü¡JG // Note that we used an if instead of a while loop above. This is onlyÁüìLI // possible because parking_lot's Condvar will never spuriously wake up.Áü¹PM // This means that wait() will only return after notify_one or notify_all isÁ // called.Á<™ÖƒÝ>ywj"V| Ôº«IdÙÝ>"#$'(+-/358;>ìØüìGD Creates a new condition variable which is ready to be waited on andÁl¸
notified.ÁåÝ>!!
"ü›" üÓ0- Wakes up one blocked thread on this condvar.ÁˆËü*' Returns whether a thread was woken up.Á¿ËüÇIF If there is a blocked thread on this condition variable, then it willÁü•C@ be woken up from its call to `wait` or `wait_timeout`. Calls toÁüÝ-* `notify_one` are not buffered in any way.ÁËü—/, To wake up all threads, see `notify_all()`.ÁË˵ƒæËÖƒìú use parking_lot::Condvar;Áœ Ëü¤ ! let condvar = Condvar::new();ÁÊ ËüÒ =: // do something with condvar, share it with other threadsÁ”!Ëôœ! if !condvar.notify_one() {Áü¿!30 println!("Nobody was listening for this.");Á,÷!Ô‰<"ÖƒT¢"æ æÝ>! ­"!
#$®"ü¬$7|¯$ç çÝ>àI! ¿$!
$$À$,Æ$&$<closure_kind>Á%<closure_signature>Á%<upvars>Á%%$%Â^Ô^ñòóAbortÁôõUnparkOneRequeueRestÁö÷
RequeueAllÁøù UnparkOneÁúû
RequeueOneÁrçHòS8à Ý> àIÜ¢.$¶•&Ε&ë•&&$&Â^“—ÞÞ·sßunparked_threadsÁàrequeued_threadsÁáhave_more_threadsÁâbe_fairÁã_sealedÁ^³Úñ8‰$›Q³˜ü±4!üÉ11. Wakes up all blocked threads on this condvar.Áÿ1Ëü‡2+( Returns the number of threads woken up.Á·2Ëü¿2EB This method will ensure that any current waiters on the conditionÁü‰3HE variable are awoken. Calls to `notify_all()` are not buffered in anyÁDÖ3 way.Áã3Ëüë330 To wake up only one thread, see `notify_one()`.ÁT¸4è èÝ>ýP! Ã4!
'$Ä4ü¿68|Â6é éÝ>àIýP! Ò6!
($Ó6,Ù6¡8(¶•)Ε)ë•))()Â^Ž—±˜ÔçA(¶•*Ε*ë•**(*Â^‹™¸˜üòJBüðEFC Blocks the current thread until this condition variable receives aÁŒ»F notification.ÁÑFËüÙFLI This function will atomically unlock the mutex specified (represented byÁüªGJG `mutex_guard`) and block the current thread. This means that any callsÁüùGJG to `notify_*()` which happen logically after the mutex is unlocked areÁüÈHKH candidates to wake this thread up. When this function call returns, theÁü˜I.+ lock specified will have been re-acquired.ÁËIËdÓI # PanicsÁäIËüìIJG This function will panic if another thread is waiting on the `Condvar`Áü»J$! with a different `Mutex` object.Á$ùJêëì êÝ> ëççÌë ì
 ½^HPbïAì¬BðDÔ^!,, ‰K!ªâðD þJ
+ðD$ŠK mutex_guardÁ\K%'üñTŽü›LIF Waits on this condition variable for a notification, timing out afterÁüéL the specified time instant.ÁMËü•MIF The semantics of this function are equivalent to `wait()` except thatÁüãMGD the thread will be blocked roughly until `timeout` is reached. ThisÁü¯NIF method should not be used for precise timing due to anomalies such asÁüýNEB preemption or platform differences that may not cause the maximumÁüÇO41 amount of time waited to be precisely `timeout`.Á€PËüˆPGD Note that the best effort is made to ensure that the time waited isÁüÔPLI measured with a monotonic clock, and not affected by the changes made toÁ¤¥Q the system time.Á¾QËüÆQFC The returned `WaitTimeoutResult` value indicates if the timeout isÁÔ‘R known to have elapsed.Á°RËü¸RJG Like `wait`, the lock specified will be re-acquired when this functionÁü‡S>; returns, regardless of whether the timeout elapsed or not.ÁÊSËdÒS£ãSËüëSJ­£üºT$€¤TøTíîï íÝ> îççÌë ì
 ½^HPbïAï¬BðDÙQÙQÚQ¯ÛQì˜= ý#ÊGëxæ=!.. —U!ʦ ƒU
-ðD$˜Ué¥\¦UtimeoutÁ<ÓU*,üùW^œüWðñ ðÝ> ñ¬Bø°ú°û°Ðü°ý°þ°ìHˈXêE>¾°æ=! X!
/$X,—X±°<©XÃZ/¶•0Ε0ë•00/0Ô^³˜¸˜ _/¶•1Ε1ë•11/1Â^Ô^Ô^ ¬B¤“`/¶•2Ε2ë•22/2ýPÔ^ä³ ýP³˜üÝsü¤lKH Waits on this condition variable for a notification, timing out after aÁ¼ôl specified duration.ÁmËü˜mIœ§üæmIF the thread will be blocked for roughly no longer than `timeout`. ThisÁü´nI¾¨ü‚oE©üÌo4Þ©…pËüpG¦ªüÙpLöª¤ªqÊ«ÃqËüËqFò«Ô–rÀ¬µrËü½rJî¬üŒs>Á­Däsòóô òÝ> óççÌë ì
 ½^HPbïAô¬BðDëÊëÊìÊsecsÁ»zíÊnanosÁ»zïJg¯l|fæ=!44 t!ʦ ís
3ðD$té¥\t±°<½t$&ü•võ̘vö÷ø öÝ> ÷ççÌë ì
 ½^HPbïAø¬BðDÍŒ²æ=!6Í767 Áv!ʦ ²v©âá» µvõá» õðD¬ôwõỼ$…x
5ðDá»$Âvé¥\Ðv conditionÁLw±°<—wˆŠüÄü¬zFŠŸü÷zJG notification. If the provided condition evaluates to `false`, then theÁüÆ{FC thread is no longer blocked and the operation is completed. If theÁü‘|GD condition evaluates to `true`, then the thread is blocked again andÁüÝ|A> waits for another notification before repeating this process.Á£}Ëü«}LýŸüü}JÒ üË~J¥¡üšKø¡üê.Ì¢Ëd¥€£¶€Ëü¾€J­£ü$€¤úûü úÝ> ûççÌë ì
 ½^HPbïAü¬BðDá»Ô^!9Í:9: Ü!ʦ Ö¡¼ Ùùá» ùðD¬¾‚ùá»÷Â$Ï‚
8ðDá»é¥Œ¼Lˆ‚uwy{ü Žäü¬ƒI—¦üúƒFC the specified time instant. If the provided condition evaluates toÁüÅ„FC `false`, then the thread is no longer blocked and the operation isÁüGD completed. If the condition evaluates to `true`, then the thread isÁüÜ…EB blocked again and waits for another notification before repeatingÁŒ¦† this process.Á¼†ËüĆIœ§ü’‡Gî§üÞ‡I¾¨ü¬ˆE©üöˆ4Þ©¯‰Ëü·‰G¦ªüƒŠLöª¤ÔŠÊ«íŠËüõŠFò«ÔÀ‹À¬ß‹Ëüç‹Jî¬ü¶Œ>Á­ùŒËd£ËüšJ­£üé$€¤„§Žþÿ þÝ> ÿççÌë ì
 ½^HPbïA¬BðDỾ°æ=!<Í==< ÇŽ!ʦ ¸Ž¡¼ »Žýá» ýðD¬îýá»ÌÊ$ÿ
;ðDá»$ÈŽé¥\ÖŽŒ¼±°<™ƒü³šØüäKÁ´ü´‘GD specified duration. If the provided condition evaluates to `false`,Áü€’HE then the thread is no longer blocked and the operation is completed.ÁüÍ’JG If the condition evaluates to `true`, then the thread is blocked againÁüœ“EB and waits for another notification before repeating this process.Áæ“Ëüî“Iœ§ü¼”I̵üŠ•I¾¨üØ•E©ü¢–4Þ©Û–Ëüã–G¦ªü¯—Löª¤€˜Ê«™˜Ëü¡˜Fò«Ôì˜À¬‹™Ëü“™Jî¬üâ™>Á­tºšƒ Ý> ƒççÌë ì
 ½^HPbïA¬BðDỹ¹æ=!?Í@?@ àš!ʦ Éš¡¼ Ôšá» ðD¬õ›á»ÖÑ$†œ
>ðDá»$ášé¥\¼Lœ›±°<²›ƒÄ—Ý>BÅB¼ÄÝ>AA
BÜþÝ>Dá`Dü ž8£ž Ý> Á`Á`œÃ`è Á]Ä`bufÁÁ]Ê­\É:•ê³í³î³Òï³ìð³ñ³ò³ìäs{©¶Ô^ѼѼÒ¼ štÀ.C §žC
D$¨žþ ®žGKb\ä ®¸EFôÑ Ô´ „¾ GGªâü´Ž G«Ö«ÖHIJHIJ©â³ÖH áÖJI  GGü¢ž ü¥ ˆ ˆ³ÖéÖéÖê³í³î³Òï³ìð³ñ³ò³ìäs{©¶éÖéÖG Ï G
I³Ö currentÁ<Þ  þ ü÷I Ìú  ³ÖéÖéÖG  G
J³Ö$•  ì‘  
Küœ
% »Ÿ  ¢
8Æ £  ¦ ˜
8à§  ª
 8 ¸ 7hardware-lock-elisionÁ¼º $ Ñ 8Æ ×  Ú ß 8å
$ à 8÷æ  é
8Ê ö 7Ø $ ý 8Ê\ÿ
7ÙD
ü ~ ?MNOHIJNO
LLýPüñ
V üô
Š Š–?ýPýPê³í³î³Òï³ìð³ñ³ò³ìäs{©¶ýPýPL L
N$–  œ  ¦ üû 6 Ìþ  –?ýPýPL ˜ L
O$™  Ÿ RTVYžPQüÑ#¬ñü÷WT A mutual exclusive primitive that is always fair, useful for protecting shared dataÁÏËüÓOL This mutex will block threads waiting for the lock to become available. TheÁü£?< mutex can be statically initialized or created by the `new`ÁüãOL constructor. Each mutex has a type parameter which represents the data thatÁü³KH it is protecting. The data can only be accessed through the RAII guardsÁüÿOL returned from `lock` and `try_lock`, which guarantees that the data is onlyÁüÏ+( ever accessed when the mutex is locked.ÁûËüÿFC The regular mutex provided by `parking_lot` uses eventual fairnessÁüÆIF (after some time it will default to the fair algorithm), but eventualÁüNK fairness does not provide the same guarantees an always fair method would.Áüß<9 Fair mutexes are generally slower, but sometimes needed.Áœ Ëü  OL In a fair mutex the waiters form a queue, and the lock is always granted toÁüð NK the next requester in the queue, in first-in first-out order. This ensuresÁü¿
OL that one thread cannot starve others by quickly re-acquiring the lock afterÁŒ  releasing it.Á¡ Ëü¥ ^[ A fair mutex may not be interesting if threads have different priorities (this is known asÁÄ„  priority inversion).Á Ëü¡ 30 # Differences from the standard library `Mutex`ÁÕ ËüÙ ;8 - No poisoning, the lock is released normally on panic.Áü•
KH - Only requires 1 byte of space, whereas the standard library boxes theÁüá
.+ `FairMutex` due to platform limitations.Áü$Š‚üµ2·‚üè0ò‚ü™EB - Efficient handling of micro-contention using adaptive spinning.Áüß52 - Allows raw locking & unlocking without a guard.ÁËt™µƒ¨ËÖƒü´ use parking_lot::FairMutex;ÁüÔ(% use std::sync::{Arc, mpsc::channel};Á¤ý³„ËÄ– const N: usize = 10;Á¯Ëü³OL // Spawn a few threads to increment a shared variable (non-atomically), andÁüƒ=: // let the main thread know once all increments are done.Á //ÁüÈQN // Here we're using an Arc to share memory among threads, and the data insideÁüš)& // the Arc is protected with a mutex.ÁüÄ+( let data = Arc::new(FairMutex::new(0));ÁðËìô let (tx, rx) = channel();Á¤’ for _ in 0..10 {Áü§96 let (data, tx) = (Arc::clone(&data), tx.clone());Áüá thread::spawn(move || {ÁüKH // The shared state can only be accessed once the lock is held.ÁüÍMJ // Our non-atomic increment is safe because we're the only threadÁü›GD // which can access the shared state when the lock is held.Áüã'$ let mut data = data.lock();Á¼‹ *data += 1;ÁÜ£ if *data == N {Áü¿%" tx.send(()).unwrap();Á
üóGD // the lock is unlocked here when `data` goes out of scope.Á });ÁÔ‰ÍË¼Ñ rx.recv().unwrap();ÁÖƒSS©âðD þJü½8ü¬@= Creates a new fair mutex in an unlocked state ready for use.ÁíËüñKH This allows creating a fair mutex in a constant context on stable Rust.Á„ÊðDþJUUè÷ Û
TðDC%ôÒüÅPM An RAII implementation of a "scoped lock" of a mutex. When this structure isÁü–<9 dropped (falls out of scope), the lock will be unlocked.ÁÓËü×NK The data protected by the mutex can be accessed through this guard via itsÁü¦+( `Deref` and `DerefMut` implementations.ÁtÛÚWXXW©â îççÌë ì
 ½^HPbïAÚãAôüêMOü˜!$üŸOL An RAII mutex guard returned by `FairMutexGuard::map`, which can point to aÁüï# subfield of the protected data.ÁËü—WT The main difference between `MappedFairMutexGuard` and `FairMutexGuard` is that theÁüïKH former doesn't support temporarily unlocking and re-locking, since thatÁü» PM could introduce soundness issues if the locked object is modified by anotherÁ\Œ! thread.Á¤¡!ÚZ[[Zìü º!ïïßó@ ô—J õ
 ì2ò<âª}AÚãAôü¶!WYL†^`beÃ\]ÔÑŒæüîB? A mutual exclusion primitive useful for protecting shared dataÁ±ËüµOçÞü…?¿ßüÅO‡àü•KßàüáO³áü±+‹âÝË # FairnessÁðËüôOL A typical unfair lock can often end up in a situation where a single threadÁüÄPM quickly acquires and releases the same mutex in succession, which can starveÁü•NK other threads waiting to acquire the mutex. While this improves throughputÁüäOL because it doesn't force a context switch when a thread tries to re-acquireÁü´ @= a mutex it has just released, this can starve other threads.Áõ Ëüù QN This mutex uses [eventual fairness](https://trac.webkit.org/changeset/203350)ÁüË
GD to ensure that the lock will be fair on average without sacrificingÁü“ MJ throughput. This is done by forcing a fair unlock on average every 0.5ms,Áüá MJ which will force the lock to go to the next thread waiting for the mutex.Á¯ Ëü³ MJ Additionally, any critical section longer than 1ms will always use a fairÁü
NK unlock, which has a negligible impact on throughput considering the lengthÁäÐ
 of the critical section.Áí
Ëüñ
NK You can also force a fair unlock by calling `MutexGuard::unlock_fair` whenÁüÀB? unlocking a mutex instead of simply dropping the `MutexGuard`.ÁƒËü‡3Ïè»Ëü¿;–éüûKÚéüÇ*' `Mutex` due to platform limitations.Áüò$Š‚ü—2·‚üÊ0ò‚üûEŒëüÁ5Úëü÷FC - Supports eventual fairness so that the mutex is fair on average.Áü¾SP - Optionally allows making the mutex fair by calling `MutexGuard::unlock_fair`.ÁËt–µƒ¥ËÖƒܱ use parking_lot::Mutex;ÁüÍ(îì¤ö³„Ëĵí¨Ëü¬Oáíüü=¹îþîüÁQïü“)çïü½'$ let data = Arc::new(Mutex::new(0));ÁåËìé×ð¤‡üðüœ9™ñüÖÛñüöKƒòüÂM×òüG­óüØ'ý󼀬ôܘËôü´%ïôœõüèG²õöÔ‰Â˼ƫöÖƒ__è÷ õþLü /ü™;8 Creates a new mutex in an unlocked state ready for use.ÁÕËüÙFC This allows creating a mutex in a constant context on stable Rust.Á\­ðDþLaaè÷ ¹
`ðD?&Ô¤!ü—Pœùüè<õù¥ Ëü© NÅúüø +œûT­!Úcddcìü ¼!ççÌë ì
 ½^HPbïAÚ¬Bôü¸!MOüÖ$ üé!KH An RAII mutex guard returned by `MutexGuard::map`, which can point to aÁüµ"#»ýÙ"ËüÝ"OL The main difference between `MappedMutexGuard` and `MutexGuard` is that theÁü­#KÒþüù#P¦ÿ\Ê$þÿ„ß$Úfggfìü ô$ïïßó@ ô—J õ
 ì2ò<âª}AÚ¬Bôüð$WYD$•vwxy}~ËÑ2”ÞŽhiÍÁ]hkmemÁÕhl· Ò\hn]D¦’µhoÕдhp¨hrSpinWaitÁDÛµhsÖs”å JhtDEFAULT_UNPARK_TOKENÁ¤ù IhuüÑÝüöFÑÓ¿Á
²´¤¦–üÂL‰„ÂuwfhDF”‘D—høM¤©høM¤ÃhøM¤ÝhøMtÊÎ?{|ìÖ üß<9 Returns whether the associated `Once` has been poisoned.Á Ëü¨LI Once an initialization routine for a `Once` has panicked it will foreverÁüùJG indicate to future forced initialization routines that it is poisoned.ÁDÝ Î?zz
{Ì– ü­
EB Returns whether the associated `Once` has successfully executed aÁ
 closure.Á$ Î?zz
| ;2üã C@ A synchronization primitive which can be used to run a one-timeÁü§ JG initialization. Useful for one-time initialization for globals, FFI orÁÔò  related functionality.Á
Ëü‘
2/ # Differences from the standard library `Once`ÁÄ
ËüÈ
74 - Only requires 1 byte of space, instead of 1 word.Áü€# - Not required to be `'static`.Áü¤OL - Relaxed memory barriers in the fast path, which can significantly improveÁüô(% performance on some architectures.ÁüEŒëã˵ƒöËÖƒÔ‚ use parking_lot::Once;ÁËü¡%" static START: Once = Once::new();ÁÇËÄË START.call_once(|| {Áüä" // run initialization hereÁ<‡í‡<Öƒ§A½ä¹ã-H©~¨O§A;21h¨O§A}}
~h}}¨OL³§AƒÔõüà Creates a new `Once` value.Á§A
üü ü¼-* Returns the current state of this `Once`.Á,ƒŒ Œ§AÎ? 
üâ$?üíLI Performs an initialization routine once and only once. The given closureÁü¾KH will be executed if this is the first time `call_once` has been called,ÁüŽ41 and otherwise the routine will *not* be invoked.ÁÇËüÏGD This method will block the calling thread if another initializationÁü›! routine is currently running.ÁÁËüÉIF When this function returns, it is guaranteed that some initializationÁü—KH has run and completed (it may not be the closure specified). It is alsoÁüçKH guaranteed that any memory writes performed by the executed closure canÁü·C@ be reliably observed by other threads at this point (there is aÁüÿLI happens-before relation between the closure and code executing after theÁ return).Áá˵ƒüË<„ÖƒÔ¥¯Ëô· static mut VAL: usize = 0;ÁüÚ$! static INIT: Once = Once::new();ÁƒËü‹KH // Accessing a `static mut` is unsafe much of the time, but if we do soÁüÛIF // in a synchronized fashion (e.g. write once or read all) then we'reÁ”© // good to go!ÁþîüËJG // This function will only call `expensive_computation` once, and willÁüšLI // otherwise always return the value returned from the first invocation.Áüë" fn get_cached_val() -> usize {Á„’ 
unsafe {Áü§  INIT.call_once(|| {ÁüË .+ VAL = expensive_computation();Á });Á|! VALÁL¦!,´!Ô‰¾!ËüÆ!)& fn expensive_computation() -> usize {Átô! // ...Á<‡" # 2Á,“"Ô‰<"Öƒ©"Ëd±"£Â"ËüÊ"@= The closure `f` will only be executed once if this is calledÁü#LI concurrently amongst many threads. If that closure panics, however, thenÁüà#LI it will *poison* this `Once` instance, causing all future invocations ofÁô±$ `call_once` to also panic.ÁLé$ §AÍÔ^Í ö$©âк ó$кÔ^D˜%кÔ^Ô^
ƒк$÷$þ ý$BDÄ&ƒ¶•Ε땃кÎ?Ô^ ø°ú°û°Ðü°ý°þ°ìHˈXêE>кüÚ*Nüþ&GD Performs the same function as `call_once` except ignores poisoning.ÁÊ'ËüÒ'HE If this `Once` has been poisoned (some initialization panicked) thenÁüŸ(KH this function will continue to attempt to call initialization functionsÁüï($! until one of them doesn't panic.Á˜)Ëü )IF The closure `f` is yielded a structure which can be used to query theÁüî)KH state of this `Once` (whether initialization has previously panicked orÁ
ߎ Ú§Aê@…2MhøÆê@
ŽÚ¶HDºHhøÆüÍH Úê@“ ÒH”üH$ÿH ê@Ô^ „I
Ú$‰I¬ªR§A•ŤÔR<×R§A
ĈS§A—á`ü§S8ªS §A Á`Á`œÃ`è Á]Ä`ÓÁ]Ê­\É:•ÃÔ ®S
$¯Sþ µS”›œÃ˜ RawMutexFairÁdû˜šÔÑ6´ñ3üŠ2/ Raw fair mutex type backed by the parking lot.ÁãAv£³Ü∯œ¬BãA33˜¬BãA
œ˜¬Büá/ãAŸ ¡¢£¤¢¤£¡„—$žžãA„åžž¬B ãAÔ^ž ž
¡Ôú ãAž ž
¢$‡¼Ê ãAÔ^ž Ûž
£ܘL›˜ ˜ãAž ¥ž
¤üÚ3ãA¦§§¦ä¢ ãAÔ^¥ ¸¥
¦¬÷$ š šãAÔ^¥ ¥
§$‡ ü® 4ãA©ª«¬! «¬¨¨¬B

¨¨¬Bü€ 8  ãAãA¨ ¨
«$“ ±°<™ üû 7 œ œãAãA¨ ¨
¬ ±°<’ ¿ÀÁÂà  ­¯¶2$ã Š­°]D‰ ’µ­³ÕD“ д­´ ëÊ­µÑrLÏ ­¨ ­¸þrT÷ Ë­¹õš µ­º·sd Þ­»©P\› ­¼©Pš­¼Ös”¨ J­½¯ ÙQ­¾¼Ñ '*üîE  õ”¹ åüÞ] Ø„Þ Ê̸º§©˜pr”Á dü×* dè + l  Q¤« ­øM¤Š
T
­øMœÖ
ü¨
- * Raw mutex type backed by the parking lot.Á
¬BkîŸöo(×Ä ­ÃèOüå+ ¬BÆÇÈÉÊËÊÈËɤ— $ ÅŬB„æ ÅÅ GuardNoSendÁ ì ϶o<Gyt   ¬BÔ^Å ¨ Å
È ÔÛ ž ž¬BÅ ç Å
É ¼×! 4á! Ÿ Ÿ¬BÔ^Å è! Å
Ê$é! Ü$ L $    ¬BÅ ª$ Å
Ë$«$ üœ%/ ¬BÍÎÎÍäà% \ê% ¡ ¡¬BÔ^Ì ö% Ì
Í$÷% ¬ª( $´( ¢ ¢¬BÔ^Ì ¹( Ì
Î$º( üµ)0 ¬BÐÑÒÓ! ÒÓlì) Dñ) ÏϹ¹dŠ* <* ÏϾ°üµ*2 t¸* £ £¬B¾°Ï Ç* Ï
Ò$È* ±°<Î* üü-1 dÿ- ¤ ¤¬B¹¹Ï Œ. Ï
Ó$. ±°<“. l¿1 ¬BÕÖ×ÛÝüÊ22 ¬Ø2 ¥ ¥¬BÔ î2 Ô
Õ$ï2 üÉ7 \×7 ¦ ¦¬BÔ^Ô ã7 Ô
Ö$ä7 ü¿85 LÂ8 ­§ §¬BŒ²Ô Ì8 Ô
×$Í8 ±°<Ó8 ÐC ×¶•ØΕØë•ØØ×ØÂ^Ò³Á´±D ×¶•ÙΕÙë•ÙÙ×ÙÂ^¶´Ô^¤ÔD ×¶•ÚΕÚë•ÚÚ×ÚÂ^–µÁ´üœP' \ŸP ­¨ ¨¬BÔ^Ô «P Ô
Û$¬P 
force_fairÁT²P ´ˆR Û¶•ÜΕÜë•ÜÜÛÜÂ^“™›Q ôœ÷Z LúZ ­© ©¬BÔ^Ô „[ Ô
Ý$…[ t¾úûüýþÿƒÏ
KÞàã„ð
GÞáï
ÀÞãÛ
¿Þä¶2$Ã
ŠÞåq$ß
É,Þçb\ø
®¸ÞéÕD…
дÞê
RawRwLock_ÁT¯
ÃÞìRawRwLockUpgradeÁ„»
âÞí¨
Þï 
[ÞðFilterOpÁDú
ÞñþrT„
ËÞò­UL
§Þó­U¨ÞóõšD›
µÞô·sd¥
ÞÞõ©P\³
Þö©PšÞö
ëÊÞø¯
ÙQÞùüÑ0
ðóâåü‡/
ÙÜÊÍ
¿üÍD

· ¨«˜ü—5

ehüÒo
[„Ò
NQ8;),õ÷äæÓÕôÇ
±³Ÿ¡¼´
ÞýPôž
Œ¤
ÞýPÜ·

ÞýP¼ü
T
ÞýPÌÅ

ÞýP¼
T“
ÞýPìü
d
ÞŸVü³

ÞŸVüí!
„ó
ÞŸV¤õ
üº:
7 Raw reader-writer lock type backed by the parking lot.ÁL€
òBÖ$‘Wõ6
,
Þƒƒ–?ü§-
òB†ˆŠŒŽÄÅÉÊËÆÇÈÌÍŒˆŽŠ¬Û

òB„¯
\´
°ÚÄé

ª ªòBÔ^ û

ˆ
ü¿$
”Â
« «òB Õ


ü÷!

¬ ¬òBÔ^ 

Š$“
¬³

­ ­òBÔ^ Â


üž!

® ®òB ±

Œ
ôÂ!
lÌ!
¯ ¯òBÔ^ Ú!

$Û!
Üë$
Lî$
° °òB ø$

Ž$ù$
ü‹&%
œŽ&
± ±òB ¢&

$£&
ü–'1
òB‘ÏÐÑÒüÜ'#
Ӿ'
² ²òBÔ^ ù'

$ú'
üü(&
 )
³ ³òBÔ^ œ)

$)
ä¼+
\Æ+
´ ´òBÔ^ Ò+

$Ó+
üå,
tï,
µ µòBÔ^ þ,

$ÿ,
ü„.6
òB–ÔÔÏ.
LÙ.
 òBÔ^ ã.

$ä.
ü12
òB˜šœÖרÙÚÛšœlº1
D¿1
¹¹dØ1
<Ý1
¾°üƒ2>
Ϡ2
· ·òBòBÖ š2

š$2
±°<¡2
üÜ4?
§4
¸ ¸òBòB× õ4

$ö4
±°<ü4
ü©7;
´¬7
¹ ¹òB¹¹ Ã7

œ$Ä7
±°<Ê7
üç:<
Äê:
º ºòB¾° ƒ;

$„;
±°<Š;
ü‰>6
òBŸ ÝÞ ŸüÔ>
¬×>
» »òBÔ^ž í>
ž
Ÿ$î>
üÇ@+
ÌÊ@
¼ ¼òBž ä@
ž
 $å@
üãB;
òB¢£àᣢü³CH
ì¶C
½ ½òB¨û¡ ÔC
¡
¢$ÕC
±°<ÛC
ü”FI
ü—F
¾ ¾òB‹ü¡ ·F
¡
£$¸F
±°<¾F
üÙH4
òB¥¦§¨©ãäåæç¥¦¨©§Ì¢I
|¥I
¿ ¿òBÔ^¤ µI
¤
¥$¶I
üK%
œK
À ÀòB¤ ¤K
¤
¦$¥K
ü³M"
Œ½M
Á ÁòBÔ^¤ ÏM
¤
§$ÐM
ĤR
<®R
 ÂòBÔ^¤ ¶R
¤
¨$·R
üóT$
2026-01-24 22:59:20 +00:00
\ýT
à ÃòB¤ ‰U
¤
©$ŠU
üöW8
òB«¬éꬫüÃX'
´ÍX
Ä ÄòBÔ^ª äX
ª
«$åX
ü¹]
|Ã]
Å ÅòBÔ^ª Ó]
ª
¬$Ô]
üÚ^=
òB®¯ìí¯®ü¬_%
¤¶_
Æ ÆòBÔ^­ Ë_
­
®$Ì_
üËa(
¼Õa
Ç ÇòBÔ^­ ía
2026-01-24 22:59:20 +00:00
­
¯$îa
ü¦d9
òB±²³´ðïòñ³±´²üôd=
Ì÷d
È ÈòB¾°° ‘e
°
±$e
±°<˜e
ü»g<
¼¾g
É ÉòB¹¹° Ög
°
²$×g
±°<Ýg
üŽj<
Œ˜j
Ê ÊòB¾°° ªj
°
³$«j
±°<±j
üûl;
|…m
Ë ËòB¹¹° •m
°
´$m
±°<œm
täo
òB¶·¸¹º¼¾ÀÂÄÆÇÈÊÌÍÎÏÓØÝÞüp7
¤’p
2026-01-24 22:59:20 +00:00
ÞÌ ÌòBµ §p
µ
$¨p
 recursiveÁL®p
ü˜z7
¤›z
ÞÍ ÍòBµ °z
µ
·$±z
2026-01-24 22:59:20 +00:00
ù‹L·z
üŽƒ*
Ä‘ƒ
ÞÎ ÎòBµ ªƒ
µ
¸$«ƒ
üà‡*
Äã‡
ÞÏ ÏòBµ ü‡
2026-01-24 22:59:20 +00:00
µ
¹$ý‡
ü³?
Ϧ
ÞÑ ÑòBŒ²µ Ê
µ
º
±°
œŒŽ
º¶•»Ε»ë•»»º»Â^Ð ÐýP òBü‚–1
¬…–
ÞÒ ÒòBÔ^µ ›–
µ
¼$œ–
2026-01-24 22:59:20 +00:00
žåT¢–
ü–—%
¼¶•½Ε½ë•½½¼½Â^ýP“™›Q“çêü”ŸM
„—Ÿ
2026-01-24 22:59:20 +00:00
ÞÔ ÔòBŒ²µ ¨Ÿ
µ
¾$©Ÿ
ù‹L¯Ÿ
±°<ÀŸ
œûŸ
¾¶•¿Ε¿ë•¿¿¾¿Â^Ó ÓýPê“ç䯮
”²®
ÞÕ ÕòBÔ^µ Å®
µ
À$Æ®
¼Ö°
À¶•ÁΕÁë•ÁÁÀÁÂ^ƒçèüÒ´@
¤Õ´
Þ× ×òBŒ²µ ê´
µ
Â$ë´
±°<ñ´
œ¬µ
¶•ÃΕÃë•ÃÃÂÃÂ^Ö ÖýPèüÿ¾2
´‚¿
ÞØ ØòBÔ^µ ™¿
µ
Ä$š¿
žåT ¿
üðÃ!
Ķ•ÅΕÅë•ÅÅÄÅÂ^©’¡”üíÓ"
„ðÓ
ÞÙ ÙòBµ Ô
µ
Æ$‚Ô
üœØ8
dŸØ
ÞÚ ÚòBŒ²µ ¬Ø
µ
Ç$­Ø
±°<³Ø
Ä‘Ú
2026-01-24 22:59:20 +00:00
t”Ú
ÞÛ ÛòBÔ^µ £Ú
µ
2026-01-24 22:59:20 +00:00
È$¤Ú
ÌýÚ
ȶ•ÉΕÉë•ÉÉÈÉÂ^©’èüÇÞ&
äÊÞ
ÞÜ ÜòBÔ^µ çÞ
µ
Ê$èÞ
ÌÁß
ʶ•ËΕËë•ËËÊËÂ^©’èüœã!
„¦ã
ÞÝ ÝòBÔ^µ ·ã
µ
Ì$¸ã
ì‘ä
œ”ä
2026-01-24 22:59:20 +00:00
ÞÞ ÞòBÔ^µ ¨ä
µ
Í$©ä
ô²å
¤µå
Þß ßòBÔ^µ Êå
µ
Î$Ëå
ü¥é
œ¯é
Þà àòBýPÏ,Ô^µÏ,ÐÐ Ìé
µ©âןüÿé/
ן¬’ü„ê*
ן¬’›Q\£ê
Ïן$Íé
 new_stateÁLÛé
callbackÁDõé
gi”ðì
϶•ÑΕÑë•ÑÑÏÑןÂ^ŸVˆUnparkÁŠSkipÁŒStopÁÀ§–㡨` É,É,qË,˜¸+»\¡Ø ÊýPD‘ò
϶•ÒΕÒë•ÒÒÏÒןƒçן½¢üÃõO
„Æõ
Þá áòBŒ²ýPµ ×õ
µ
Ó$Øõ
±°<Þõ

prev_valueÁTøõ
Çþ
Ó¶•ÔΕÔë•ÔÔÓÔÂ^ҳ膀
Ó¶•ÕΕÕë•ÕÕÓÕÂ^¶´Ô^Ô©€
Ó¶•ÖΕÖë•ÖÖÓÖÂ^–µè̸Ž
Ó¶•×Ε×ë•××Ó×Â^©’èü·”½
\º”
Þâ âòBŒ²ŸVÏ-ýPµÏ-ÙÙ Ï”
µ©âú§ô¨•
ãú§ ãýPÌ­•
ãú§ʨ$•
Øú§$Д
±°<Þ”
tokenÁ,€•
äDž•
validate_flagsÁtЕ
އž
ض•ÚΕÚë•ÚÚØÚú§Â^ҳꩵß
ض•ÛΕÛë•ÛÛØÛú§Â^¶´Ô^¤æŸ
ض•ÜΕÜë•ÜÜØÜú§Â^–µèÔ¾ª
„Áª
Þä äòBÔ^µ Òª
µ
Ý$Óª
ÔŒ¬
¬
Þå åòBÔ^µ  ¬
2026-01-24 22:59:20 +00:00
µ
Þ$¡¬
åæëíïòÃßà NonZeroUsizeÁdüº’ßáÄ$™ßã GetThreadIdÁ\ŸÞßäÔÑl¼ñQìŽADŽ(*´üü®MJ Implementation of the `GetThreadId` trait for `lock_api::ReentrantMutex`.Á\‡€Dău^´wæ'åå€Dü•'€Dèéßàé¼Ãçç€Düï+Œòæ æ€D£ £ ¤ Ϧ ì ™‘‹ÖqËîýPç ç
2026-01-24 22:59:20 +00:00
é$…Ùé¶•êΕêë•êêéê øMÕ°Ô^Ôµ üê?< A mutex which can be recursively locked by a single thread.Áª Ëü® FC This type is identical to `Mutex` except for the following points:Áõ Ëüù PM - Locking multiple times from the same thread will work correctly instead ofÁ”Ê
 deadlocking.ÁüÝ
PM - `ReentrantMutexGuard` does not give mutable references to the locked data.Áü® '$ Use a `RefCell` if you need this.ÁÖ ËüÚ KH See [`Mutex`](crate::Mutex) for more details about the underlying mutexÁ  primitive.Át¾ ììè÷ Í Ûaü¢Bü‡
2026-01-24 22:59:20 +00:00
EB Creates a new reentrant mutex in an unlocked state ready for use.ÁÍ