powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что делает этот код?
38 сообщений из 38, показаны все 2 страниц
Что делает этот код?
    #40041361
Что это макрос, после которого можно ставить точку с запятой, понимаю даже я. Но какое отношение всё это имеет к блокировке и что вообще достигает этот код из драйвера VDFS для линукс?

lockdep.h:

Код: plaintext
1.
#define lockdep_assert_held(l)			do { (void)(l); } while (0)



vdfs4.h:

Код: plaintext
1.
lockdep_assert_held(&inode->i_mutex);
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041365
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сибирский Пушистый
что вообще достигает этот код
Я понимаю, что с IQ<300 догадаться невозможно, поэтому подскажу: в зависимости от флагов компиляции может быть разное определение у макроса с одним и тем же именем. Приведённое в ОП-посте определение является специально ничего не делающим.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041372
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После макро-процессинга будет нечто вроде

Код: plaintext
1.
2.
3.
do { 
  (void)(&inode->i_mutex); 
} while (0);
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041394
mayton,

У меня, конечно же, и близко нет 300 айкю, и человек я простой: когда пишу код, то он выполняет какую-то функцию.
Но какую функцию выполняет ЭТО? Оно же вообще ничего не делает. Или я ошибаюсь?
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041396
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сибирский Пушистый
mayton,

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

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

Код: plaintext
1.
2.
3.
do { 
  (void)(&inode->i_mutex); 
} while (0);


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

И я не понимаю, почему указатель на некую переменную может приводиться к void. Не к void*, а к void! Хотя где-то
я видел такое.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041399
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
Сибирский Пушистый
что вообще достигает этот код
Я понимаю, что с IQ<300 догадаться невозможно, поэтому подскажу: в зависимости от флагов компиляции может быть разное определение у макроса с одним и тем же именем. Приведённое в ОП-посте определение является специально ничего не делающим.

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

Код: plaintext
1.
#define lockdep_assert_held(l)
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041403
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сибирский Пушистый
Но какую функцию выполняет ЭТО? Оно же вообще ничего не делает. Или я ошибаюсь?
Да, оно вообще ничего не делает. Могу повторить ещё раз: в зависимости от флагов компиляции, ну а если точнее от параметров конфига ядра, может использоваться другое определение макроса с именем `lockdep_assert_held`. Которое делает более осмысленные вещи. Почему ты спрашиваешь на форуме АСУчивателей складов вместо того, чтобы посмотреть на https://elixir.bootlin.com/linux/latest/ident/lockdep_assert_held ? Тут вместо помощи будут полтреда пучить глаза на идиоматические сишные конструкции и рассказывать что бы прошло ревью у них в конторе, а что бы не прошло.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041404
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest

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

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

Код: plaintext
1.
#define lockdep_assert_held(l)			do { (void)(l); } while (0)


Зачем тут цикл, зачем приведение к void и т.д.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041406
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЗачем тут цикл, зачем приведение к void и т.д.

Весь остальной букварь грязных Си-трюков тоже процитировать, начиная с "a=b=c=0" и
"++p*=*q++"?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041408
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

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

На мои вопросы тебе есть что ответить?
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041409
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
a guest

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

В твоей команде на 1С платят мало, потому что твой хлебозавод загибается.
Всё потому что кто-то бегает выяснять зачем в сишных макросах пишут `do { ... } while (0)` вместо того, чтобы заниматься своими прямыми обязанностями.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041410
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravНа мои вопросы тебе есть что ответить?

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

