Technote 1122
Locking and Unlocking Handles
äÓëbäTîO
ÉnÉìÉhÉãÇΔÇÕÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇ™ä«óùÇ∑ÇÈÉÅÉÇÉäÉuÉçÉbÉNÇÃàÍéÌÇ≈Ç∑ÅBÉnÉìÉhÉãÇÕÉÅÉÇÉäÉuÉçÉbÉNÇä‘ê⁄ìIÇ…éQèΔÅiÉ|ÉCÉìÉ^ÇÃÉ|ÉCÉìÉ^ÅjÇ∑ÇÈÇΩÇflÅAÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇÕñæämÇ…íËã`Ç≥ÇÍÇΩèÛãµâ∫Ç≈džÇÍÇŒÅAÉÅÉÇÉäÉuÉçÉbÉNÇÉÅÉÇÉäãÛä‘ì‡Ç≈é©óRÇ…à⁄ìÆÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉnÉìÉhÉãÇ™éwÇ∑É|ÉCÉìÉ^ÇÕÉ}ÉXÉ^É|ÉCÉìÉ^ÇΔåƒÇŒÇÍǃǢNjÇ∑ÅBÉÅÉÇÉäÉuÉçÉbÉNÇ™à⁄ìÆÇ≥ÇÍǃLJÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇÕÉ}ÉXÉ^É|ÉCÉìÉ^ÇçXêVÇ∑ÇÈÇæÇØÇ≈ÅAÉnÉìÉhÉãÇÕïœÇÌÇÈDZÇΔǙdžÇËÇ‹ÇπÇÒÅBÅiÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇΔÉnÉìÉhÉãÇÃédëgÇÕInside Macintosh: MemoryëÊ1èÕÅuIntroduction to Memory ManagementÅvÇÃÅuHeap ManagementÅvÇ≈è⁄ǵÇ≠âê‡Ç≥ÇÍǃǢNjÇ∑ÅjÅB
ÉnÉìÉhÉãÇÃégópï˚ñ@Ç…ÇÊǡǃÇÕÅAÉçÉbÉNÅià⁄ìÆÇ≥ÇÍǻǢÇÊǧDžå≈íËÅjÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉÅÉÇÉäÇìÆÇ©Ç∑ÇÊǧǻä÷êîÅiíºê⁄ìIñîÇÕä‘ê⁄ìIÇ…ÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇÃä÷êîÇåƒÇ—èoǵǃÉÅÉÇÉäÇìÆÇ©Ç∑â¬î\ê´ÇÃdžÇÈä÷êîÅjÇ…ÉpÉâÉÅÅ[É^ÇΔǵǃÉÅÉÇÉäÉuÉçÉbÉNÇÃÉAÉhÉåÉXÇìnÇ∑èÍçáÇÕÅAǪÇÃÉÅÉÇÉäÉuÉçÉbÉNÇÃÉnÉìÉhÉãÇó\ÇflÉçÉbÉNÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBPtrAndHand ()ÇΔåæÇ§ÉcÅ[ÉãÉ{ÉbÉNÉXä÷êîÇÕä»íPÇ»ó·Ç≈Ç∑ÅBàÍï˚ÅAä‘ê⁄ìIÇ…ÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇåƒÇ—èoÇ∑ä÷êîÇÃó·ÇΔǵǃÅANewWindow () ǙdžÇËÇ‹Ç∑ÅBÇ‹ÇΩÅAÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇÕåƒÇ—èoÇ≥ǻǢǙÅAä÷êîÇåƒÇ—èoÇ∑çsà◊é©ëÃÇ™ÉÅÉÇÉäÇìÆÇ©ÇµÇƒÇµÇ‹Ç§Ç‡ÇÃǙdžÇËÇ‹Ç∑ÅBó·Ç¶ÇŒÅAÉÅÉÇÉäÇ…ì«Ç›çûÇ‹ÇÍǃǢǻǢÉRÅ[ÉhÉZÉOÉÅÉìÉgÉäÉ\Å[ÉXÇ…ä÷êîÇ™ä‹Ç‹ÇÍǃǢÇÈÇΔÅAÉäÉ\Å[ÉXÇì«Ç›çûÇfiDZÇΔÇ≈ÉÅÉÇÉäÇ™à⁄ìÆÇ≥ÇÍÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBÅiÉRÅ[ÉhÉZÉOÉÅÉìÉgÇÃédëgÇÕInside Macintosh: MemoryëÊ1èÕÅuIntroduction to Memory ManagementÅvÇÃÅuLoading Code SegmentsÅvÇΔInside Macintosh: ProcessesëÊ7èÕÅuSegment ManagerÅvÇ≈è⁄ǵÇ≠âê‡Ç≥ÇÍǃǢNjÇ∑ÅjÅB
ÉnÉìÉhÉãÇÃÉçÉbÉNÇ…ä÷Ç∑ÇÈñ‚ëË
ÉnÉìÉhÉãÇ…ÇÕÉçÉbÉNÇ≥ÇÍǃǢÇÈDZÇΔÇé¶Ç∑ÉtÉâÉOǙdžÇËÇ‹Ç∑Ç™ÅAÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇÕÉnÉìÉhÉãÇÃÉçÉbÉNÇ≥ÇÍÇΩâÒêîÇîcà¨ÇµÇƒÇ¢Ç‹ÇπÇÒÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉnÉìÉhÉãÇìÒìxÉçÉbÉNǵǃLJÅAÉçÉbÉNÇàÍìxâèúÇ∑ÇÈÇæÇØÇ≈ÉnÉìÉhÉãÇÕÇ∑ÇÆÇ…âèúèÛë‘ÇΔÇ»ÇËÇ‹Ç∑ÅBDZÇÃDZÇΔÇ©ÇÁÅAÉAÉãÉSÉäÉYÉÄǙdžÇÈíˆìxï°éGÇ…Ç»ÇÈÇΔÅAÉçÉbÉNÇΔÉçÉbÉNÇÃâèúÇàÍívÇ≥ÇπÇÈÇæÇØÇ≈ÇÕë´ÇËÇ‹ÇπÇÒÅBà»â∫ÇÃÉRÅ[ÉhÇÕÉnÉìÉhÉãä«óùÇÃà´Ç¢ó·Ç≈Ç∑ÅB
static pascal OSErr Unsafe_DoSomethingToHandle (Handle h)
{
OSErr err = noErr;
HLock (h);
if (!(err = MemError ())) {
err = DoSomethingToPointer (*h);
HUnlock (h); // äÎåØ!
if (!err)
err = MemError ();
}
return err;
}
|
Unsafe_DoSomethingToHandle () Ç…ìnÇ≥ÇÍÇΩÉnÉìÉhÉãÉpÉâÉÅÅ[É^Ç™åƒÇ—èoǵë§ÇÃÉRÅ[ÉhÇ…ÇÊǡǃÉçÉbÉNÇ≥ÇÍǃǢÇΩèÍçáÇ≈LJÅAUnsafe_DoSomethingToHandle () ÇÕHUnlock () Çé¿çsÇ∑ÇÈÇΩÇflÅAÉnÉìÉhÉãÇÃÉçÉbÉNÇÕǢǬLJâèúÇ≥ÇÍǃǵNjǢNjÇ∑ÅBDZÇÃåãâ ÅAUnsafe_DoSomethingToHandle é¿çså„ÇÕåƒÇ—èoǵë§ÇÃÉRÅ[ÉhÇ™í…Ç¢ñ⁄Ç…âÔǧâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅB
è„ãLÇÃÉRÅ[ÉhÇÕÇÌÇ©ÇËÇ‚Ç∑Ç¢ó·Ç≈Ç∑Ç™ÅAÉAÉãÉSÉäÉYÉÄÇ™ï°éGÇ…Ç»ÇÈÇΔÉfÉoÉbÉOÇÕîÒèÌÇ…ç¢ìÔÇ≈Ç∑ÅBÉnÉìÉhÉãÇÃÉçÉbÉNÇ™ï€ÇΩÇÍÇÈDZÇΔÇëOíÒDžǵǃǢÇÈÉRÅ[ÉhÇÕÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇä‹ÇflǃÅAñ‚ëËÇÃå¥àˆÇΔǻǡǃǢÇÈÉRÅ[ÉhÇΔëSëRà·Ç§èäDždžÇÈǩLJǵÇÍÇ‹ÇπÇÒÅBÉeÉbÉNÉmÅ[Ég1118ÅuGDHandleÇÃÉçÉbÉNâèúÇÃñ‚ëËDžǬǢǃÅvÇÕÉVÉXÉeÉÄÉ\ÉtÉgÉEÉFÉAÇ™ÉnÉìÉhÉãÇÃÉçÉbÉNÇ…àÀë∂Ç∑ÇÈàÍó·Çè–âÓǵǃǢNjÇ∑ÅB
âåàï˚ñ@
àÍî ìIÇ»âåàï˚ñ@ÇÕä÷êîíPà Ç‚ÉAÉãÉSÉäÉYÉÄíPà Ç≈ÉnÉìÉhÉãÇÃëÆê´Çï€ë∂Ç∑ÇÈDZÇΔÇ≈Ç∑ÅB
èdóvÅF
ǢǬLJÉnÉìÉhÉãÇÃëÆê´Çï€ë∂Ç∑ÇÈDZÇΔÇ≈è„ãLÇÃÇÊǧǻñ‚ëËÇÕäÆëSÇ…îÇØÇÁÇÍÇ‹Ç∑ÅBÇΩÇæÇµÅAÉnÉìÉhÉãÇÃëÆê´Çï€ë∂ǵǻÇ≠ǃLJó«Ç¢èÍçáLJdžÇËÇ‹Ç∑ÇÃÇ≈ÅAñ≥ë Ç»çsà◊ÇΔÇ»ÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBïKóvÇ»éûÇæÇØÇ…ÉnÉìÉhÉãÇÃëÆê´Çï€ë∂ǵÇΩÇ¢èÍçáÇÕÅAï€ë∂ÇïKóvÇΔÇ∑ÇÈèÛãµÇó«Ç≠óùâÇ∑ÇÈDZÇΔÇ™èdóvÇ≈Ç∑ÅBÉnÉìÉhÉãÇÃëÆê´Çï€ë∂ǵǻÇ≠ǃLJó«Ç¢èÛãµÇÕDZÇÃÉeÉbÉNÉmÅ[ÉgÇÃç≈å„ÇÃï˚Ç≈è–âÓÇ≥ÇÍǃǢNjÇ∑ÅBǵǩǵÅAì˙ç†Ç©ÇÁà¿ëSèdéãÇ≈ÉRÅ[ÉhÇèëǢǃǢÇÈï˚ÇÕDZÇÍÇÁÇñ≥éãǵǃÅAèÌÇ…ÉnÉìÉhÉãÇÃëÆê´Çï€ë∂Ç∑ÇÈÇÊǧDžêSÇ™ÇØÇƒâ∫Ç≥Ç¢ÅB |
ÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇÕäeÉnÉìÉhÉãDžǬǢǃëÆê´ÅiêîÉrÉbÉgÇÃÉtÉâÉOÅjÇä«óùǵǃǢNjÇ∑ÅBDZÇÃÉtÉâÉOÇÃì‡àÍǬÇÕÉçÉbÉNèÛãµÇ≈Ç∑ÅBÉnÉìÉhÉãÇÃÉçÉbÉNèÛãµÇímÇÈÇ…ÇÕHGetState () ÇóòópǵNjÇ∑ÅBà»â∫ÇÃó·ÇÕÇ∑Ç◊ǃHGetState () ÇóòópǵǃǢNjÇ∑ÅB
ê≥ǵǢÉçÉbÉNï˚ñ@ǪÇÃ1
LJǡÇΔLJä»íPÇ»ï˚ñ@ÇÕÉnÉìÉhÉãÇÃëÆê´Çä€Ç≤ÇΔï€ë∂ǵǃÅAèIóπéûÇ…å≥Ç…ñflÇ∑ï˚ñ@Ç≈Ç∑ÅBÉnÉìÉhÉãÇÃÉçÉbÉNèÛãµÇé¶Ç∑ÉtÉâÉOÇÕé¿çsëOÇΔé¿çså„Ç≈ìØÇ∂ílÇ»ÇÃÇ≈ÅAÉnÉìÉhÉãÇÃÉçÉbÉNèÛãµÇÕï€ÇΩÇÍÇ‹Ç∑ÅBà»â∫ÇÕìTå^ìIÇ»ÉRÅ[Éhó·Ç≈Ç∑ÅB
static pascal OSErr SafeOne_DoSomethingToHandle (Handle h)
{
OSErr err = noErr;
SInt8 hState = HGetState (h);
if (!(err = MemError ())) {
HLock (h);
if (!(err = MemError ())) {
err = DoSomethingToLockedHandle (h);
HSetState (h,hState);
if (!err)
err = MemError ();
}
}
return err;
}
|
DZÇÃï˚ñ@ÇÕà¿ëSÇ≈Ç∑Ç™ÅAÉnÉìÉhÉãÇÃëÆê´ÇÇ∑Ç◊ǃï€Ç¬ÇΩÇflÅADoSomethingToLockedHandle () Ç™ÉçÉbÉNèÛãµà»äOÇÃëÆê´Åió·Ç¶ÇŒÉnÉìÉhÉãÇÃÉpÅ[ÉWèÛãµÅjÇïœçXǵǃLJHSetState () Ç≈ïœçXÇ™ë≈Çøè¡Ç≥ÇÍǃǵNjǢNjÇ∑ÅB
ê≥ǵǢÉçÉbÉNï˚ñ@ǪÇÃ2
LJǧè≠ǵçÇìxÇ»ï˚ñ@ÇÕÉnÉìÉhÉãÇÃëÆê´Çó\ÇflämîFǵǃÅAÉçÉbÉNÇ≥ÇÍǃǢǻǢéûÇæÇØÉnÉìÉhÉãÇÃÉçÉbÉNÇΔÉçÉbÉNÇÃâèúÇçsǧï˚ñ@Ç≈Ç∑ÅBà»â∫ÇÕìTå^ìIÇ»ÉRÅ[Éhó·Ç≈Ç∑ÅB
enum { kHandleLockMask = 0x80 }; // <MacMemory.h> 3.0.1Ç©ÇÁî≤ÇØÇƒÇ¢ÇÈÇΩÇfl
static pascal OSErr SafeTwo_DoSomethingToHandle (Handle h)
{
OSErr err = noErr;
SInt8 hState = HGetState (h);
if (!(err = MemError ())) {
Boolean handleWasLocked = (kHandleLockMask & hState) ? true : false;
if (!handleWasLocked) {
HLock (h);
err = MemError ();
}
if (!err) {
err = DoSomethingToLockedHandle (h);
if (!handleWasLocked) {
HUnlock (h);
err = MemError ();
}
}
}
return err;
}
|
DZÇÃï˚ñ@Ç≈ÇÕÉçÉbÉNèÛãµà»äOÇÃëÆê´Ç™âeãøÇ≥ÇÍÇÈêSîzÇÕdžÇËÇ‹ÇπÇÒÇ™ÅAåáì_ÇÕÉRÅ[Éhé©ëÃÇÃï°éGÇ≥Ç≈Ç∑ÅBDZÇÃÇÊǧǻÉRÅ[ÉhÇÕÇÌÇ©ÇËÇ…Ç≠Ç¢ê´éøÇ™Ç†ÇÈÇÃÇ≈ÅADTSÇÃÉIÉ^ÉNÇèúÇØÇŒÇ±ÇÃï°éGÇ≥ÇÕîÇØÇΩÇ¢ÇΔDZÇÎÇ≈ǵÇÂǧÅiÇ‡ÇøÇÎÇÒÅADZDZÇ≈åæÇ§DTSÇΔÇÕdžÇ≠Ç‹Ç≈LJïƒçëñ{é–ÇéwǵǃǢNjÇ∑ÅjÅBÇ‹ÇΩÉnÉìÉhÉãÇÃêîÇ™ëùÇ∑ÇΔÉRÅ[ÉhÇèëÇ´ä‘à·Ç¶ÇƒÇµÇ‹Ç§ämó¶Ç™è„Ç™ÇÈÇÃLJéñé¿Ç≈Ç∑ÅB
è„ãLÇÃÉAÉãÉSÉäÉYÉÄÇC++ÇÃÉNÉâÉXÇ≈ïÔÇÒÇ≈ǵNjǧÇΔï°éGÇ≥Çè≠ǵä…òaÇ≈Ç´Ç‹Ç∑ÅBC++ÉNÉâÉXÇÃconstructorÇ≈ÇÕÉnÉìÉhÉãÇïKóvÇ…âûÇ∂ǃÉçÉbÉNǵÅAdestructorÇ≈ïKóvÇ…âûÇ∂ǃÉçÉbÉNÇâèúǵNjÇ∑ÅBÇ‹ÇΩÅAC++ÇÃÉNÉâÉXÇégǧDZÇΔÇ…ÇÊǡǃÉGÉâÅ[Ç‚exceptionÇ™î≠ê∂ǵÇΩéûÇ≈LJÉçÉbÉNÇ™é©ìÆìIÇ…âèúÇ≥ÇÍÇÈóòì_ǙdžÇËÇ‹Ç∑ÅB
ÉnÉìÉhÉãÇÃëÆê´Çï€ë∂ǵǻÇ≠ǃLJó«Ç¢èÍçá
ÉnÉìÉhÉãÇÃëÆê´Çï€ë∂ǵǻÇ≠ǃLJó«Ç¢èÍçáÇÕïsïKóvÇ»ÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÇÃóòópÇçTǶÇÈDZÇΔÇ≈ç≈ìKâªÇê}ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBç≈ìKâªÇÕïKÇ∏è\ï™Ç»åvë™ÇǵǃǩÇÁçsǡǃâ∫Ç≥Ç¢ÅBÇ‹ÇΩÅAà¿íËê´ÇëπǻǧÇΔÇπǡǩÇ≠ÇÃç≈ìKâªÇ‡ñ≥à”ñ°Ç≈Ç∑ÅB
ÉnÉìÉhÉãÇÉçÉbÉNǵǻǢ
ÉnÉìÉhÉãÇÉçÉbÉNÇµÇ»ÇØÇÍÇŒÅAÉnÉìÉhÉãÇÃëÆê´Çï€ë∂Ç∑ÇÈïKóvLJñ≥Ç≠Ç»ÇËÇ‹Ç∑ÅBDZÇÍÇÕìñÇËëOÇÃÇÊǧÇ≈Ç∑Ç™ÅAïKóvLJǻǢÇÃÇ…ÉnÉìÉhÉãÇÉçÉbÉNǵǃǢÇÈÉRÅ[ÉhÇ™ëÚéRdžÇËÇ‹Ç∑ÅBÉÅÉÇÉäÉ}ÉlÅ[ÉWÉÉÅiñîÇÕëºÇÃÉ}ÉlÅ[ÉWÉÉÇÃä‘ê⁄ìIÇ»çsà◊ÅjÇ™ÉÅÉÇÉäÉuÉçÉbÉNÇà⁄ìÆÇ∑ÇÈÉ^ÉCÉ~ÉìÉOÇóùâÇ∑ÇÈDZÇΔÇ≈ïsïKóvÇ»ÉnÉìÉhÉãÇÃÉçÉbÉNÇ™îÇØÇÁÇÍÇ‹Ç∑ÅBó·Ç¶ÇŒÅAÉfÉxÉçÉbÉpÅEÉeÉNÉjÉJÉãÅEÉTÉ|Å[ÉgÇ≈ÇÕà»â∫ÇÃÇÊǧǻÉRÅ[ÉhÇó«Ç≠å©Ç©ÇØÇ‹Ç∑ÅB
static pascal OSErr UnnecessaryHandleLock (Handle h)
{
OSErr err = noErr;
SInt8 hState = HGetState (h);
if (!(err = MemError ())) {
HLock (h);
if (!(err = MemError ())) {
**h = 12; // ÇΩǩǙDZÇÃÇΩÇflÇ…ÉçÉbÉNÇ?
HSetState (h, hState);
if (!err)
err = MemError ();
}
}
return err;
}
|
çXÇ…ÅAÉnÉìÉhÉãÇÉçÉbÉNǵǻÇ≠ǃLJó«Ç¢èÛãµÇóòópÇ∑ÇÈÇæÇØÇ…é~Ç‹ÇÁÇ∏ÅAÉnÉìÉhÉãÇÉçÉbÉNǵǻÇ≠ǃLJó«Ç¢ÇÊǧDžÉRÅ[ÉhÇê›åvÇ∑ÇÈDZÇΔLJâ¬î\Ç≈Ç∑ÅBó·Ç¶ÇŒÅAÉÅÉÇÉäÉuÉçÉbÉNÇÃàÍïîÇïœçXÇ∑ÇÈÇÊǧǻèÍçáÇÕïœçXÇàÍíUÉçÅ[ÉJÉãïœêîÇ…ï€ë∂ǵǃÅAç≈èIìIÇ…ÉÅÉÇÉäÉuÉçÉbÉNÇ…èëÇ´à⁄ǵNjÇ∑ÅBà»â∫ÇÃó·ÇÇ≤óóâ∫Ç≥Ç¢ÅB
static pascal OSErr AvoidHandleLock (Handle h)
{
OSErr err = noErr;
char c = **h;
err = DoSomethingToCharacter (&c);
if (!err)
**h = c;
return err;
}
|
ìΔêËìIÇ…ÉnÉìÉhÉãÇóòópÇ∑ÇÈèÍçá
ÉRÅ[ÉhÇÃàÍïîÇ™ìΔêËìIÇ…ÉnÉìÉhÉãÇóòópǵǃǢÇÈèÍçáÇÕÅAëºÇÃä÷êîǙǪÇÃÉnÉìÉhÉãÇ…óäÇÈêSîzǙǻǢÇÃÇ≈ÅAé©óRÇ…ÉçÉbÉNñîÇÕÉçÉbÉNÇÃâèúÇ™çsǶNjÇ∑ÅB
ó·Ç¶ÇŒÅAÉRÅ[ÉhÇÃàÍïîÇ™äOÇ…å©Ç¶Ç»Ç¢ì‡ïîÉoÉbÉtÉ@ÇÉnÉìÉhÉãÇΔǵǃéùǡǃǢÇÈèÍçáÇÕÅAǪÇÃÉRÅ[ÉhÇ™ÉnÉìÉhÉãÇÃê∂ê¨Ç©ÇÁâï˙Ç‹Ç≈ÇÇ∑Ç◊ǃä«óùÇ∑ÇÈÇΩÇflÅAìΔêËìIÇ…ÉnÉìÉhÉãÇóòópǵǃǢÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
LJǧàÍǬÇÃó·ÇÕàÍéûìIÇ…ÉoÉbÉtÉ@ÇäÑÇËìñǃǃÅAèIóπíºëOÇ…âï˙Ç∑ÇÈÉRÅ[ÉhÇ≈Ç∑ÅBNewHandle () Ç™ê∂ê¨Ç∑ÇÈÉnÉìÉhÉãÇÕÉçÉbÉNÇ≥ÇÍÇ‹ÇπÇÒÇ™ÅADisposeHandle () ÇÕÉçÉbÉNÇ≥ÇÍÇΩÉnÉìÉhÉãLJéÛÇØïtÇØÇ‹Ç∑ÇÃÇ≈à»â∫ÇÃÇÊǧǻÉAÉãÉSÉäÉYÉÄÇ™ê¨óßǵNjÇ∑ÅB
static pascal OSErr SafeThree_DoSomethingToHandle (void)
{
OSErr err = noErr;
Handle h = NewHandle (12);
if (!h)
err = MemError ( );
else
{
HLock (h);
err = MemError ( );
if (!err)
err = DoSomethingToLockedHandle (h);
DisposeHandle (h);
if (!err)
err = MemError ( );
}
return err;
}
|
äTóv
HLock () ÇΔHUnlock () ÇæÇØÇ≈ÇÕÉnÉìÉhÉãÇÃëÆê´Çà¿ëSÇ…ï€ÇƒÇ»Ç¢èÍçáÇ™ëΩÇ¢Ç≈Ç∑ÅBÉnÉìÉhÉãÇÃëÆê´Çï€ë∂ǵǃÅAå≥Ç…ñflÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBÉnÉìÉhÉãÇÃëÆê´Çï€ë∂ǵǻÇ≠ǃLJó«Ç¢èÍçáLJdžÇËÇ‹Ç∑Ç™ÅAï€ë∂ǵǻǢÇΔëIÇÒÇæèÍçáÇÕèÛãµÇó«Ç≠óùâǵÇΩè„Ç≈ÉRÅ[ÉhÇèëǢǃâ∫Ç≥Ç¢ÅBé©êMǙǻǢèÍçáÇÕÉnÉìÉhÉãÇÃëÆê´ÇèÌÇ…ï€ë∂ǵǃÅAå≥Ç…ñflÇ∑ÇÃÇ™à¿ëSÇ≈Ç∑ÅB
|