2010-02-22 13 views
11

पर कॉल किए बिना निकालें, मैं इसे पुन: उपयोग करने से ठीक पहले IO_service से सभी हैंडलर को हटाना चाहता हूं। क्या यह संभव है?सभी हैंडलर को बूस्ट :: एएसओ :: io_service से उन्हें

मैं यूनिट परीक्षण लिख रहा हूं जिसमें asio::io_service शामिल है। प्रत्येक टेस्ट केस के बीच में मैं वैश्विक io_service से हैंडलर को साफ़ करना चाहता हूं। मैंने सोचा कि io_service::reset ऐसा होगा लेकिन यह नहीं करता है। reset() केवल io_service को फिर से शुरू करने की अनुमति देता है। अंतिम टेस्ट केस के सभी हैंडलर अभी भी कतारबद्ध हैं।

मुझे केवल यूनिट परीक्षण के लिए ऐसा करने की आवश्यकता है ताकि कोई पागल हैक काम करे।


और जानकारी:

io_service एक deadline_timer सदस्य चर से है। deadline_timer मैं जिस कोड का परीक्षण कर रहा हूं उसका हिस्सा है, इसलिए मैं इसे कैसे बदल सकता हूं इसे बदल नहीं सकता। मुझे की get_io_service विधि के माध्यम से io_service पर पकड़ प्राप्त है।

+0

आप अपने 'सेटअप()' विधि में 'io_service' नहीं बना सकते हैं और फिर इसे अपने' टियरडाउन() 'विधि में नष्ट कर सकते हैं, क्या आप कर सकते हैं? –

उत्तर

3

ठीक है, मैंने कुछ दिनों के लिए इस पर अपने दिमाग को रैक किया और एक व्यावहारिक समाधान के साथ आया। यह सभी हैक्स की मां है।

void clear(boost::asio::io_service& service) 
{ 
    service.stop(); 
    service.~io_service(); 
    new(&service) boost::asio::io_service; 
} 

मुझे यकीन नहीं है कि यह प्रोडक्शन कोड के लिए कितना सुरक्षित होगा। लेकिन अब तक ऐसा लगता है (कोई segfaults, कोई अजीब व्यवहार नहीं)।

+0

आप गतिशील रूप से io_service आवंटित कर सकते हैं और उसे std :: auto_ptr या boost :: scoped_ptr में संग्रहीत कर सकते हैं। फिर जब आप हैंडलर को "साफ़" करने की आवश्यकता होती है तो आप इसे रीसेट कर सकते हैं। इस तरह आप प्लेसमेंट का उपयोग करने से बचें (इस मामले में आपको विनाशक को स्पष्ट रूप से कॉल करने की आवश्यकता है - http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10 देखें)। – Yukiko

+0

@Yukiko: मैं कोड को नियंत्रित नहीं करता जो io_service बनाता है। इसके अलावा मैं उस कोड को contol नहीं करता जो deadline_timer की io_service सेट करता है। संक्षेप में मैं io_service आवंटित नहीं करता हूं इसलिए मैं इसे smart_ptr में संग्रहीत नहीं कर सकता। –

+0

मैं बूस्ट 1.4 9 का उपयोग कर रहा हूं। वह चाल काम नहीं कर रही है (कुछ दावा विफल) –

संबंधित मुद्दे