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