Лічильники посилань

Одне з головних властивостей, яке реалізується за допомогою обєктів kobject, – це уніфікована система підтримки лічильників посилань Після ініціалізації кількість посилань на обєкт встановлюється рівним одиниці Поки значення лічильника посилань на обєкт не дорівнює нулю, обєкт існує в памяті, і кажуть, що він захоплений (pinned,буквально, пришпилити) Будь-який код, який працює з обєктом, спочатку повинен збільшити значення лічильника посилань Після того як код закінчив роботу з обєктом, він повинен зменшити значення лічильника посилань Збільшення значення лічильника називають захватом (getting), зменшення – звільненням (putting) посилання на обєкт Коли значення лічильника стає рівним нулю, обєкт може бути знищений, а займана їм память звільнена

Збільшення значення лічильника посилань виконується за допомогою функції kobject_get ()

struct kobject * kobject_get(struct kobject *kobj)

Ця функція повертає покажчик на обєкт kobjec t у разі успіху і значення

NULL у разі помилки

Зменшення значення лічильника посилань виконується за допомогою функції

kobject_put()

void kobject put(struct kobject *kobj)

Якщо значення лічильника посилань обєкта, який передається як параметр, стає рівним нулю, то викликається функція, на яку вказує покажчик releas e поля ktyp e цього обєкта

Структури kre f

Внутрішнє подання лічильника посилань виконано за допомогою структури kref, яка визначена у файлі таким чином

struct kref{

atomic_trefcount

}

Єдине поле цієї структури – атомарна змінна, в якій зберігається значення лічильника посилань Структура використовується просто для того, щоб виконувати перевірку типів Щоб скористатися структурою kref, необхідно її ініціалізувати за допомогою функції kref_ini t ()

void kref_init(struct kref *krcf)

{

atomic_set(&ampkref-&gtrefcount, 1)

}

Як видно з визначення, ця функція просто ініціалізує атомарну змінну тина atomic_ t в значення, рівне одиниці

Отже, структура kre f є захопленої відразу ж після ініціалізації, так само поводяться і обєкти kobject

Для того щоб захопити посилання на структуру kref, необхідно використовувати функцію kref_ge t ()

void kref_get(struct kref *kref)

{

WARN_ON(atomic_read(&ampkref-&gtrefcount))

atomic_inc(&ampkref-&gtrefcount)

}

Ця функція збільшує значення лічильника посилань на одиницю Вона не повертає ніяких значень Щоб звільнити посилання на структуру 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 (atomicdec_and_test(&ampkref-&gtrefcount))

release (kref)

}

Ця функція зменшує значення лічильника посилань на одиницю і викликає функцію releas e (), яка передасться їй як параметр, коли значення лічильника посилань стає рівним нулю Як видно з використаного вираження WARM_ON (), функція releas e () не може просто збігатися з функцією kfrе е (),

а повинна бути спеціальною функцією, яка приймає покажчик на структуру struc t kre f в якості свого єдиного параметра і не повертає ніяких значень

Замість того щоб розробляти свої функції управління лічильниками посилань на підставі типу даних atomic_t, настійно рекомендується використовувати тип даних kre f і відповідні функції, які забезпечують загальний і правильно працюючий механізм підтримки лічильників посилань в ядрі

Всі ці функції визначені у файлі lib / kref c і оголошені у файлі

&ltlinux/krefh&gt

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*