Цель оборачивания указателя в структуру в C - PullRequest
0 голосов
/ 09 ноября 2018

В коде ядра Linux (до 3.1. *) я видел такое определение структуры:

struct skb_frag_struct {
    struct page *page;
    /* ... */

В более новых версиях ядра это превратилось в:

struct skb_frag_struct {
    struct {
        struct page *p;
    } page;
    /* ... */

С какой целью это обертывание может быть сделано в данном конкретном случае? И зачем это может понадобиться в общем случае?

1 Ответ

0 голосов
/ 09 ноября 2018

Может быть полезно понять изменение кода для использования Git Blame View:

https://github.com/torvalds/linux/blame/a978a5b8d83f795e107a2ff759b28643739be70e/include/linux/skbuff.h

Вы можете увидеть то, что говорится в описании коммита , гдеизменение было сделано :

net: добавить непрозрачную структуру вокруг страницы фрагмента skb

Я выделил этот бит из деструктора фрагмента skbпатч, поскольку он помогает принудительно использовать API фрагмента.

Так что, похоже, это было сделано только для того, чтобы перехватить в коде висячие ссылки, которые делали необработанный доступ к указателю, и принудительно использовать более высокийУровень API.Это не должно добавить никаких затрат времени выполнения.

Как отступление: в последний раз, когда я делал это сам, у меня была какая-то глупая идея, которая заключается в разделении имени структуры на что-то вроде struct { struct page *ge; } pa; ... таким образом привилегированный код может читаться как fragstruct.pa.ge вместо fragstruct.page.p .Но за исключением того, что это глупо, преимущество использования того же имени для внешней структуры помогает направлять старое использование с явными ошибками.Хотя, как указывает ваша путаница, комментарий // don't access directly, use fragment API к члену p, вероятно, был бы уместен в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...