Параметр используется чтобы компилятор не пропустил инвалидное выражение в нём.
Он используется в круглых скобках чтобы обойти грабли с нетривиальными выражениями (гугли
"зачем скобки вокруг параметров в макросе").
Он приводится к void чтобы подавить предупреждение о неиспользуемом результате.
Он в цикле чтобы обойти грабли взаимодействия с if без кривых скобок (опять гугли "зачем
фиктивный цикл в макросах").
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041411
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
petrav
пропущено...

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

Объясни, плиз, зачем это (такой цикл) пишут в сишных макросах? И зачем приведение к `void`? Пожалуйста.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041459
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мемберов не обсуждаем!
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041486
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

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

Да, и это в новинку. Но такой фиктивный цикл используется что бы обрамлять несколько выражений разделённых точкой с запятой. Я так вижу что тут это излишне.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041563
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЯ так вижу что тут это излишне.

То, что конкретно в этом макросе такое не случится, ещё не повод для него нарушать правила
написания безопасных макросов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041601
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
Но такой фиктивный цикл используется что бы обрамлять несколько выражений разделённых точкой с запятой. Я так вижу что тут это излишне.
Фиктивный цикл делает вызов макроса стейтментом вместо выражения.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041619
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, макросы — зло.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041620
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тех, кому Си и С++ слишком сложны - были созданы Ява и С-шарп.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041628
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

Ну... это тоже есть. Но главная задача все-таки стояла другая. Поэтому камент не полный.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041659
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

Подмена понятий. :) Страуструп тоже считает макросы злом.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041662
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
petrav
Но такой фиктивный цикл используется что бы обрамлять несколько выражений разделённых точкой с запятой. Я так вижу что тут это излишне.
Фиктивный цикл делает вызов макроса стейтментом вместо выражения.

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

Кстати, забавно. Поскольку речь явно идёт о блокировках и мьютексах, то зачем макрос, который при данных настройках компилятора, ничего не делает? Они код собирают в однопоточном или многопоточном режиме? Наверное, да.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041669
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так поищи другие определения этого макроса и посмотри при каких условиях они используются.

PS: А Страуструп придумал макросы 2.0 - темплейты. Естественно, первую версию он будет считать злом.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041699
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Ну так поищи другие определения этого макроса и посмотри при каких условиях они используются.

PS: А Страуструп придумал макросы 2.0 - темплейты. Естественно, первую версию он будет считать злом.
Вообще-то, он не считает их злом. Неудобными - да. Малоконтролируемыми - да. Но злом не считает.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041724
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Ну так поищи другие определения этого макроса и посмотри при каких условиях они используются.

Я в линуксе разбираться не хочу. Может нам mayton поможет? Зачем этот макрос?
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041762
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЯ в линуксе разбираться не хочу.

Я где-то сказал "разбираться"? Я сказал просто найти "define" этого макроса и посмотреть
на них. Я понимаю, это сложно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041784
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Dimitry Sibiryakov
Ну так поищи другие определения этого макроса и посмотри при каких условиях они используются.

Я в линуксе разбираться не хочу. Может нам mayton поможет? Зачем этот макрос?

Честно - не знаю.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041809
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть опции компилятора, которые считают не использованную переменную или параметр ошибкой.

Что бы ошибки не происходило используют подобный макрос.

Код предотвращает ошибку компиляции.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041819
[quot petrav#22274415]
Сибирский Пушистый
mayton,

Это какой-то костыль, который что-то должен проверять. Например, то что у типа структуры "inode" есть поле данных
"i_mutex". Иначе оно не будет компилироваться.


А оно и без макроса не будет компилироваться.
Я же с самого начала объяснил, что цикл там для того, чтобы можно было поставить ; после макроса, что в свою очередь нужно, чтобы читающие этот код не делали большие глаза от отсутствия ; и им бы казалось, что всё нормально, что это с++ а не ж с ушами.
Единственное непонятно - зачем этот макрос вообще, когда он ничего не делает и ничего не добавлят функционально в код.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041821
blonduser
Есть опции компилятора, которые считают не использованную переменную или параметр ошибкой.

Что бы ошибки не происходило используют подобный макрос.

Код предотвращает ошибку компиляции.


Я видел их мейкфайл. Там не используются эти опции, и их код сыпет предупреждениями, как горохом.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40041878
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Антошка конечно не сахар, но в чем то он прав.

Реальный смысл этого макроса во второй ветке дефайна CONFIG_LOCKDEP, а в этой - пустышка, аналог
Код: plaintext
1.
2.
3.
{
1;
}



Впрочем, он себе льстит, IQ 300 тут не нужно, хватит и 130+ =)
...
Рейтинг: 0 / 0
Что делает этот код?
    #40042058
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
Антошка конечно не сахар, но в чем то он прав.

