LINUX.ORG.RU

подскажите, зачем может быть нужно

 ,


1

4

Рассказали тут забавное про ведро, дайте комментарий, зачем так?

«Ну просто многие его части писали наркоманы, это проявляется во всем, даже в мелочах )

чего стоит даже такая казалось бы простейшая вещ как список в api ядра
но помоему только наркоман мог додуматься хранить данные не структуре элемента списка, а наоборот

и нафигачить макрос который по элементу списка, типу структуры верхнего имени и именю поля в этой структуре - вычисляет смещения и возвращает указатель на эту верхнюю структуру
это блин логика навыворот )

вот типичное использоваение списка в ядре:

struct shit {
type1 some_shit;
....
struct list_head list_item;
...
type1 some_shit;
};

И потом имея указатель ptr на list_item можем сделать: list_entry(ptr, struct shit, list_item)

и когда смотришь на это первый раз - нифига не понимаешь
читаешь доку на kernel.org - еще больше нифига не понимешь

лезешь в исходники поначалу думаешь - че за фигня, потом врубаешься и понимаешь что они наркоманы
и так во всем

#define list_entry(ptr, type, member) \ ((type *)((char *)(ptr) – (unsigned long)(&((type *)0)->member)))

может выпендриваются просто
когда начинаешь читать исходники на предмет того как vfs с инодами работает - поначалу тоже волосы шевелятся»

★★★★☆

The Linux kernel approach is different. Instead of turning the structure into a linked list, the Linux approach is to embed a linked list node in the structure!

Robert Love. Linux kernel development

four_str_sam
()

ты еще код коливаса или рейзера не читал

u64 time = ~0ULL;
вот где настоящий выпендреж

anonymous
()

потом врубаешься и понимаешь что они наркоманы

Неа, на сях такое и в пользовательских приложениях делают. Intrusive lists называется. Уменьшает число разыменовываний указателя, и позволяет выгадать ещё проценты скорости. Ты же не хочешь, чтобы при выполнении твоей программы всё процессорное время выжирало ядро?

А в ядре ещё одна причина есть: slab. На структура + цепочка списка нужно два разных slab'а, а на структуру с вложенной цепочкой — только один.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

В time записывается 64 единички. В чём выпендрёж?

Deleted
()
Ответ на: комментарий от i-rinat

0хFFFFFFFFFFFF запутался в количестве F. да ну нафиг, ~0ULL на порядок читабельнее.

next_time ★★★★★
()
Ответ на: комментарий от anonymous

ULLONG_MAX не в моде нынче?

Уже почти в моде.

rinat@dlaptop:/tmp/1/linux-3.18.1$ grep -R '~0ULL' . | wc -l
186
rinat@dlaptop:/tmp/1/linux-3.18.1$ grep -R 'ULLONG_MAX' . | wc -l
113
i-rinat ★★★★★
()

вот типичное использоваение списка в ядре:

Открой для себя «К & R», а потом постигни разницу между интрузивными и неинтрузивными структурами данных. (То же самое можно делать не с указателями, а с числовыми индексами для in-memory-DB). Причем «единица данных» может быть одновременно в каком хошь количестве «списков»(и не только списков), ничего не знающих друг о друге. Храниться в таких структурах могут абсолютно разные с точки зрения лэйаута полей в структурах (но сгруппированные по смыслу) данные.

slackwarrior ★★★★★
()
Ответ на: комментарий от metawishmaster

а, вообще, не хочу сеять смуту, но (каюсь!) писал я тут один драйверок для 7-го офтопика и наткнулся на подозрительно знакомые LIST_HEAD, CONTAINING_RECORD (container_of, по православному), etc...

metawishmaster ★★★★★
()
Ответ на: комментарий от metawishmaster

А чего сеять? Качнуть сорцов винтукея с торрента и поцсмотреть :)

slackwarrior ★★★★★
()

Потому что это реализация интрузивного списка. Шел бы ты отсюда, жабоед, а то в мониторе застрянешь.

anonymous
()
Ответ на: комментарий от next_time

~0ULL это как 3.14 но можно константу завести PI_2_DIGITS_AFTER_POINT это да

это только в твоей голове так

в ядре есть хедер с дефайном этой штуки

anonymous
()
Ответ на: комментарий от anonymous

Потому что это реализация интрузивного списка.

Причём единственно адекватная. ОП, вот тебе каноничный вариант: http://fxr.watson.org/fxr/source/sys/queue.h

mix_mix ★★★★★
()
Последнее исправление: mix_mix (всего исправлений: 1)
Ответ на: комментарий от next_time

nope

таки, yep, просто ни один из них не занимает пять символов ^)

~/devel/linux/include$ grep "~0ULL" * -r
linux/kernel.h:#define LLONG_MAX        ((long long)(~0ULL>>1))
linux/kernel.h:#define ULLONG_MAX       (~0ULL)
linux/kernel.h:#define U64_MAX          ((u64)~0ULL)
linux/aio.h:#define KIOCB_CANCELLED             ((void *) (~0ULL))
linux/dma-mapping.h:#define DMA_BIT_MASK(n)     (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
linux/bitops.h: (((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h))))
linux/amba/bus.h:       .dev = __AMBA_DEV(busid, data, ~0ULL),                  \
uapi/linux/bcache.h:{ return (k->field >> offset) & ~(~0ULL << size); }         \
uapi/linux/bcache.h:    k->field &= ~(~(~0ULL << size) << offset);              \
uapi/linux/bcache.h:    k->field |= (v & ~(~0ULL << size)) << offset;           \
uapi/linux/bcache.h:{ return (k->ptr[i] >> offset) & ~(~0ULL << size); }                        \
uapi/linux/bcache.h:    k->ptr[i] &= ~(~(~0ULL << size) << offset);                     \
uapi/linux/bcache.h:    k->ptr[i] |= (v & ~(~0ULL << size)) << offset;                  \
uapi/linux/bcache.h:#define MAX_KEY_OFFSET                      (~0ULL >> 1)
uapi/linux/fiemap.h:#define FIEMAP_MAX_OFFSET   (~0ULL)
uapi/linux/resource.h:#define RLIM64_INFINITY           (~0ULL)

metawishmaster ★★★★★
()
Ответ на: комментарий от anonymous

Да, всё-таки имелось в виду модель, не конкретная реализация.

mix_mix ★★★★★
()

Вообще это обычный паттерн для intrusive списка. Нужно это обычно когда элемент находится сразу в нескольких списках и иначе эффективно упаковать данные нельзя.

mashina ★★★★★
()

Просто ты дебил и не постиг С.

Pavval ★★★★★
()
Ответ на: комментарий от crowbar

Помнится у microsoft есть патент на что-то подобное.

На упоротость? Да не, тут stevejobs оригинален.

Pavval ★★★★★
()

Это достаточно распространенная практика. В SCSI, SysFS и прочих подсистемах. Используется для реализации местного аналога наследования.

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

Наркоманы там писали genetlink, который до 2013 года (ЕМНИП) не умел многопоточность и когда кто-то пытался отправить/получить сообщение блокировал нахрен всю шину.

kirk_johnson ★☆
()

Читай книжки, там написано об этом.

post-factum ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.