Mặc dù chủ đề này đã được thảo luận nhiều lần trong diễn đàn này và tất cả các diễn đàn khác, tôi vẫn còn nghi ngờ. Hãy giúp tôi.cách thực hiện {} trong khi (0) hoạt động trong macro?
Làm cách nào để do{} while(0)
hoạt động vĩ mô trong hạt nhân Linux? Ví dụ:
#define preempt_disable() do { } while (0)
Làm cách nào để vô hiệu hóa chế độ xem trước?
#define might_resched() do { } while (0)
Làm cách nào để lên lịch lại?
Tương tự như vậy tôi đã thấy các macro cho khóa mutex và các loại khác. Điều này giúp ích như thế nào? Tôi hiểu cho vấn đề sau nhưng không phải cho các ví dụ trên.
#define foo(x) do { do something } while(0)
Edit:
gì về đoạn mã sau cho 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);
}
}
Tôi đang bối rối vì rt_mutex_deadlock_account_lock
là xác định ở hai nơi trong kernel:
Trong kernel/rtmutex-debug.c
:
void rt_mutex_deadlock_account_lock(struct rt_mutex *lock,
struct task_struct *task)
{
//....
}
Trong kernel/rtmutex.h
:
#define rt_mutex_deadlock_account_lock(m, t) do { } while (0)
Trong hạt nhân mới 2.6. 35.4 trong trình điều khiển i2c rt_mutex_lock(&adap->bus_lock);
ha s đã thay thế số mutex_lock()
. Làm thế nào để khóa này sau đó?
trông giống như tôi định nghĩa lại chức năng đó để không làm gì cả. – mpen
@Mark: Âm thanh thuyết phục. ravspratapsingh: Chúng ta có đúng không đối với hai câu trên, không có gì thực sự giữa niềng răng? Hay bạn chỉ đơn giản hóa mã theo cách này? – chiccodoro
có thể trùng lặp của [Việc sử dụng làm gì trong khi (0) khi chúng tôi xác định macro?] (Http://stackoverflow.com/questions/923822/whats-the-use-of-do-while0-when-we- define-a-macro) – paxdiablo