Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Что делает этот код?  [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
Сообщений: 51019
После макро-процессинга будет нечто вроде

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
Сообщений: 51019
Мемберов не обсуждаем!
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
Сообщений: 51019
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]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Dimitry Sibiryakov
Member

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

petrav
Я в линуксе разбираться не хочу.

Я где-то сказал "разбираться"? Я сказал просто найти "define" этого макроса и посмотреть
на них. Я понимаю, это сложно...

Posted via ActualForum NNTP Server 1.5

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

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

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

Честно - не знаю.

Сообщение было отредактировано: 4 фев 21, 18:55
4 фев 21, 19:00    [22275035]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
blonduser
Member

Откуда:
Сообщений: 133
Есть опции компилятора, которые считают не использованную переменную или параметр ошибкой.

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

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

Сообщение было отредактировано: 4 фев 21, 19:49
4 фев 21, 19:52    [22275081]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Сибирский Пушистый
Member

Откуда: б.о.м.ж и з
Сообщений: 20
[quot petrav#22274415]
Сибирский Пушистый
mayton,

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


А оно и без макроса не будет компилироваться.
Я же с самого начала объяснил, что цикл там для того, чтобы можно было поставить ; после макроса, что в свою очередь нужно, чтобы читающие этот код не делали большие глаза от отсутствия ; и им бы казалось, что всё нормально, что это с++ а не ж с ушами.
Единственное непонятно - зачем этот макрос вообще, когда он ничего не делает и ничего не добавлят функционально в код.
4 фев 21, 20:39    [22275110]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Сибирский Пушистый
Member

Откуда: б.о.м.ж и з
Сообщений: 20
blonduser
Есть опции компилятора, которые считают не использованную переменную или параметр ошибкой.

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

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


Я видел их мейкфайл. Там не используются эти опции, и их код сыпет предупреждениями, как горохом.
4 фев 21, 20:41    [22275112]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
Антошка конечно не сахар, но в чем то он прав.

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


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

Сообщение было отредактировано: 5 фев 21, 00:20
5 фев 21, 00:18    [22275198]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Siemargl
Антошка конечно не сахар, но в чем то он прав.

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


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

Так может вы знаете зачем нужен пустой макрос в контексте блокировки мьютекса в драйвере файловой системы? Если я правильно понял, конечно.
5 фев 21, 12:40    [22275472]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
petrav,

Так он непустой в отладочной версии ядра
#define lockdep_assert_held(l)	do {				\
		WARN_ON(debug_locks && !lockdep_is_held(l));	\
	} while (0)
5 фев 21, 13:33    [22275542]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Сибирский Пушистый
Member

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

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


надеюсь, что ковид достанет таких разрабов скорее раньше, чем позже.
5 фев 21, 18:14    [22275898]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
Dimitry Sibiryakov
Member

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

Если тебе не нравится ядро Линкса - не пользуйся им.

Posted via ActualForum NNTP Server 1.5

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

Откуда: loopback
Сообщений: 51019
Некто Йоханес Берг закоммитил это в 2013 году.

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

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)
 
5 фев 21, 19:47    [22275980]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Siemargl
petrav,

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

Ну да, это же обычный assert(). Странно, что я не обратил внимание на название макроса.
Нужно внимательнее читать и только потом писать.
5 фев 21, 22:48    [22276054]     Ответить | Цитировать Сообщить модератору
 Re: Что делает этот код?  [new]
petrav
Member

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

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

Короче, Си — зло, макросы — зло. Только C#, потому что он лучше Java.
5 фев 21, 23:10    [22276062]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / C++ Ответить