diff options
| -rw-r--r-- | host/include/uhd/utils/atomic.hpp | 11 | ||||
| -rw-r--r-- | host/lib/transport/super_recv_packet_handler.hpp | 2 | ||||
| -rw-r--r-- | host/lib/transport/super_send_packet_handler.hpp | 2 | 
3 files changed, 15 insertions, 0 deletions
| diff --git a/host/include/uhd/utils/atomic.hpp b/host/include/uhd/utils/atomic.hpp index dc1790c3f..7a81d8d5e 100644 --- a/host/include/uhd/utils/atomic.hpp +++ b/host/include/uhd/utils/atomic.hpp @@ -82,12 +82,23 @@ namespace uhd{              _count.write(size);          } +        /*! +         * Force the barrier wait to throw a boost::thread_interrupted +         * The threads were not getting the interruption_point on windows. +         */ +        void interrupt(void) +        { +            _count.write(boost::uint32_t(~0)); +        } +          //! Wait on the barrier condition          UHD_INLINE void wait(void){              _count.dec();              _count.cas(_size, 0);              while (_count.read() != _size){                  boost::this_thread::interruption_point(); +                if (_count.read() == boost::uint32_t(~0)) +                    throw boost::thread_interrupted();                  boost::this_thread::yield();              }          } diff --git a/host/lib/transport/super_recv_packet_handler.hpp b/host/lib/transport/super_recv_packet_handler.hpp index 4b96199e2..7a1972690 100644 --- a/host/lib/transport/super_recv_packet_handler.hpp +++ b/host/lib/transport/super_recv_packet_handler.hpp @@ -79,6 +79,8 @@ public:      }      ~recv_packet_handler(void){ +        _task_barrier_entry.interrupt(); +        _task_barrier_exit.interrupt();          _task_handlers.clear();      } diff --git a/host/lib/transport/super_send_packet_handler.hpp b/host/lib/transport/super_send_packet_handler.hpp index 8f943effb..74e893e67 100644 --- a/host/lib/transport/super_send_packet_handler.hpp +++ b/host/lib/transport/super_send_packet_handler.hpp @@ -61,6 +61,8 @@ public:      }      ~send_packet_handler(void){ +        _task_barrier_entry.interrupt(); +        _task_barrier_exit.interrupt();          _task_handlers.clear();      } | 
