diff options
-rw-r--r-- | components/usb_service/usb_context.cc | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/components/usb_service/usb_context.cc b/components/usb_service/usb_context.cc index b8668a0..963986a 100644 --- a/components/usb_service/usb_context.cc +++ b/components/usb_service/usb_context.cc @@ -4,6 +4,7 @@ #include "components/usb_service/usb_context.h" +#include "base/atomicops.h" #include "base/logging.h" #include "base/synchronization/waitable_event.h" #include "base/threading/platform_thread.h" @@ -25,7 +26,7 @@ class UsbContext::UsbEventHandler : public base::PlatformThread::Delegate { virtual void ThreadMain() OVERRIDE; private: - volatile bool running_; + base::subtle::Atomic32 running_; libusb_context* context_; base::PlatformThreadHandle thread_handle_; base::WaitableEvent start_polling_; @@ -33,19 +34,17 @@ class UsbContext::UsbEventHandler : public base::PlatformThread::Delegate { }; UsbContext::UsbEventHandler::UsbEventHandler(libusb_context* context) - : running_(true), - context_(context), + : context_(context), thread_handle_(0), start_polling_(false, false) { + base::subtle::Release_Store(&running_, 1); bool success = base::PlatformThread::Create(0, this, &thread_handle_); DCHECK(success) << "Failed to create USB IO handling thread."; start_polling_.Wait(); } UsbContext::UsbEventHandler::~UsbEventHandler() { - running_ = false; - // Spreading running_ to the UsbEventHandler thread. - base::subtle::MemoryBarrier(); + base::subtle::Release_Store(&running_, 0); libusb_interrupt_handle_event(context_); base::PlatformThread::Join(thread_handle_); } @@ -53,10 +52,11 @@ UsbContext::UsbEventHandler::~UsbEventHandler() { void UsbContext::UsbEventHandler::ThreadMain() { base::PlatformThread::SetName("UsbEventHandler"); VLOG(1) << "UsbEventHandler started."; - if (running_) { + + if (base::subtle::Acquire_Load(&running_)) { start_polling_.Signal(); } - while (running_) { + while (base::subtle::Acquire_Load(&running_)) { const int rv = libusb_handle_events(context_); if (rv != LIBUSB_SUCCESS) { VLOG(1) << "Failed to handle events: " << ConvertErrorToString(rv); |