Книга: Разработка ядра Linux
Структуры kref
Структуры kref
Внутреннее представление счетчика ссылок выполнено с помощью структуры kref
, которая определена в файле <linux/kref.h>
следующим образом.
struct kref {
atomic_t refcount;
};
Единственное поле этой структуры — атомарная переменная, в которой хранится значение счетчика ссылок. Структура используется просто для того, чтобы выполнять проверку типов. Чтобы воспользоваться структурой kref
, необходимо ее инициализировать с помощью функции kref_init()
.
void kref_init(struct kref *kref) {
atomic_set(&kref->refcount, 1);
}
Как видно из определения, эта функция просто инициализирует атомарную переменную тина atomic_t
в значение, равное единице.
Следовательно, структура kref
является захваченной сразу же после инициализации, так же ведут себя и объекты kobject
.
Для того чтобы захватить ссылку на структуру kref
, необходимо использовать функцию kref_get()
.
void kref_get(struct kref *kref) {
WARN_ON(!atomic_read(&kref->refcount));
atomic_inc(&kref->refcount);
}
Эта функция увеличивает значение счетчика ссылок на единицу. Она не возвращает никаких значений. Чтобы освободить ссылку на структуру kref
, необходимо использовать функцию kref_put()
.
void kref_put(struct kref *kref, void (*release)(struct kref *kref)) {
WARN_ON(release == NULL);
WARN_ON(release == (void(*)(struct kref*))kfree);
if (atomic_dec_and_test(&kref->refcount))
release (kref);
}
Эта функция уменьшает значение счетчика ссылок на единицу и вызывает функцию release()
, которая передастся ей в качестве параметра, когда значение счетчика ссылок становится равным нулю. Как видно из использованного выражения WARN_ON()
, функция release()
не может просто совпадать с функцией kfrее()
, а должна быть специальной функцией, которая принимает указатель на структуру struct kref
в качестве своего единственного параметра и не возвращает никаких значений.
Вместо того чтобы разрабатывать свои функции управления счетчиками ссылок на основании типа данных atomic_t
, настоятельно рекомендуется использовать тип данных kref
и соответствующие функции, которые обеспечивают общий и правильно работающий механизм поддержки счетчиков ссылок в ядре.
Все эти функции определены в файле lib/kref.c
и объявлены в файле <linux/kref.h>
.
- 1.4 Структуры данных, связанные с драйверами устройств Windows
- ВЛОЖЕННЫЕ СТРУКТУРЫ
- Практическая работа 35. Создание структуры документа и вставка оглавления
- Разработка структуры базы данных
- 6.2. Типы и структуры данных
- Ветвящиеся структуры – архитектура мира растений
- Построение структуры веб-страницы
- Фундаментальные алгоритмы и структуры данных в Delphi
- 4.2. Представление базовой структуры программы
- 14. Структуры и другие типы данных
- Структуры данных процесса
- Структуры данных