coblongjmp

cobsetjmp() 関数で、ローカルでない GO TO をエラーや例外の処理に使用できるようにします。
制約事項:

この関数は、ネイティブ COBOL でのみサポートされます。

構文:

#include "cobsetjmp.h"

void coblongjmp(struct cobjmp_buf *buf);

パラメーター:

buf 現在の実行環境が保存されるバッファー。

説明:

cobsetjmp() 関数は、buf で指定されたバッファーに、現在の COBOL プログラムと C 関数の環境を保存します。cobsetjmp() 関数は、0 の値を返す C ライブラリ関数 setjmp() を呼び出します。

cobsetjmp() の呼び出しに続いて、同じ C 関数内やそのサブプログラム (C または COBOL) 内で coblongjmp() が呼び出されると、cobsetjmp() を呼び出した直後の位置から実行が再開されます。

coblongjmp() の呼び出し後、cobsetjmp() はゼロ以外の値を返します。この戻り値をチェックすれば、cobsetjmp() の結果を知ることができます。

coblongjmp() と cobsetjmp() 関数の使用には、次のような制限があります。

  • cobsetjmp() と coblongjmp() を呼び出せるのは C プログラムのみです。COBOL プログラムから呼び出すことはできません。
  • coblongjmp() は、cobsetjmp() と同等、もしくは低い CALL/PERFORM 階層の制御フローのレベルで呼び出されなければなりません。両者の呼び出しの間には、上位のレベルに制御を渡さないでください。具体的には、cobsetjmp() を呼び出した C 関数が制御を戻さないようにします。
  • coblongjmp() が cobsetjmp() を呼び出した関数とは異なるレベルに制御を戻した場合は、それによって終了する各プログラムでエラーが発生しません。これらのプログラムは、同じ上位プログラムの実行中に必要に応じて呼び出すことができます。
  • cobsetjmp() の呼び出し後、CHAIN が実行された場合は、coblongjmp() は使用できません。
  • coblongjmp() は、エラー処理、終了処理、非同期シグナル ハンドラーでは使用できません。
  • coblongjmp() は、対応する cobsetjmp() の呼び出しと同じスレッドから呼び出す必要があります。
  • coblongjmp() は、対応する cobsetjmp() の後に初期化または変更されたスレッド同期オブジェクトをリセットしません。スレッドのデッドロックを防ぐために、それらのリセットが必要になる場合があります。
  • coblongjmp() は、対応する cobsetjmp() の後に割り当てられたメモリを解放しません。これはメモリ リークの原因になる可能性があります。

相当する COBOL 構文:

なし。

例:

次の例は、coblongjmp() と cobsetjmp() 関数の使用法を示しています。

void
some_c_func(void)
{
    struct cobjmp_buf buf;

    if (cobsetjmp(&buf) != 0)
    {
        cobprintf("Returned from coblongjmp\n");
        return;
    }
  
    /* Valid code here - for example can call COBOL */

    coblongjmp(&cobjmp_buf);
}