An Overlay-based
Virtual Network Substrate
SpoVNet

source: trash/InterruptableSleeper.cpp @ 6841

Last change on this file since 6841 was 6841, checked in by mies, 14 years ago
File size: 2.2 KB
Line 
1#include "InterruptableSleeper.h"
2
3namespace spovnet {
4namespace common {
5
6InterruptableSleeper::InterruptableSleeper() {
7        boost::mutex::scoped_lock scopedLock(m_mutex);
8
9#ifdef WIN32
10        m_handle = CreateEvent (NULL, TRUE, FALSE, NULL);
11        assert (m_handle != NULL);
12#else
13        m_handle = new MUTEX_COND();
14        int ret = 0;
15
16        ret = pthread_mutex_init(&(m_handle->mutex), NULL);
17        assert (ret == 0);
18
19        ret = pthread_cond_init(&(m_handle->cond), NULL);
20        assert (ret == 0);
21#endif
22}
23
24InterruptableSleeper::~InterruptableSleeper() {
25        boost::mutex::scoped_lock scopedLock(m_mutex);
26
27#ifdef WIN32
28        BOOL ret = CloseHandle (m_handle);
29        assert (ret == TRUE);
30#else
31        int ret = 0;
32
33        ret = pthread_cond_destroy(&(m_handle->cond));
34        assert (ret == 0);
35
36        ret = pthread_mutex_destroy(&(m_handle->mutex));
37        assert (ret == 0);
38
39        delete m_handle;
40#endif
41}
42
43void InterruptableSleeper::interrupt() {
44        boost::mutex::scoped_lock scopedLock(m_mutex);
45
46#ifdef WIN32
47        BOOL ret = SetEvent (m_handle);
48        assert (ret == TRUE);
49#else
50        int ret = pthread_cond_signal(&(m_handle)->cond);
51        assert (ret == 0);
52#endif
53}
54
55void InterruptableSleeper::sleep(unsigned long millis) {
56        //
57        // NO mutex, otherwise the ::interrupt
58        // function can not be called at all
59        //
60
61#ifdef WIN32
62
63        DWORD dret = WaitForSingleObject (m_handle, millis);
64        assert (dret != WAIT_FAILED);
65
66#else
67
68        int ret;
69        struct timespec tm;
70        struct timeb tp;
71
72        ret = pthread_mutex_lock(&(m_handle->mutex));
73        assert (ret == 0);
74
75        long sec = millis / 1000;
76        long millisec = millis % 1000;
77
78        ftime(&tp);
79        tp.time += sec;
80        tp.millitm += millisec;
81
82        if (tp.millitm > 999) {
83                tp.millitm -= 1000;
84                tp.time++;
85        }
86
87        tm.tv_sec = tp.time;
88        tm.tv_nsec = tp.millitm * 1000000;
89
90        ret = pthread_cond_timedwait(&(m_handle->cond), &(m_handle->mutex), &tm);
91        assert (ret == 0 || ret == ETIMEDOUT);
92
93        ret = pthread_mutex_unlock(&(m_handle->mutex));
94        assert (ret == 0);
95
96#endif
97
98        //
99        // under Windows we have to reset the event again
100        //
101
102#ifdef WIN32
103        {
104                boost::mutex::scoped_lock scopedLock (m_mutex);
105                BOOL bret;
106                bret = ResetEvent (m_handle);
107                assert (bret == TRUE);
108        }
109#endif
110}
111}
112} // namespace spovnet, common
Note: See TracBrowser for help on using the repository browser.