summaryrefslogtreecommitdiff
path: root/src/components/transport_manager/src/usb/libusb/usb_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/transport_manager/src/usb/libusb/usb_handler.cc')
-rw-r--r--src/components/transport_manager/src/usb/libusb/usb_handler.cc52
1 files changed, 29 insertions, 23 deletions
diff --git a/src/components/transport_manager/src/usb/libusb/usb_handler.cc b/src/components/transport_manager/src/usb/libusb/usb_handler.cc
index eb0ffdb4dc..776bb56c5d 100644
--- a/src/components/transport_manager/src/usb/libusb/usb_handler.cc
+++ b/src/components/transport_manager/src/usb/libusb/usb_handler.cc
@@ -1,4 +1,4 @@
-/**
+/*
* \file usb_handler.cc
* \brief UsbHandler class source file.
*
@@ -39,7 +39,9 @@
#include "transport_manager/usb/common.h"
#include "transport_manager/transport_adapter/transport_adapter_impl.h"
+#include "utils/macro.h"
#include "utils/logger.h"
+#include "utils/threads/thread.h"
namespace transport_manager {
namespace transport_adapter {
@@ -75,14 +77,16 @@ class UsbHandler::ControlTransferSequenceState {
UsbHandler::UsbHandler()
: shutdown_requested_(false),
- thread_(),
+ thread_(NULL),
usb_device_listeners_(),
devices_(),
transfer_sequences_(),
device_handles_to_close_(),
libusb_context_(NULL),
arrived_callback_handle_(),
- left_callback_handle_() {}
+ left_callback_handle_() {
+ thread_ = threads::CreateThread("UsbHandler", new UsbHandlerDelegate(this));
+}
UsbHandler::~UsbHandler() {
shutdown_requested_ = true;
@@ -91,12 +95,15 @@ UsbHandler::~UsbHandler() {
arrived_callback_handle_);
libusb_hotplug_deregister_callback(libusb_context_, left_callback_handle_);
}
- pthread_join(thread_, 0);
+ thread_->stop();
LOG4CXX_INFO(logger_, "UsbHandler thread finished");
if (libusb_context_) {
libusb_exit(libusb_context_);
libusb_context_ = 0;
}
+ thread_->join();
+ delete thread_->delegate();
+ threads::DeleteThread(thread_);
}
void UsbHandler::DeviceArrived(libusb_device* device_libusb) {
@@ -209,11 +216,6 @@ void UsbHandler::CloseDeviceHandle(libusb_device_handle* device_handle) {
device_handles_to_close_.push_back(device_handle);
}
-void* UsbHandlerThread(void* data) {
- static_cast<UsbHandler*>(data)->Thread();
- return 0;
-}
-
int ArrivedCallback(libusb_context* context, libusb_device* device,
libusb_hotplug_event event, void* data) {
LOG4CXX_TRACE(logger_, "enter. libusb device arrived (bus number "
@@ -286,19 +288,12 @@ TransportAdapter::Error UsbHandler::Init() {
return TransportAdapter::FAIL;
}
- const int thread_start_error =
- pthread_create(&thread_, 0, &UsbHandlerThread, this);
- if (0 != thread_start_error) {
- LOG4CXX_ERROR(logger_, "USB device scanner thread start failed, error code "
- << thread_start_error);
+ if (!thread_->start()) {
+ LOG4CXX_ERROR(logger_, "USB device scanner thread start failed, error code");
LOG4CXX_TRACE(logger_,
- "exit with TransportAdapter::FAIL. Condition: 0 !== thread_start_error");
+ "exit with TransportAdapter::FAIL.");
return TransportAdapter::FAIL;
}
- LOG4CXX_INFO(logger_, "UsbHandler thread started");
- pthread_setname_np(thread_, "UsbHandler" );
- LOG4CXX_TRACE(logger_,
- "exit with TransportAdapter::OK. Condition: 0 == thread_start_error");
return TransportAdapter::OK;
}
@@ -357,13 +352,13 @@ void UsbHandler::SubmitControlTransfer(
assert(transfer->Type() == UsbControlTransfer::VENDOR);
const libusb_request_type request_type = LIBUSB_REQUEST_TYPE_VENDOR;
- libusb_endpoint_direction endpoint_direction;
+ libusb_endpoint_direction endpoint_direction = LIBUSB_ENDPOINT_IN;
if (transfer->Direction() == UsbControlTransfer::IN) {
endpoint_direction = LIBUSB_ENDPOINT_IN;
} else if (transfer->Direction() == UsbControlTransfer::OUT) {
endpoint_direction = LIBUSB_ENDPOINT_OUT;
} else {
- assert(0);
+ NOTREACHED();
}
const uint8_t request = transfer->Request();
const uint16_t value = transfer->Value();
@@ -470,5 +465,16 @@ void UsbHandler::ControlTransferSequenceState::Finish() {
finished_ = true;
}
-} // namespace
-} // namespace
+UsbHandler::UsbHandlerDelegate::UsbHandlerDelegate(
+ UsbHandler* handler)
+ : handler_(handler) {
+}
+
+void UsbHandler::UsbHandlerDelegate::threadMain() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ DCHECK(handler_);
+ handler_->Thread();
+}
+
+} // namespace transport_adapter
+} // namespace transport_manager