Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Что делает этот код?  [new]
Сибирский Пушистый
Member

Откуда: б.о.м.ж и з
Сообщений: 20
Что это макрос, после которого можно ставить точку с запятой, понимаю даже я. Но какое отношение всё это имеет к блокировке и что вообще достигает этот код из драйвера VDFS для линукс?

lockdep.h:

#define lockdep_assert_held(l)			do { (void)(l); } while (0)


vdfs4.h:

lockdep_assert_held(&inode->i_mutex);
3 фев 21, 21:35    [22274356]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
a guest
Member

Откуда:
Сообщений: 326
Сибирский Пушистый
что вообще достигает этот код
Я понимаю, что с IQ<300 догадаться невозможно, поэтому подскажу: в зависимости от флагов компиляции может быть разное определение у макроса с одним и тем же именем. Приведённое в ОП-посте определение является специально ничего не делающим.
3 фев 21, 21:47    [22274361]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
После макро-процессинга будет нечто вроде

do { 
  (void)(&inode->i_mutex); 
} while (0);
3 фев 21, 22:00    [22274372]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Сибирский Пушистый
Member

Откуда: б.о.м.ж и з
Сообщений: 20
mayton,

У меня, конечно же, и близко нет 300 айкю, и человек я простой: когда пишу код, то он выполняет какую-то функцию.
Но какую функцию выполняет ЭТО? Оно же вообще ничего не делает. Или я ошибаюсь?
4 фев 21, 00:08    [22274409]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Сибирский Пушистый
mayton,

У меня, конечно же, и близко нет 300 айкю, и человек я простой: когда пишу код, то он выполняет какую-то функцию.
Но какую функцию выполняет ЭТО? Оно же вообще ничего не делает. Или я ошибаюсь?

Во первых, на сайте www.kernel.org лежат исходники. И там прокомментирован этот макрос.
Я попробовал разобраться, но не очень понял о чём они пишут. Но это не код, который что-то должен делать. Это
какой-то костыль, который что-то должен проверять. Например, то что у типа структуры "inode" есть поле данных
"i_mutex". Иначе оно не будет компилироваться. Зачем это нужно? ХЗ.

do { 
  (void)(&inode->i_mutex); 
} while (0);

Зачем тут цикл тоже не понятно. Похоже на какой-то грязный хак, когда люди знают как работает компилятор и
пытаются его обмануть зачем-то.

И я не понимаю, почему указатель на некую переменную может приводиться к void. Не к void*, а к void! Хотя где-то
я видел такое.
4 фев 21, 00:33    [22274415]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
a guest
Сибирский Пушистый
что вообще достигает этот код
Я понимаю, что с IQ<300 догадаться невозможно, поэтому подскажу: в зависимости от флагов компиляции может быть разное определение у макроса с одним и тем же именем. Приведённое в ОП-посте определение является специально ничего не делающим.

Специально ничего не делающим этот макрос выглядел бы так:

#define lockdep_assert_held(l)
4 фев 21, 00:36    [22274418]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
a guest
Member

Откуда:
Сообщений: 326
Сибирский Пушистый
Но какую функцию выполняет ЭТО? Оно же вообще ничего не делает. Или я ошибаюсь?
Да, оно вообще ничего не делает. Могу повторить ещё раз: в зависимости от флагов компиляции, ну а если точнее от параметров конфига ядра, может использоваться другое определение макроса с именем `lockdep_assert_held`. Которое делает более осмысленные вещи. Почему ты спрашиваешь на форуме АСУчивателей складов вместо того, чтобы посмотреть на https://elixir.bootlin.com/linux/latest/ident/lockdep_assert_held ? Тут вместо помощи будут полтреда пучить глаза на идиоматические сишные конструкции и рассказывать что бы прошло ревью у них в конторе, а что бы не прошло.

Сообщение было отредактировано: 4 фев 21, 10:32
4 фев 21, 01:09    [22274424]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
a guest

petrav, пожалуйсто вернись к программированию на 1C.

PS: Тебе нужно нам пояснить, почему при таких параметрах условной компиляции этот макрос выглядит именно так:

#define lockdep_assert_held(l)			do { (void)(l); } while (0)

Зачем тут цикл, зачем приведение к void и т.д.

Сообщение было отредактировано: 4 фев 21, 10:32
4 фев 21, 01:21    [22274425]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
Зачем тут цикл, зачем приведение к void и т.д.

Весь остальной букварь грязных Си-трюков тоже процитировать, начиная с "a=b=c=0" и
"++p*=*q++"?..

Posted via ActualForum NNTP Server 1.5

4 фев 21, 01:49    [22274428]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

petrav
Зачем тут цикл, зачем приведение к void и т.д.

Весь остальной букварь грязных Си-трюков тоже процитировать, начиная с "a=b=c=0" и
"++p*=*q++"?..

Приведённое тобой — это не грязные трюки. Это штатный и очевидный функционал Си.
Осталось сверится с таблицей приоритетов операторов.

На мои вопросы тебе есть что ответить?
4 фев 21, 01:55    [22274430]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
a guest
Member

