高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1129
Workaround for Asynchronous SCSIAction Crashes


Q: Mac OS X 10.1.x で、非同期の SCSIAction を呼び出そうとすると、私の CFM アプリケーションがクラッシュするのはなぜでしょうか?

A: あるバグ(r. 2649048)が原因で適切な Mach-O to CFM グルーが作成されてないために、SCSIAction がアプリケーションの CFM コールバック関数を呼び出そうとしたときに、アプリケーションはクラッシュしまいます。この問題を回避するには、NewSCSICallbackUPPDisposeSCSICallbackUPP を呼び出す代わりに以下に示すコードを実装するだけですみます。 根本のバグが修正されたときにこの回避コードを削除できるように、システムのアップデートや OS のメジャーリリースと同時に公開されるテクニカルノートを確認するのを忘れないでください。



SCSICallbackUPP
MyNewSCSICallbackUPP(SCSICallbackProcPtr cfmfp)
{

#if TARGET_RT_MAC_CFM


    long systemVersion = 0;


    if (Gestalt(gestaltSystemVersion, &systemVersion) == noErr && systemVersion >= 0x1010)
    {
        UInt32 temp[6] = {0x3D800000, 0x618C0000, 0x800C0000,
                          0x804C0004, 0x7C0903A6, 0x4E800420};

        // 割り当てメモリは後で破棄する必要がある
        UInt32 * mfp = (UInt32*) NewPtr(sizeof(temp));
        mfp[0] = temp[0] | ((UInt32)cfmfp >> 16);
        mfp[1] = temp[1] | ((UInt32)cfmfp & 0xFFFF);
        mfp[2] = temp[2];
        mfp[3] = temp[3];
        mfp[4] = temp[4];
        mfp[5] = temp[5];

        MakeDataExecutable(mfp, sizeof(temp));

        return ((SCSICallbackUPP)mfp);
    }
    else
    {
        return (NewSCSICallbackUPP(cfmfp));
    }

#else

    return (NewSCSICallbackUPP(cfmfp));

#endif

}



void
MyDisposeSCSICallbackUPP(SCSICallbackUPP fp)
{

#if TARGET_RT_MAC_CFM

    long systemVersion = 0;

    if (Gestalt(gestaltSystemVersion, &systemVersion) == noErr && systemVersion >= 0x1010)
    {
        DisposePtr((char *)fp);
    }
    else
    {
        DisposeSCSICallbackUPP(fp);
    }

#else

    DisposeSCSICallbackUPP(fp);

#endif

}

リスト 1 Mach-O to CFM グルーを作成するコード




[2002 年 3 月 18 日]