DLL ロードのインクリメントおよびデクリメント
2 つのクラスで同じライブラリをロードした場合、そのライブラリは、$ZF(-4,2,dll_id) または $ZF(-4,4,dll_index) の最初の呼び出しによってアンロードされます。これにより、ライブラリにアクセスせずにもう片方のクラスが立ち往生する場合があります。このため、InterSystems IRIS は、各 DLL の参照カウントをサポートします。InterSystems IRIS は、$ZF(-4,1,dll_name) でライブラリがロードされた回数の参照カウントを保持します。$ZF(-4,1,dll_name) を呼び出すごとに参照カウントが増加します。
$ZF(-4,2) は、オプションのデクリメント・フラグ引数 decr_flag を提供します。$ZF(-4,2,dll_id,1) を呼び出すごとに参照カウントが 1 ずつ減少します。$ZF(-4,2,dll_id,1) の呼び出しにより、参照カウントがゼロになった場合にライブラリがアンロードされます。$ZF(-4,2,dll_id) (または $ZF(-4,2,dll_id,0)) を呼び出すと、参照カウントは無視され、直ちにライブラリがアンロードされます。
$ZF(-4,5) または $ZF(-4,7) を呼び出すと、ライブラリ・インデックスが作成されます。その後、関数を実行するために $ZF(-6) を呼び出すと、ライブラリが暗黙的にロードされ、参照カウントが増加します。$ZF(-4,4,dll_index,1) を呼び出すごとにこの参照カウントが 1 ずつ減少します。
dll_name と dll_index によって確立された参照カウント間の参照カウントの相互作用は以下のとおりです。
-
参照カウントがゼロにならない限り、$ZF(-4,1,dll_name) でロードされたライブラリは、$ZF(-4,4,dll_index,1) の呼び出しによってアンロードされません。
-
参照カウントに関係なく、$ZF(-4,1,dll_name) でロードされたライブラリは、$ZF(-4,2,dll_id) または $ZF(-4,4,dll_index) (デクリメント・フラグ引数なし) のいずれかによって直ちにアンロードされます。
-
参照カウントがゼロになった場合でも、$ZF(-6) で暗黙的にロードされたライブラリは、$ZF(-4,2,dll_id,1) によってアンロードされません。$ZF(-4,4,dll_index,1) によってのみアンロード可能です。
-
参照カウントに関係なく、$ZF(-6) で暗黙的にロードされたライブラリは、$ZF(-4,2,dll_id) または $ZF(-4,4,dll_index) (デクリメント・フラグ引数なし) のいずれかによって直ちにアンロードされます。
参照カウントに関係なく、また $ZF(-4,1,dll_name) でロードされたのか $ZF(-6) で暗黙的にロードされたのかに関係なく、dll_id 引数のない $ZF(-4,2) は、すべてのライブラリを直ちにアンロードします。