Откуда:
Сообщений: 326
petrav
a guest

petrav, пожалуйсто вернись к программированию на 1C.

В твоей команде на 1С платят мало, потому что твой хлебозавод загибается.
Всё потому что кто-то бегает выяснять зачем в сишных макросах пишут `do { ... } while (0)` вместо того, чтобы заниматься своими прямыми обязанностями.

Сообщение было отредактировано: 4 фев 21, 01:51
4 фев 21, 01:58    [22274432]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
На мои вопросы тебе есть что ответить?

Твои вопросы - тоже штатный и очевидный функционал макросов.

Параметр используется чтобы компилятор не пропустил инвалидное выражение в нём.
Он используется в круглых скобках чтобы обойти грабли с нетривиальными выражениями (гугли
"зачем скобки вокруг параметров в макросе").
Он приводится к void чтобы подавить предупреждение о неиспользуемом результате.
Он в цикле чтобы обойти грабли взаимодействия с if без кривых скобок (опять гугли "зачем
фиктивный цикл в макросах").

Posted via ActualForum NNTP Server 1.5

4 фев 21, 02:01    [22274433]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
a guest
petrav
пропущено...

В твоей команде на 1С платят мало, потому что твой хлебозавод загибается.
Всё потому что кто-то бегает выяснять зачем в сишных макросах пишут `do { ... } while (0)` вместо того, чтобы заниматься своими прямыми обязанностями.

Объясни, плиз, зачем это (такой цикл) пишут в сишных макросах? И зачем приведение к `void`? Пожалуйста.
4 фев 21, 02:05    [22274434]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Мемберов не обсуждаем!
4 фев 21, 10:40    [22274508]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

Он приводится к void чтобы подавить предупреждение о неиспользуемом результате.

Спасибо, этого не знал. В Студии такого преобразования не требуется. По крайней на третьем уровне варнингов.

Dimitry Sibiryakov
Он в цикле чтобы обойти грабли взаимодействия с if без кривых скобок (опять гугли "зачем
фиктивный цикл в макросах").

Да, и это в новинку. Но такой фиктивный цикл используется что бы обрамлять несколько выражений разделённых точкой с запятой. Я так вижу что тут это излишне.
4 фев 21, 11:29    [22274544]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
Я так вижу что тут это излишне.

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

Posted via ActualForum NNTP Server 1.5

4 фев 21, 13:40    [22274676]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
a guest
Member

Откуда:
Сообщений: 326
petrav
Но такой фиктивный цикл используется что бы обрамлять несколько выражений разделённых точкой с запятой. Я так вижу что тут это излишне.
Фиктивный цикл делает вызов макроса стейтментом вместо выражения.

Сообщение было отредактировано: 4 фев 21, 14:31
4 фев 21, 14:38    [22274737]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Короче, макросы — зло.
4 фев 21, 15:01    [22274768]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Для тех, кому Си и С++ слишком сложны - были созданы Ява и С-шарп.

Posted via ActualForum NNTP Server 1.5

4 фев 21, 15:06    [22274775]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Dimitry Sibiryakov

Для тех, кому Си и С++ слишком сложны - были созданы Ява и С-шарп.

Ну... это тоже есть. Но главная задача все-таки стояла другая. Поэтому камент не полный.
4 фев 21, 15:15    [22274787]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

Для тех, кому Си и С++ слишком сложны - были созданы Ява и С-шарп.

Подмена понятий. :) Страуструп тоже считает макросы злом.
4 фев 21, 15:41    [22274832]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
a guest
petrav
Но такой фиктивный цикл используется что бы обрамлять несколько выражений разделённых точкой с запятой. Я так вижу что тут это излишне.
Фиктивный цикл делает вызов макроса стейтментом вместо выражения.

Инструмент не по делу применён.

Кстати, забавно. Поскольку речь явно идёт о блокировках и мьютексах, то зачем макрос, который при данных настройках компилятора, ничего не делает? Они код собирают в однопоточном или многопоточном режиме? Наверное, да.
4 фев 21, 15:44    [22274836]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921
Ну так поищи другие определения этого макроса и посмотри при каких условиях они используются.

PS: А Страуструп придумал макросы 2.0 - темплейты. Естественно, первую версию он будет считать злом.

Сообщение было отредактировано: 4 фев 21, 15:47
4 фев 21, 15:53    [22274845]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
White Owl
Member

Откуда:
Сообщений: 12682
Dimitry Sibiryakov
Ну так поищи другие определения этого макроса и посмотри при каких условиях они используются.

PS: А Страуструп придумал макросы 2.0 - темплейты. Естественно, первую версию он будет считать злом.
Вообще-то, он не считает их злом. Неудобными - да. Малоконтролируемыми - да. Но злом не считает.
4 фев 21, 16:24    [22274893]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov
Ну так поищи другие определения этого макроса и посмотри при каких условиях они используются.

Я в линуксе разбираться не хочу. Может нам mayton поможет? Зачем этот макрос?
4 фев 21, 17:02    [22274925]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / C++ Ответить