ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
13 июля
488241
Evgeny_CD, Архитектор (14.02.2014 17:14, просмотров: 10668)
Абортирование функций по тайм-ауту в кооперативке: интересно, так кто-то делал? Пусть есть кооперативка, и под ней некий поток исполнения. Хоть while (1). И некоторые функции, например, по причине необычного набора входных параметров, там могут работать слишком долго. Что похерит всю логику. А что, если сделать так: - перед вызовом стремной функции вызываем TimeControl (timelimit) - var = DangerFunc () - TimeControlResult () TimeControl () -- записывает положение стека в статическую переменную -- устанавливает таймер на прерывание через timelimit Пока DangerFunc () фунциклирует, таймер тикает, и может вызвать прерывание. Если такое прерывание случилось, то прерывание: -- ставит флаг "функция абортирована" -- чистит стек от ошметков работы функции DangerFunc -- ставит PC на команду ret // не очень понятно, как установить правильный адрес возврата из похеренной функции. ДО какой глубины шурудить по стеку и как отличить ошметки автоматических переменных от адреса возврата TimeControlResult () -- проверяет таймер и останавливает его, если все ок -- выдает на выход флаг абортирования Дальше вызываюший поток думает, что делать с этим абортированием. Опасности подхода. С одной стороны, DangerFunc должна использовать стек вызвавшего потока для своих данных автоматического класса. А ну как ей int var [1024] понадобится? Можно вызвать malloc (), но тут то нам и наступит писец утечки памяти при абортировании. [malloc = зло в рамках этого поста не обсуждаем.] Можно, конечно, в процессе TimeControl () выдать некую команду правильному malloc, который пометить все выделенные регионы специальным атрибутом, и потом TimeControlResult () даст команду очистить это добро. Главное, чтобы не пришлось писать SuperTimeControl, который будет контролировать TimeControl ...