как работает {} while (0) в макросе?

Хотя эта тема много раз обсуждалась на этом форуме и на всех других форумах, все же у меня есть сомнения. Пожалуйста помоги.

Как работает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 определить в двух местах в ядре:

Вkernel/rtmutex-debug.c:

void rt_mutex_deadlock_account_lock(struct rt_mutex *lock, 
    struct task_struct *task)
{
    //....
}

Вkernel/rtmutex.h:

#define rt_mutex_deadlock_account_lock(m, t) do { } while (0)

В новом ядре 2.6.35.4 в драйвере i2crt_mutex_lock(&adap->bus_lock); заменилmutex_lock(), Как это заблокировать тогда?

Ответы на вопрос(3)

Ваш ответ на вопрос