हालांकि इस मंच और अन्य सभी मंचों में इस विषय पर कई बार चर्चा की गई है, फिर भी मुझे संदेह है। कृपया मदद करे।{} जबकि (0) मैक्रो में कैसे काम करता है?
लिनक्स कर्नेल में मैक्रो काम में do{} while(0)
कैसे करता है? उदाहरण के लिए,
#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 i2c ड्राइवर rt_mutex_lock(&adap->bus_lock);
हेक्टेयर में mutex_lock()
को प्रतिस्थापित किया गया है। तब यह लॉक कैसे होता है?
मुझे लगता है कि यह कार्य कुछ भी करने के लिए फिर से परिभाषित करता है। – mpen
@ मार्क: समझदार लगता है। ravspratapsingh: क्या हमें यह सही मिला है कि दो ऊपरी बयान के लिए, ब्रेसिज़ के बीच वास्तव में कुछ भी नहीं है? या आपने इस तरह कोड को सरल बना दिया है? – chiccodoro
संभावित डुप्लिकेट [जब हम मैक्रो को परिभाषित करते हैं तो (0) का उपयोग क्या होता है?] (Http://stackoverflow.com/questions/923822/whats-the-use-of-do-while0-when-we- Define-a-macro) – paxdiablo