カーネルの ac 関数にタイムアウトを追加しようとしています。
try_until_timeout
次の擬似コードと同様のことをしたいと思います。
void myfunction() {/* [...] */}
void myfunction_cleanup() {/* [...] */}
int main( void ) {
boolean hasFinished = try_until_timeout(myfunction, HZ/10 ) // The task has 100 ms of processor time to complete
if(!hasFinished) { // if the task have timeouted
hasFinished = try_until_timeout(myfunction_cleanup, HZ/10 ) // The task has 100 ms of processor time to come back to a clean state
if(!hasFinished) { // if the cleanup also timeouted
printk(KERN_WARN "Task and cleanup failed to finish in time. Aborting.");
my_kill()
}
}
}
pthread_timedjoin_np
パフォーマンス上の理由で新しいスレッドを作成したくないことを除いて、いくつかの点で私の要件はかなり似ています。
しかし、私は何をすべきかわかりません。きれいにカーネルから。関数を呼び出す前にタイマーリストを追加して後で削除すると、これが可能だと思います。タイムアウトに達すると、次の命令の値を変更することが可能かもしれませんが、$eip
このアプローチは非常に汚れており、過度で移植性がないため、同じ結果を得るためのよりきれいな解決策を見つけたいと思います。
答え1
カーネルにはタイマーを管理する特定の機能があります。この場合、mod_timer、setup_timer、およびdel_timer機能のタイムアウトを確認する必要があります。