(57)【要約】【課題】  依存関係にある複数の関数の修正を、通信を停止させずに、かつ、システムの誤動作を引き起こさずに実行する。【解決手段】  本発明は、本体プログラムが中間テーブルを介して呼出す関数を修正した関数に置き換えるものであり、複数の関数には依存関係がある。置き換え起動時に、依存関係がある複数の関数のうち、本体プログラムが最初に呼び出そうとする関数への呼出しを抑止し、本体プログラムにおける各スレッドのスタックをトレースし、置換え対象の関数を呼出し中のスレッドがあるか確認し、呼出し中のスレッドがあれば、抑止状態を解除し、そのスレッドについて呼出し関数の実行を完了させ、抑止状態に戻す。その後、中間テーブルにおける関数のアドレスを修正後の関数のアドレスへ書き換えた後、呼出し抑止状態を解除する。【選択図】      図４
2015041273.tif 000002
【特許請求の範囲】
【請求項１】
本体プログラムが中間テーブルを介して呼出す、引数と呼ばれるデータを受け取って定められた通りの処理を実行して結果を返すプログラム部分である関数を、修正した関数に置き換えるプログラム更新システムにおいて、
置き換え起動時に、依存関係がある複数の関数のうち、上記本体プログラムが最初に呼び出そうとする最上位依存元関数への呼出しを抑止する呼出抑止手段と、
上記本体プログラムが内蔵する各スレッドのスタックをトレースし、置換え対象の関数を呼出し中のスレッドがあるか確認し、置換え対象の関数を呼出し中のスレッドがあれば、抑止状態を解除し、そのスレッドについて呼出し関数の実行を完了させ、抑止状態に戻す関数非実行保証手段と、
置換え対象の関数を呼出し中のスレッドがない状態で、上記中間テーブルにおける関数のアドレスを、修正前の関数のアドレスから修正後の関数のアドレスへ書き換えるアドレス書換手段と、
アドレスの書換え後に、上記本体プログラムからの最上位依存元関数の呼出し抑止状態を解除する呼出抑止解除手段と
を有することを特徴とするプログラム更新システム。
【請求項２】
本体プログラムが中間テーブルを介して呼出す、引数と呼ばれるデータを受け取って定められた通りの処理を実行して結果を返すプログラム部分である関数を、修正した関数に置き換えるプログラム更新方法において、
置き換え起動時に、依存関係がある複数の関数のうち、上記本体プログラムが最初に呼び出そうとする最上位依存元関数への呼出しを抑止する呼出抑止ステップと、
上記本体プログラムが内蔵する各スレッドのスタックをトレースし、置換え対象の関数を呼出し中のスレッドがあるか確認し、置換え対象の関数を呼出し中のスレッドがあれば、抑止状態を解除し、そのスレッドについて呼出し関数の実行を完了させ、抑止状態に戻す関数非実行保証ステップと、
置換え対象の関数を呼出し中のスレッドがない状態で、上記中間テーブルにおける関数のアドレスを、修正前の関数のアドレスから修正後の関数のアドレスへ書き換えるアドレス書換ステップと、
アドレスの書換え後に、上記本体プログラムからの最上位依存元関数の呼出し抑止状態を解除する呼出抑止解除ステップと
を有することを特徴とするプログラム更新方法。
【請求項３】
本体プログラムが中間テーブルを介して呼出す、引数と呼ばれるデータを受け取って定められた通りの処理を実行して結果を返すプログラム部分である関数を、修正した関数に置き換える機能を備えた通信装置に搭載されるコンピュータを、
置き換え起動時に、依存関係がある複数の関数のうち、上記本体プログラムが最初に呼び出そうとする最上位依存元関数への呼出しを抑止する呼出抑止手段と、
上記本体プログラムが内蔵する各スレッドのスタックをトレースし、置換え対象の関数を呼出し中のスレッドがあるか確認し、置換え対象の関数を呼出し中のスレッドがあれば、抑止状態を回除し、そのスレッドについて呼出し関数の実行を完了させ、抑止状態に戻す関数非実行保証手段と、
置換え対象の関数を呼出し中のスレッドがない状態で、上記中間テーブルにおける関数のアドレスを、修正前の関数のアドレスから修正後の関数のアドレスへ書き換えるアドレス書換手段と、
アドレスの書換え後に、上記本体プログラムからの最上位依存元関数の呼出し抑止状態を解除する呼出抑止解除手段と
して機能させることを特徴とするプログラム更新プログラム。
【請求項４】
請求項１に記載のプログラム更新システムを有することを特徴とする通信装置。
【請求項５】
当該通信装置がアクセスゲートウェイであることを特徴する請求項４に記載の通信装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム更新システム、プログラム更新方法及びプログラム更新プログラム、並びに、通信装置に関し、例えば、複数の加入者回線を集線する、ＩＰ（Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）網へのアクセスネットワーク向けゲートウェイであるアクセスゲートウェイ（Ａｃｃｅｓｓ  Ｇａｔｅｗａｙ；ＡＧＷ）に適用し得るものである。
【背景技術】
【０００２】
アクセスゲートウェイにおける処理は、主として、ＣＰＵによるソフトウェア（アクセスゲートウェイプログラム）の実行によりなされる。また、アクセスゲートウェイは、常時、通信をサポートする状態にあることが求められる。
【０００３】
アクセスゲートウェイをアクセスゲートウェイとして機能させるアクセスゲートウェイプログラムは、プログラムであるため、適宜、バージョンアップする必要があるが、通信をサポートする状態に常にあるという制約下でバージョンアップを行うことを要する。
【０００４】
プログラムの実行を停止することなく、プログラムの構成要素や構成単位（ここでは関数と呼ぶ）を更新する方法として、特許文献１や特許文献２に記載の方法（以下、プラグイン方式と呼ぶこともある）がある。このプラグイン方式は、プログラムの立上げ時（ビルド時）に行う前処理と、更新時に行う更新処理本体とでなる。
【０００５】
プログラムのビルド時には、生成したオブジェクトファイルからｎｍコマンド（ＵＮＩＸ（登録商標）やそれに類似したオペレーティングシステムで採用されているコマンドの種類）によってグローバル関数の関数名を抽出し、関数単位で中間テーブルを作成し、共有ライブラリ化する。そして、プログラムを実行し、ライブラリをロードする際に、メモリにマッピングされた関数のアドレスを解決し、中間テーブルに設定する。
【０００６】
通常のプログラムの実行時においては、図６（Ａ）に示すように、本体プログラム４１によって、関数（図６ではｆｕｎｃＡ）が実行される際、中間テーブル４２を経由し、中間テーブル４２に設定された関数のライブラリ４３のアドレス０ｘａｂｃｄａｂｃｄにジャンプすることで関数コールを実現している。
【０００７】
上述のような中間テーブル４２を経由する構成としておくことにより、プログラムの実行を停止することなく、関数を更新することができる。
【０００８】
関数の更新時においては、図６（Ｂ）に示すように、修正した関数に係る部分プログラムを共有ライブラリ（プラグインライブラリ）４４として予め作成し、プラグイン適用コマンドによってプラグインライブラリ４４を動的にロードし、修正した関数のアドレスを解決し、中間テーブル４２における該当する関数のライブラリのアドレスをプラグインライブラリ４４のアドレス０ｘ０１２３０１２３に書き換える。
【０００９】
中間テーブル４２におけるアドレスの書き換えによって、次回の関数の呼出しから、修正後の関数ｆｕｎｃＡが実行されるようになる。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００５−２８４９２５号公報
【特許文献２】特開２０１０−１３０６２０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、上述した従来のプラグイン方式では、他の関数と依存関係がある関数の更新に適用する際、正常に動作しない場合が生じる恐れがあった。
【００１２】
図７は、かかる課題が発生する場合を示している。
【００１３】
例えば、ｆｕｎｃＡ、ｆｕｎｃＢという２つの関数を修正し、プラグイン方式を適用させるとする。２つの関数ｆｕｎｃＡ及びｆｕｎｃＢは、関数ｆｕｎｃＡから関数ｆｕｎｃＢが呼出されるという依存関係にある。また、関数ｆｕｎｃＡの修正処理には関数ｆｕｎｃＢの修正処理が必須であり、関数ｆｕｎｃＢの修正処理には関数ｆｕｎｃＡの修正処理が必須である。
【００１４】
従来のプラグインイン方式では、中間テーブル４２の書き換え処理を１命令で実行することによって、１つの関数については、中間テーブル４２の書き換え中に該当関数が起動されることがないことを保証していた。しかし、この例のように、プラグイン投入時（修正ライブラリのロード時）に、関数ｆｕｎｃＡ及びｆｕｎｃＢが共に実行されていないこと、及び、プラグイン適用完了（修正処理の完了）まで関数ｆｕｎｃＡ及びｆｕｎｃＢが実行されないことを保証することができない。そのため、修正前の関数ｆｕｎｃＡから修正後の関数ｆｕｎｃＢが実行されるなどの事象が発生し、正常に動作しない恐れがある。すなわち、図７に示すように、修正前の関数ｆｕｎｃＡの実行中で修正前の関数ｆｕｎｃＢの実行前にプラグインが適用され、関数ｆｕｎｃＡの実行時のジャンプ先アドレスや関数ｆｕｎｃＢの実行時のジャンプ先アドレスが書き換えられた場合、修正前の関数ｆｕｎｃＡが既に実行中であるため、その実行によって関数ｆｕｎｃＢを読み出す際には、修正後の関数ｆｕｎｃＢが読み出され、修正前の関数ｆｕｎｃＡと修正後の関数ｆｕｎｃＢとの不整合のため、関数ｆｕｎｃＢの処理が正常に動作しない。最悪の場合、プログラムが異常終了してしまう恐れがあり、これでは、通信をサポートする状態に常にあるという制約下を満足できない。
【００１５】
アクセスゲートウェイでは、複数の呼処理スレッドが非同期的に呼処理を実行しているため、プラグイン適用時（修正ライブラリのロード時）に、修正対象の修正前の関数ｆｕｎｃＡ、ｆｕｎｃＢが実行されていないことを保証することは困難であり、そのため、従来のアクセスゲートウェイでは、このような依存関係にある複数の関数のプラグイン方式による修正を適用不可としていた。
【００１６】
そのため、依存関係にある複数の関数の修正を、通信を停止させることなく適切に実行できるプログラム更新システム、プログラム更新方法及びプログラム更新プログラム、並びに、通信装置が望まれている。
【課題を解決するための手段】
【００１７】
第１の本発明は、本体プログラムが中間テーブルを介して呼出す、引数と呼ばれるデータを受け取って定められた通りの処理を実行して結果を返すプログラム部分である関数を、修正した関数に置き換えるプログラム更新システムにおいて、（１）置き換え起動時に、依存関係がある複数の関数のうち、上記本体プログラムが最初に呼び出そうとする最上位依存元関数への呼出しを抑止する呼出抑止手段と、（２）上記本体プログラムが内蔵する各スレッドのスタックをトレースし、置換え対象の関数を呼出し中のスレッドがあるか確認し、置換え対象の関数を呼出し中のスレッドがあれば、抑止状態を解除し、そのスレッドについて呼出し関数の実行を完了させ、抑止状態に戻す関数非実行保証手段と、（３）置換え対象の関数を呼出し中のスレッドがない状態で、上記中間テーブルにおける関数のアドレスを、修正前の関数のアドレスから修正後の関数のアドレスへ書き換えるアドレス書換手段と、（４）アドレスの書換え後に、上記本体プログラムからの最上位依存元関数の呼出し抑止状態を解除する呼出抑止解除手段とを有することを特徴とする。
【００１８】
第２の本発明は、本体プログラムが中間テーブルを介して呼出す、引数と呼ばれるデータを受け取って定められた通りの処理を実行して結果を返すプログラム部分である関数を、修正した関数に置き換えるプログラム更新方法において、（１）置き換え起動時に、依存関係がある複数の関数のうち、上記本体プログラムが最初に呼び出そうとする最上位依存元関数への呼出しを抑止する呼出抑止ステップと、（２）上記本体プログラムが内蔵する各スレッドのスタックをトレースし、置換え対象の関数を呼出し中のスレッドがあるか確認し、置換え対象の関数を呼出し中のスレッドがあれば、抑止状態を解除し、そのスレッドについて呼出し関数の実行を完了させ、抑止状態に戻す関数非実行保証ステップと、（３）置換え対象の関数を呼出し中のスレッドがない状態で、上記中間テーブルにおける関数のアドレスを、修正前の関数のアドレスから修正後の関数のアドレスへ書き換えるアドレス書換ステップと、（４）アドレスの書換え後に、上記本体プログラムからの最上位依存元関数の呼出し抑止状態を解除する呼出抑止解除ステップとを有することを特徴とする。
【００１９】
第３の本発明は、本体プログラムが中間テーブルを介して呼出す、引数と呼ばれるデータを受け取って定められた通りの処理を実行して結果を返すプログラム部分である関数を、修正した関数に置き換える機能を備えた通信装置に搭載されるコンピュータを、（１）置き換え起動時に、依存関係がある複数の関数のうち、上記本体プログラムが最初に呼び出そうとする最上位依存元関数への呼出しを抑止する呼出抑止手段と、（２）上記本体プログラムが内蔵する各スレッドのスタックをトレースし、置換え対象の関数を呼出し中のスレッドがあるか確認し、置換え対象の関数を呼出し中のスレッドがあれば、抑止状態を回除し、そのスレッドについて呼出し関数の実行を完了させ、抑止状態に戻す関数非実行保証手段と、（３）置換え対象の関数を呼出し中のスレッドがない状態で、上記中間テーブルにおける関数のアドレスを、修正前の関数のアドレスから修正後の関数のアドレスへ書き換えるアドレス書換手段と、（４）アドレスの書換え後に、上記本体プログラムからの最上位依存元関数の呼出し抑止状態を解除する呼出抑止解除手段として機能させることを特徴とする。
【００２０】
第４の本発明の通信装置は、第１の本発明のプログラム更新システムを有することを特徴とする。
【発明の効果】
【００２１】
本発明によれば、依存関係にある複数の関数の修正を、通信を停止させることなく適切に実行することができるようになる。
【図面の簡単な説明】
【００２２】
【図１】実施形態のアクセスゲートウェイ（通信装置）の機能的構成を示すブロック図である。
【図２】実施形態のアクセスゲートウェイの詳細を、ハードウェア的な構成面から記載したブロック図である。
【図３】実施形態のアクセスゲートウェイに記憶されているＡＧＷ用プログラムの構成を示す説明図である。
【図４】実施形態のアクセスゲートウェイにおけるライブラリを修正したライブラリに置き換える動作の概要を示す説明図である。
【図５】実施形態のアクセスゲートウェイにおけるライブラリを修正したライブラリに置き換える動作を示すフローチャートである。
【図６】プログラムの構成要素や構成単位を更新する、従来のプラグイン方式の説明図である。
【図７】従来のプラグイン方式の課題の説明図である。
【発明を実施するための形態】
【００２３】
（Ａ）主たる実施形態
以下、本発明によるプログラム更新システム、プログラム更新方法及びプログラム更新プログラム、並びに、通信装置を、アクセスゲートウェイに適用した一実施形態を、図面を参照しながら説明する。
【００２４】
（Ａ−１）実施形態の構成
図１は、アクセスゲートウェイの機能的構成を示すブロック図である。アクセスゲートウェイ１は、収容する複数（図１では１個のみ記載している）の電話端末２をＩＰ網３に接続させるゲートウェイ機能を担っているものである。アクセスゲートウェイ１は、電話端末２を終端している音声制御部１０、ＩＰ網３側とのインタフェースを担当するネットワークインタフェース部１１、ネットワークインタフェース部１１を制御して収容している電話端末２とＩＰ網３との接続等を制御する接続制御部１２を有する。
【００２５】
ここで、音声制御部１０やネットワークインタフェース部１１や接続制御部１２は、主として、ソフトウェア処理によって、自己が担当する機能を実行するものである。
【００２６】
図２は、図１とは異なり、アクセスゲートウェイ１のハードウェア的な構成面から記載したブロック図である。
【００２７】
アクセスゲートウェイ１は、制御部２０に対し、インタフェース部（ＩＦ）２１を介して、入力部２２、出力部２３、通信部２４、外部記憶装置２５等が接続されているものである。また、入出力ポート１６を備え、図示しない保守端末等が接続できるようになされている。制御部２０は、ＣＰＵや、ＣＰＵが処理を実行する際にアクセスする各種のメモリ（ＲＯＭ、ＲＡＭなど）からなり、メモリの一部はいわゆる主メモリとして利用される。外部記憶装置２５は、例えば、ハードディスクやＣＤ−ＲＯＭなどの記録媒体とそのアクセス構成とでなり、当該アクセスゲートウェイ１の主メモリにロードされるプログラム等が記憶されているものである。
【００２８】
外部記憶装置２５には、当該アクセスゲートウェイ１の立ち上げ時に主メモリにロードすべきプＡＧＷとして動作させるためのＡＧＷ用プログラムが格納されている。図３は、外部記憶装置２５に記憶されているＡＧＷ用プログラムの構成を示す説明図である。
【００２９】
ＡＧＷ用プログラム３０は、複数のモジュールに分割されている。モジュールは、メインモジュール３１と、ダイナミックリンクライブラリモジュール（以下、ＤＬＬモジュールと呼ぶ）３２（３２−ａ〜３２−ｎ）を有する。メインモジュール３１は、いわゆる実行可能ファイルであり、ＯＳによって主メモリにロードされるものである。ＤＬＬモジュール３２は、メインモジュール３１（実行可能ファイル）によって読み出されて主メモリにロードされるものである。なお、ＤＬＬモジュール３２の識別子（名称）から、ＤＬＬモジュール３２に係る処理の種類（ゲートウェイ処理用、障害処理用など）や、プログラムの種類（常駐プログラム、非常駐プログラム、サブルーチンなど）を区別できるようになされている。
【００３０】
ＤＬＬモジュール３２は、ライブラリであるので、汎用性の高い複数のプログラム部分を再利用可能な形でひとまとまりにしたものである。ライブラリに収容されているプログラム部分は、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群であるいわゆる関数である。同一のＤＬＬモジュール３２（ライブラリ）には、依存関係がある関数群が含まれていることがある。すなわち、ある関数が呼び出す他の関数が同一のＤＬＬモジュール３２（ライブラリ）に含まれていることがある。アクセスゲートウェイ１は、収容している電話端末２に関する呼処理を行うものであり、ある種類の呼処理は他の種類の呼処理の状態が開始条件となっていることも多く、ＤＬＬモジュール３２（ライブラリ）に、依存関係がある関数群が含まれていることは多い。
【００３１】
メインモジュール３１は、ＡＧＷとして機能させる本体プログラム３１Ａ及び中間テーブル３１Ｂ（図４参照）に加え、ＤＬＬモジュール３２の操作用の処理ルーチンとして、図３に示すように、当該アクセスゲートウェイ１が新規に立ち上げられた際に、自己に記述されている所定のＤＬＬモジュールを主メモリにロードするための初期立上げ時ロードルーチン３１Ｃや、修正された新モジュール（若しくは新プログラム）を主メモリにロードしたり、修正により不要となった旧モジュール（若しくは旧プログラム）を主メモリからアンロードしたりするための更新ルーチン３１Ｄ等を備えている。
【００３２】
（Ａ−２）実施形態の動作
次に、実施形態のアクセスゲートウェイにおけるライブラリ（言い換えると、それに属する関数）を修正したものに置き換える動作を、図面を参照しながら説明する。このような修正動作は、プログラム更新プログラムであるメインモジュール３１の更新ルーチン３１Ｄが実行する。
【００３３】
図４は、この実施形態によるライブラリを修正したライブラリ（プラグインライブラリ）に置き換える動作の概要を示す説明図である。
【００３４】
メインモジュール３１（図４では省略）は、上述したように、ＡＧＷとして機能させる本体プログラム３１Ａ及び中間テーブル３１Ｂを備えている。本体プログラム３１Ａは、呼処理に供している電話端末２との回線など、処理を区別して管理する単位毎に生成されたスレッド３５−１〜３５−Ｘを有する。各スレッド３５−１、…、３５−Ｘはそれぞれ、関数の呼出し情報をスタック情報として管理している。図４は、２つの関数ｆｕｎｃＡ、ｆｕｎｃＢがライブラリｌｉｂＡに属している場合を示しており、このライブラリｌｉｂＡを修正したプラグインライブラリｐｌｕｇｌｉｂＡも既に搭載されている場合を示している。
【００３５】
このような状態において、メインモジュール３１の更新ルーチン３１Ｄが起動されると、ライブラリｌｉｂＡからプラグインライブラリｐｌｕｇｌｉｂＡへの置き換え処理が開始される。
【００３６】
図４では示していないが、関数ｆｕｎｃＡの実行中に関数ｆｕｎｃＢを呼び出すことが必要である依存関係については、修正を指示する保守員が更新ルーチン３１Ｄを起動する前に入力しておくようにしても良く、また、置き換えられるライブラリｌｉｂＡ若しくは置き換えるプラグインライブラリｐｌｕｇｌｉｂＡの一部で依存関係の情報を管理しておき、起動された更新ルーチン３１Ｄ（より正確に言えば、更新ルーチン３１Ｄを実行する制御部；以下、同様に表現している箇所がある）が起動直後に管理されている依存関係情報を読み込むようにしても良く、さらに、依存関係の情報を本体プログラム３１Ａ若しくは中間テーブル３１Ｂで管理しておき、起動された更新ルーチン３１Ｄが起動直後に管理されている依存関係情報を読み込むようにしても良く、さらにまた、起動直後に更新ルーチン３１ＤがライブラリｌｉｂＡを解釈して関数の依存関係を把握するようにしても良い。図４や後述する図５は、関数ｆｕｎｃＡ及びｆｕｎｃＢが依存関係にあることを認識した以降の処理を示している。
【００３７】
更新ルーチン３１Ｄは、まず、依存関係における参照元の関数ｆｕｎｃＡの、本体プログラム３１Ａからの呼出しを一時的に抑止させる（ＳＴ１）。
【００３８】
その後、更新ルーチン３１Ｄは、全てのスレッド３５−１〜３５−Ｘに対し、順繰りにスタックをトレースし、依存関係における参照元の関数ｆｕｎｃＡ若しくは依存関係における参照先の関数ｆｕｎｃＢの呼出し情報がスタックに残っているか否かをチェックし、関数ｆｕｎｃＡ又はｆｕｎｃＢの少なくとも一方の呼出し情報がスタックに残っているスレッドについては、一時的な抑止状態を中断させて、関数ｆｕｎｃＢの実行をも含めて関数ｆｕｎｃＡを実行させる（ＳＴ２）。
【００３９】
全てのスレッド３５−１〜３５−Ｘに対するスタックのトレースと、それに伴う関数の実行完了処理が終了すると、更新ルーチン３１Ｄは、中間テーブル３１Ｂにおける関数ｆｕｎｃＡ及びｆｕｎｃＢの呼出しアドレスを、ライブラリｌｉｂＡにおけるアドレスからプラグインライブラリｐｌｕｇｌｉｂＡにおけるアドレスに書き換える（ＳＴ３）。
【００４０】
そして最後に、更新ルーチン３１Ｄは、依存関係における参照元の関数ｆｕｎｃＡの、本体プログラム３１Ａからの呼出しの一時的な抑止を解除させる（ＳＴ４）。
【００４１】
図５は、この実施形態におけるライブラリを修正したライブラリ（プラグインライブラリ）に置き換える動作（更新ルーチン３１Ｄの主要部；プログラム更新プログラム）を示すフローチャートである。図５は、図４と同様な動作の流れを示しているが、更新ルーチン３１Ｄによる処理の流れという観点から示しており、以下では、図５の動作主体が制御部２０（のＣＰＵ）であるとして説明する。
【００４２】
制御部２０は、図５に示す処理を開始すると、まず、依存関係における参照元の関数ｆｕｎｃＡの、本体プログラム３１Ａからの呼出し（ジャンプ）を一時的に停止する（ステップ１００）。
【００４３】
その後、制御部２０は、未処理のスレッドが残っているか否かを確認し、未処理のスレッドが残っている場合には、その一つを処理対象にする（ステップ１０１Ｓ）。そして、処理対象のスレッドのスタックに、依存関係における参照元の関数ｆｕｎｃＡ若しくは依存関係における参照先の関数ｆｕｎｃＢの少なくとも一方の呼出し情報が残っているか否かをチェックする（ステップ１０２）。
【００４４】
処理対象スレッドのスタックに、関数ｆｕｎｃＡの呼出し情報も関数ｆｕｎｃＢの呼出し情報も残っていない場合には、制御部２０は、未処理のスレッドが残っているかの確認処理を実行させる（ステップ１０１Ｅ）。
【００４５】
これに対して、関数ｆｕｎｃＡ又は関数ｆｕｎｃＢの少なくとも一方の呼出し情報が処理対象スレッドのスタックに残っていると、制御部２０は、本体プログラム３１Ａ（スレッド）からの関数ｆｕｎｃＡの呼出しの一時的停止を解除した後（ステップ１０３）、関数ｆｕｎｃＡの処理（関数ｆｕｎｃＢの処理を含む）に要する時間を保証し得る所定時間の経過を待って（ステップ１０４）、再び、本体プログラム３１Ａ（スレッド）からの関数ｆｕｎｃＡの呼出しを一時的に停止する（ステップ１００）。
【００４６】
図５では、所定時間経過したときには直ちに、次の未処理スレッドを処理対象にするものを示したが、所定時間経過したときには、スタックに、関数ｆｕｎｃＡの呼出し情報も関数ｆｕｎｃＢの呼出し情報も残っていないことを確認してから、次の未処理スレッドを処理対象にするようにしても良い。この変形例の場合において、スタックに情報が残っていないことを確認できない場合には、上述したステップ１０３及びステップ１０４を実行することとなる。
【００４７】
全てのスレッドに対する処理が終了して未処理のスレッドがなくなると、制御部２０は、中間テーブル３１Ｂにおける関数ｆｕｎｃＡ及びｆｕｎｃＢの呼出しアドレスを、ライブラリｌｉｂＡにおけるアドレスからプラグインライブラリｐｌｕｇｌｉｂＡにおけるアドレスに書き換える（ステップ１０５）。
【００４８】
そして最後に、制御部２０は、本体プログラム３１Ａからの関数ｆｕｎｃＡの呼出しの一時的な停止を解除し（ステップ１０６）、図５に示す一連の処理を終了させる。
【００４９】
これ以降、本体プログラム３１Ａが関数ｆｕｎｃＡを呼出した際には、中間テーブル３１Ｂを介して、プラグインライブラリｐｌｕｇｌｉｂＡ上の修正された関数ｆｕｎｃＡが呼出される。
【００５０】
（Ａ−３）実施形態の効果
第１の実施形態によれば、依存関係のある複数の関数を修正したものに、通信を停止させることなく適切に置き換えることができる。
【００５１】
より具体的に効果を記載すると、第１に、関数ｆｕｎｃＡの実行中にプラグインが適用された場合でも、修正前の関数ｆｕｎｃＡから修正後の関数ｆｕｎｃＢが実行されることによるプログラムの実行エラーを防止することができ、第２に、関数ｆｕｎｃＢの実行中にプラグインが適用され、修正後の関数ｆｕｎｃＢの呼出しによって期待していた動作が実行されていない状態で修正後の関数ｆｕｎｃＡに処理が戻ることによるプログラムの実行エラーを防止することができる。
【００５２】
（Ｂ）他の実施形態
上記実施形態では、２つの依存関係がある関数を、プラグインライブラリを適用して修正したものへ置き換える場合を示したが、３つ以上の依存関係がある関数を、プラグインライブラリを適用して修正したものへ置き換える場合に対しても、本発明を適用することができる。
【００５３】
また、上記実施形態では、アクセスゲートウェイに本発明の技術思想を適用した場合を示したが、他の通信装置に対しても、本発明の技術思想を適用することができる。
【符号の説明】
【００５４】
１…アクセスゲートウェイ、２０…制御部、３０…ＡＧＷ用プログラム、３１…メインモジュール、３１Ａ…本体プログラム、３１Ｂ…中間テーブル、３１Ｃ…初期立上げ時ロードルーチン、３１Ｄ…更新ルーチン、３２、３２−ａ〜３２−ｎ…ダイナミックリンクライブラリモジュール（ＤＬＬモジュール）、３５−１〜３５−Ｘ…スレッド。
【図１】
2015041273.tif 000003
【図２】
2015041273.tif 000004
【図３】
2015041273.tif 000005
【図４】
2015041273.tif 000006
【図５】
2015041273.tif 000007
【図６】
2015041273.tif 000008
【図７】
2015041273.tif 000009