IOWorkLoop
IOWorkLoop является потоком управления, предназначающегося, чтобы использоваться для обеспечения единственного потокового доступа к аппаратным средствам. Этот класс не знает о природе и типе событий, которые это упорядочивает и вперед. Когда драйвер устройства успешно запустится (см. IOService:: запустите), это, как ожидают, создаст источники событий, это должно будет получить события. Тогда цикл работы инициализируется, и события добавляются к циклу работы для контроля. В целом это установило, будет автоматизирован суперклассом семьи определенного устройства.
Основной метод потока обходит связанный список источника события и передает каждый запрос проверки работы. В этой точке каждый источник события, как ожидают, уведомит своего дипломированного владельца, что событие имело место. После того, как каждое событие было обойдено, и каждый указывает, что другой цикл не требуется (путем установки 'больше' флаг ко лжи), поток заснет на сигнальном семафоре.
Когда источник события регистрируется в цикле работы, ему сообщают о семафоре для использования для пробуждения цикла.
Наследование
Не применимый
Соответствует
Не применимый
Оператор импорта
Не применимый
Objective C
@import Kernel;
Доступность
Доступный в OS X v10.0 и позже.
-
Синхронная реализация addEventSource и функций removeEventSource.
Объявление
C++
virtual IOReturn _maintRequest( void *
command
, void *data
, void *, void *);Возвращаемое значение
kIOReturnUnsupported, если данная команда не реализована, kIOReturnSuccess иначе.
Обсуждение
Эта функция реализует команды, как определено в maintCommandEnum. Это может быть разделено на подклассы, но это не внешний API в обычном смысле. Реализацию подкласса _maintRequest вызвали бы синхронно относительно цикла работы, и это должно быть реализовано обычным способом, которым был бы ioctl.
-
Объявление
C++
virtual IOReturn addEventSource( IOEventSource *
newEvent
);Параметры
newEvent
Указатель на IOEventSource разделяет на подклассы для добавления.
Возвращаемое значение
Всегда возвраты kIOReturnSuccess.
Обсуждение
Добавьте источник события, который будет контролироваться циклом работы. Эта функция не возвращается, пока цикл работы не подтвердил поступление нового источника события. Когда новое событие будет добавлено, threadMain будет всегда перезапускать свой цикл и проверять все выдающиеся события. Источник события сохраняется циклом работы.
-
Вызовы отключают () во всех источниках событий.
Объявление
C++
virtual void disableAllEventSources() const;
Обсуждение
Для всех источников событий в цепи событий вызов отключает () функцию. Посмотрите IOEventSource:: отключите ().
-
Вызовы отключают () во всех источниках событий прерывания.
Объявление
C++
virtual void disableAllInterrupts() const;
Обсуждение
Для всех источников событий (ES), для которых OSDynamicCast (IOInterruptEventSource, ES) допустим в вызове цепи событий, отключают () функцию. Посмотрите IOEventSource:: отключите ().
-
Вызовы включают () во всех источниках событий.
Объявление
C++
virtual void enableAllEventSources() const;
Обсуждение
Для всех источников событий в цепи событий вызов включает () функцию. Посмотрите IOEventSource:: включите ().
-
Вызовы включают () во всех источниках событий прерывания.
Объявление
C++
virtual void enableAllInterrupts() const;
Обсуждение
Для всех источников событий (ES), для которых OSDynamicCast (IOInterruptEventSource, ES) допустим в вызове цепи событий, включают () функцию. Посмотрите IOEventSource:: включите ().
-
Проверки, если источник события передал в переопределениях checkForWork () для выполнения какой-либо работы. IOWorkLoop использует это, чтобы определить, должен ли источник события быть опрошен в runEventSources () или нет.
Объявление
C++
bool eventSourcePerformsWork( IOEventSource *
inEventSource
);Параметры
inEventSource
Источник события для проверки.
-
Объявление
C++
virtual void free();
Обсуждение
Обязательный свободный от объектного независимого политика тока сохраняют количество. Если цикл работы будет работать, то этот метод не возвратится, пока поток успешно не завершился. Каждый источник события в цепочке будет выпущен, и рабочий семафор будет уничтожен.
Если у клиента будут некоторые выдающиеся запросы на событии, то им никогда не будут сообщать о завершении. Если внешняя резьба будет блокирована на каком-либо из источников событий, то они будут пробуждены с состоянием KERN_INTERUPTED.
-
Получает workThread.
Объявление
C++
virtual IOThread getThread() const;
Возвращаемое значение
Возвраты workThread.
-
Текущий контекст выполнения содержит логический элемент цикла работы?
Объявление
C++
virtual bool inGate() const;
Возвращаемое значение
Если IOThreadSelf () является держателем логического элемента, возвращает true.
-
Объявление
C++
virtual bool init();
Возвращаемое значение
Возвращает true, если инициализировано успешно, ложь иначе.
Обсуждение
Инициализирует экземпляр workloop. Этот метод создает и инициализирует сигнальный семафор, блокировку логического элемента контроллера, и порождает поток, который будет продолжать выполняться.
-
Текущий контекст выполнения на потоке работы?
Объявление
C++
virtual bool onThread() const;
Возвращаемое значение
Возвращает true если IOThreadSelf () == workThread.
-
Объявление
C++
virtual IOReturn removeEventSource( IOEventSource *
toRemove
);Параметры
toRemove
Указатель на IOEventSource разделяет на подклассы для удаления.
Возвращаемое значение
Возвраты kIOReturnSuccess в случае успеха, kIOReturnBadArgument, если не мог бы быть найден toRemove.
Обсуждение
Удалите источник события из цикла работы. Эта функция не возвращается, пока цикл работы не подтвердил удаление источника события. Когда событие будет удалено, threadMain будет всегда перезапускать свой цикл и проверять все выдающиеся события. Источник события будет выпущен перед возвратом.
-
Единственный поток вызов к действию с циклом работы.
Объявление
C++
virtual IOReturn runAction( Action
action
, OSObject *target
, void *arg0 = 0, void *arg1 = 0, void *arg2 = 0, void *arg3 = 0);Параметры
action
Указатель для функционирования, чтобы быть выполненным в контексте цикла работы.
arg0
Параметр для параметра действия, значений по умолчанию к 0.
arg1
Параметр для параметра действия, значений по умолчанию к 0.
arg2
Параметр для параметра действия, значений по умолчанию к 0.
arg3
Параметр для параметра действия, значений по умолчанию к 0.
Возвращаемое значение
Возвращает значение выноски Действия.
Обсуждение
Клиентская функция, заставляющая данное действие быть вызванным единственным потоковым способом. Остерегайтесь: логический элемент цикла работы является рекурсивным, и runAction может вызвать прямую или косвенную повторную входимость. При выполнении на потоке клиента будет спать runAction, пока логический элемент цикла работы не откроется для выполнения клиентских действий, действие является единственным, распараллелил против всех других источников событий цикла работы.
-
Объявление
C++
virtual bool runEventSources();
Возвращаемое значение
Возвратите false, если цикл работы закрывается, истина иначе.
Обсуждение
Состоит из внутренних 2 циклов функции threadMain (qv). Внешний цикл завершается, когда больше нет работы, и внутренний цикл обходит список событий, вызывая checkForWork метод в каждом источнике события. Если источник события имеет больше работы, чтобы сделать, это может установить больше флага, и внешний цикл повторится.
Эта функция может использоваться для очистки смены приоритетов между нормальным потоком workloop и оперативными потоками мультимедиа. Проблема состоит в том, что подпрограмма действия прерывания часто удерживается высокоприоритетными потоками. Таким образом, если они хотят получить свои данные теперь, они должны будут вызвать нас и спросить, доступны ли какие-либо данные. Мультимедийный пользовательский клиент примет меры, чтобы эта функция была вызвана, который заставляет любые незаконченные прерывания быть обработанными, и подпрограммы завершения вызываются. К тому времени, когда функция возвращается, вся невыполненная работа будет завершена в оперативном приоритете потоков.
-
Объявление
C++
virtual void threadMain();
Обсуждение
Цикл работы распараллеливает основную функцию. Эта функция состоит из 3 циклов: наиболее удаленный цикл является семафорным ясным и циклом ожидания, средний цикл завершается, когда больше нет работы, и внутренний цикл обходит список событий, вызывая checkForWork метод в каждом источнике события. Если источник события имеет больше работы, чтобы сделать, это может установить больше флага, и средний цикл повторится. Когда больше работы не будет выдающееся, наиболее удаленное будет спать, пока событие не сообщено.
-
Статическая функция, вызывающая threadMain функцию.
Объявление
C++
static void threadMainContinuation( IOWorkLoop *
self
); -
Функция членства фабрики для построения и intialize цикл работы.
Объявление
C++
static IOWorkLoop *workLoop();
Возвращаемое значение
Возвращает workLoop экземпляр, если создано успешно, 0 иначе.
-
Функция членства фабрики к constuct и intialize цикл работы.
Объявление
C++
static IOWorkLoop *workLoopWithOptions( IOOptionBits
options
);Параметры
options
Опции - kPreciousStack для предотвращения освобождения штабеля на пути разбивки на страницы.
Возвращаемое значение
Возвращает workLoop экземпляр, если создано успешно, 0 иначе.
-
Функция членства фабрики к constuct и intialize цикл работы.
Объявление
C++
static IOWorkLoop *workLoopWithOptions( IOOptionBits
options
);Параметры
options
Опции - kPreciousStack для предотвращения освобождения штабеля на пути разбивки на страницы.
Возвращаемое значение
Возвращает workLoop экземпляр, если создано успешно, 0 иначе.
-
Объявление
C++
typedef IOReturn ( *Action)( OSObject *target, void *arg0, void *arg1, void *arg2, void *arg3);
Параметры
target
Target функции, может использоваться в качестве refcon. Отметьте, была ли функция C++ указана, этот параметр является неявно первым параметром в списке параметров целевой функции членства.
arg0
Параметр действию от выполненной работы.
arg1
Параметр действию от выполненной работы.
arg2
Параметр действию от выполненной работы.
arg3
Параметр действию от выполненной работы.
Обсуждение
Тип и параметры выноски C функция, использующаяся, когда runCommand выполняется клиентом. Бросок к этому типу, когда Вы хотите, чтобы использовалась функция членства C++. Обратите внимание на то, что arg1 - arg3 параметры являются прямыми, проходят от runCommand до выноски действия.
Оператор импорта
Objective C
#include <IOCommandGate.h>;
Доступность
Доступный в OS X v10.0 через OS X v10.5.
-
Объявление
CPlusPlus
typedef enum { mAddEvent, mRemoveEvent } maintCommandEnum;
Константы
-
mAddEvent
mAddEvent
Используемый для тегирования Удалить команды источника события.
-
mRemoveEvent
mRemoveEvent
Используемый для тегирования Удалить команды источника события.
Обсуждение
Перечисление команд, с которыми может иметь дело _maintCommand.
Оператор импорта
Objective C
#include <IOWorkLoop.h>;
Доступность
Доступный в OS X v10.0 через OS X v10.5.
-
-
Объявление
C++
struct ExpansionData { IOOptionBits options; IOEventSource *passiveEventChain; #if DEBUG void *allocationBacktrace[16]; #endif /* DEBUG */ #if IOKITSTATS struct IOWorkLoopCounter *counter; #else void *iokitstatsReserved; #endif };
Обсуждение
Эта структура будет использоваться для расширения capablilties IOWorkLoop в будущем.
-
Спин-блокировка, использующаяся для защиты 'workToDo' переменной.
Объявление
C++
IOSimpleLock *workToDoLock;
-
Привыкший к указать, что прерывание стреляло и должно быть обработано.
Объявление
C++
volatile bool workToDo;
-
Поток цикла работы.
Объявление
C++
IOThread workThread;
-
Зарезервированный для будущего использования. (Только внутреннее использование)
Объявление
C++
ExpansionData *reserved;
-
Набор, если цепь событий была изменена и система, должен быть повторно проверен от запуска. (Только внутреннее использование)
Объявление
C++
bool loopRestart;
-
Блокировка взаимного исключения, использующаяся завершением и открывающая функции Gate. Это - рекурсивная блокировка, позволяющая многократным уровням кода совместно использовать единственный IOWorkLoop без мертвой блокировки. Это распространено в IOKit, так как потоки выполнения имеют тенденцию следовать за плоскостью службы в IORegistry, и многократные объекты вдоль пути вызова могут получить логический элемент для (совместно использованного) workloop того же.
Объявление
C++
IORecursiveLock *gateLock;
-
Указатель на первый источник события в связанном списке.
Объявление
C++
IOEventSource *eventChain;
-
Логический элемент внутреннего управления для поддержания системы событий.
Объявление
C++
IOCommandGate *controlG;