2012-09-25 10 views
6

तो नीचे दिए गए कोड के रूप मेंनेस्टेड spin_lock_irqsave

void test(void) 
{ 
    spin_lock_irqsave(&lock1, flag); 
    ... 
    func1(); 
    ... 
    spin_unlock_irqrestore(&lock1, flag); 
} 

void func1(void) 
{ 
    spin_lock_irqsave(&lock2, flag); 
    ... 
    spin_unlock_irqrestore(&lock2, flag); 
} 

वहाँ कोड से संबंधित कोई समस्या हो जाएगा? जब spin_unlock_irqrestore func1 में कॉल किया जाता है, तो क्या अंतराल पहले ही सक्षम हो जाएगा? मैं जो हासिल करना चाहता हूं वह test() शेड्यूलर या इंटरप्ट्स द्वारा किसी भी बाधा के बिना दिनचर्या निष्पादित किया जा सकता है। बहुत बहुत धन्यवाद

+1

दरअसल, 'spin_lock_irqsave()/spin_unlock_irq_restore()' spin_lock_irq()/spin_unlock_irq() 'के अलावा 'spin_lock_irqsave()/spin_unlock_irq_restore()' होने का पूरा बिंदु है। – ninjalj

उत्तर

6

जहां तक ​​मुझे प्रलेखन में मिला है, और मैंने अपनी खोज पूरी तरह से समाप्त नहीं की है, flag विभिन्न झंडे सेट करने वाले बिट्स की स्थिति को सहेज लेगा और फिर इंटरप्ट को बंद कर देगा, फिर पुनर्स्थापित करें अंत में यदि पहली कॉल test द्वारा इंटरप्ट को बंद कर दिया गया है और फिर आप एक और कॉल करते हैं, तो मुझे लगता है कि (और कुछ भी मुझे नहीं मिला है जो मुझे मिला है) कि यह इंटरप्ट को बंद कर देगा, flags स्टोर करें और func() के अंदर उन्हें पुनर्स्थापित करें और फिर उन्हें वापस flag पर पुनर्स्थापित करें test में है।

इंटरप्ट्स को केवल test फ़ंक्शन के बाद पुनः सक्षम होना चाहिए।

मैं कहूंगा कि आपका एकमात्र पकड़ यह है कि आप दोनों कार्यों में उसी flag चर का उपयोग नहीं कर सकते हैं, अन्यथा आप अपने आंतरिक कॉल में पहले व्यक्ति को ओवरराइट कर देंगे और फिर इसे रीसेट करेंगे, और यदि आपकी कॉल के बीच कोई झंडे बदल गया है, आप बाहरी को गलत स्थिति में रीसेट कर सकते हैं।

+1

यह सही है। नेस्टेड spin_lock_irqsave() पूरी तरह से ठीक है, जब तक आप विभिन्न "झंडे" चर का उपयोग करते हैं। – Roland