Aunque este tema ha sido discutido muchas veces en este foro y en todos los demás foros, todavía tengo dudas. Por favor ayuda.¿cómo funciona {} mientras (0) funciona en macro?
¿Cómo funciona la macro do{} while(0)
en el kernel de Linux? Por ejemplo,
#define preempt_disable() do { } while (0)
¿Cómo TI Desactivar preempt?
#define might_resched() do { } while (0)
¿Cómo se reprograma?
De forma similar, he visto macros para bloqueos mutex y otros también. ¿Cómo ayuda esto? Entiendo por el siguiente problema pero no por los ejemplos anteriores.
#define foo(x) do { do something } while(0)
Editar:
¿Qué pasa con el siguiente código para 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);
}
}
estoy confundido porque rt_mutex_deadlock_account_lock
es definir en dos lugares en el kernel:
En kernel/rtmutex-debug.c
:
void rt_mutex_deadlock_account_lock(struct rt_mutex *lock,
struct task_struct *task)
{
//....
}
En kernel/rtmutex.h
:
#define rt_mutex_deadlock_account_lock(m, t) do { } while (0)
En nuevo kernel 2.6. 35.4 en el controlador i2c rt_mutex_lock(&adap->bus_lock);
ha s reemplazado el mutex_lock()
. ¿Cómo se bloquea esto?
me parece que redefine esa función para no hacer nada. – mpen
@Mark: suena convincente. ravspratapsingh: ¿Hemos acertado que para las dos afirmaciones superiores, realmente no hay nada entre las llaves? ¿O simplemente has simplificado el código de esta manera? – chiccodoro
posible duplicado de [¿Cuál es el uso de do while (0) cuando definimos una macro?] (Http://stackoverflow.com/questions/923822/whats-the-use-of-do-while0-when-we- define-a-macro) – paxdiablo