Реальный смысл этого макроса во второй ветке дефайна CONFIG_LOCKDEP, а в этой - пустышка, аналог
Код: plaintext
1.
2.
3.
{
1;
}



Впрочем, он себе льстит, IQ 300 тут не нужно, хватит и 130+ =)

Так может вы знаете зачем нужен пустой макрос в контексте блокировки мьютекса в драйвере файловой системы? Если я правильно понял, конечно.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40042089
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Так он непустой в отладочной версии ядра
Код: plaintext
1.
2.
3.
#define lockdep_assert_held(l)	do {				\
		WARN_ON(debug_locks && !lockdep_is_held(l));	\
	} while (0)
...
Рейтинг: 0 / 0
Что делает этот код?
    #40042282
Siemargl
petrav,

Так он непустой в отладочной версии ядра
Код: plaintext
1.
2.
3.
#define lockdep_assert_held(l)	do {				\
		WARN_ON(debug_locks && !lockdep_is_held(l));	\
	} while (0)



надеюсь, что ковид достанет таких разрабов скорее раньше, чем позже.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40042312
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если тебе не нравится ядро Линкса - не пользуйся им.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что делает этот код?
    #40042335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Некто Йоханес Берг закоммитил это в 2013 году.

Можно попробовать почитать его пояснение по этому поводу.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
commit b1ae345d971664f70cfdc293029c40ccfb093591
Author: Johannes Berg <johannes.berg@intel.com>;
Date:   Thu Feb 21 16:42:47 2013 -0800

    lockdep: make lockdep_assert_held() not have a return value
    
    I recently made the mistake of writing:
    
      foo = lockdep_dereference_protected(..., lockdep_assert_held(...));
    
    which is clearly bogus.  If lockdep is disabled in the config this would
    cause a compile failure, if it is enabled then it compiles and causes a
    puzzling warning about dereferencing without the correct protection.
    
    Wrap the macro in "do { ...  } while (0)" to also fail compile for this
    when lockdep is enabled.
    
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>;
    Cc: Peter Zijlstra <peterz@infradead.org>;
    Cc: Ingo Molnar <mingo@redhat.com>;
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>;
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>;

diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 2bca44b0893c..bfe88c4aa251 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -359,7 +359,9 @@ extern void lockdep_trace_alloc(gfp_t mask);
 
 #define lockdep_depth(tsk)	(debug_locks ? (tsk)->lockdep_depth : 0)
 
-#define lockdep_assert_held(l)	WARN_ON(debug_locks && !lockdep_is_held(l))
+#define lockdep_assert_held(l)	do {				\
+		WARN_ON(debug_locks && !lockdep_is_held(l));	\
+	} while (0)
 
 #define lockdep_recursing(tsk)	((tsk)->lockdep_recursion)
 
...
Рейтинг: 0 / 0
Что делает этот код?
    #40042399
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
petrav,

Так он непустой в отладочной версии ядра
Код: plaintext
1.
2.
3.
#define lockdep_assert_held(l)	do {				\
		WARN_ON(debug_locks && !lockdep_is_held(l));	\
	} while (0)


Ну да, это же обычный assert() . Странно, что я не обратил внимание на название макроса.
Нужно внимательнее читать и только потом писать.
...
Рейтинг: 0 / 0
Что делает этот код?
    #40042407
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Я так примерно понял, что Johannes Berg по ошибке подставил lockdep_assert_held()
как аргумент функции. И в одной из конфигураций у него это компилировалось. А
когда он добавил псевдо-цикл, то перестало компилироваться в обоих конфигурациях.
Компилятор, очевидно, Си — это же ядро ОС.

Короче, Си — зло, макросы — зло. Только C# , потому что он лучше Java.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что делает этот код?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]