Хотя эта тема много раз обсуждалась на этом форуме и на всех других форумах, все же у меня есть сомнения. Пожалуйста помоги.
Как работает макрос do{} while(0)
в ядре Linux? Например,
#define preempt_disable() do { } while (0)
Как отключить вытеснение?
#define might_resched() do { } while (0)
Как это перепланируется?
Точно так же я видел макросы для блокировок мьютексов и других. Как это помогает? Я понимаю следующую проблему, но не примеры выше.
#define foo(x) do { do something } while(0)
Изменить:
Как насчет следующего кода для rt_mutex_lock
?
/**
* rt_mutex_lock - lock a rt_mutex
*
* @lock: the rt_mutex to be locked
*/
void __sched rt_mutex_lock(struct rt_mutex *lock)
{
might_sleep();
rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, 0, rt_mutex_slowlock);
}
EXPORT_SYMBOL_GPL(rt_mutex_lock);
/*
* debug aware fast / slowpath lock,trylock,unlock
*
* The atomic acquire/release ops are compiled away, when either the
* architecture does not support cmpxchg or when debugging is enabled.
*/
static inline int rt_mutex_fastlock(struct rt_mutex *lock,
int state, int detect_deadlock, int (*slowfn)(struct rt_mutex *lock,
int state, struct hrtimer_sleeper *timeout, int detect_deadlock))
{
if (!detect_deadlock && likely(rt_mutex_cmpxchg(lock, NULL, current))) {
rt_mutex_deadlock_account_lock(lock, current);
return 0;
} else{
return slowfn(lock, state, NULL, detect_deadlock);
}
}
Я запутался, потому что rt_mutex_deadlock_account_lock
определяется в двух местах ядра:
In kernel/rtmutex-debug.c
:
void rt_mutex_deadlock_account_lock(struct rt_mutex *lock,
struct task_struct *task)
{
//....
}
In kernel/rtmutex.h
:
#define rt_mutex_deadlock_account_lock(m, t) do { } while (0)
В новом ядре 2.6.35.4 в драйвере i2c rt_mutex_lock(&adap->bus_lock);
заменил mutex_lock()
. Как это блокируется тогда?
do ... while (0)
, но там код имеет действия внутри тела цикла, в отличие от здесь. Так что это несколько другое. - person Jonathan Leffler   schedule 22.09.2010do{}while(0)
. - person RBerteig   schedule 22.09.2010preempt_disable()
в любой момент кода, чтобы предоставить инструкцию, которая ничего не делает. - person paxdiablo   schedule 22.09.2010