diff options
Diffstat (limited to 'src/components/transport_manager')
53 files changed, 519 insertions, 443 deletions
diff --git a/src/components/transport_manager/CMakeLists.txt b/src/components/transport_manager/CMakeLists.txt index 15ecc91619..68358a5f3d 100644 --- a/src/components/transport_manager/CMakeLists.txt +++ b/src/components/transport_manager/CMakeLists.txt @@ -92,4 +92,4 @@ if (BUILD_BT_SUPPORT) endif() if (CMAKE_SYSTEM_NAME STREQUAL "QNX") -endif()
\ No newline at end of file +endif() diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_connection_factory.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_connection_factory.h index 48d1f15538..4d1d474377 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_connection_factory.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_connection_factory.h @@ -1,4 +1,4 @@ -/** +/* * \file bluetooth_connection_factory.h * \brief BluetoothConnectionFactory class header file. * diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device.h index 4abef3c604..f28147a3b5 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device.h @@ -1,4 +1,4 @@ -/** +/* * \file bluetooth_device.h * \brief BluetoothDevice class header file. * @@ -37,11 +37,6 @@ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_BLUETOOTH_BLUETOOTH_DEVICE_H_ #include <bluetooth/bluetooth.h> -#include <bluetooth/hci.h> -#include <bluetooth/hci_lib.h> -#include <bluetooth/sdp.h> -#include <bluetooth/sdp_lib.h> -#include <bluetooth/rfcomm.h> #include <vector> diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h index 0c68c67216..d1bed9b3dc 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h @@ -1,4 +1,4 @@ -/** +/* * \file bluetooth_device_scanner.h * \brief BluetoothDeviceScanner class header file. * @@ -46,7 +46,9 @@ #include "transport_manager/transport_adapter/device_scanner.h" #include "utils/conditional_variable.h" #include "utils/lock.h" -#include "utils/threads/thread.h" +#include "utils/threads/thread_delegate.h" + +class Thread; namespace transport_manager { namespace transport_adapter { diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h index e1606da878..3de77ab529 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h @@ -1,4 +1,4 @@ -/** +/* * \file bluetooth_socket_connection.h * \brief BluetoothSocketConnection class header file. * diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h index 075b5da55f..69a588fd37 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_transport_adapter.h @@ -1,4 +1,4 @@ -/** +/* * \file bluetooth_transport_adapter.h * \brief BluetoothAdapter class header file. * diff --git a/src/components/transport_manager/include/transport_manager/tcp/dnssd_service_browser.h b/src/components/transport_manager/include/transport_manager/tcp/dnssd_service_browser.h index cd319ca543..d31beea26c 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/dnssd_service_browser.h +++ b/src/components/transport_manager/include/transport_manager/tcp/dnssd_service_browser.h @@ -1,4 +1,4 @@ -/** +/* * \file dnssd_service_browser.h * \brief DnssdServiceBrowser class header file. * @@ -38,12 +38,12 @@ #include <string> #include <vector> -#include <pthread.h> #include <avahi-client/client.h> #include <avahi-client/lookup.h> #include <avahi-common/error.h> #include <avahi-common/thread-watch.h> +#include "utils/lock.h" #include "transport_manager/transport_adapter/device_scanner.h" #include "transport_manager/transport_adapter/transport_adapter.h" @@ -121,7 +121,7 @@ class DnssdServiceBrowser : public DeviceScanner { typedef std::vector<DnssdServiceRecord> ServiceRecords; ServiceRecords service_records_; - pthread_mutex_t mutex_; + sync_primitives::Lock mutex_; bool initialised_; } diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h index 12eab5a1b5..f54e5a8fc2 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_client_listener.h @@ -1,4 +1,4 @@ -/** +/* * \file tcp_client_listener.h * \brief TcpClientListener class header file. * @@ -36,10 +36,10 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_CLIENT_LISTENER_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_CLIENT_LISTENER_H_ +#include "utils/threads/thread_delegate.h" #include "transport_manager/transport_adapter/client_connection_listener.h" -#include "utils/threads/thread_delegate.h" -#include "utils/threads/thread.h" +class Thread; namespace transport_manager { namespace transport_adapter { @@ -49,8 +49,7 @@ class TransportAdapterController; /** * @brief Listener of device adapter that use TCP transport. */ -class TcpClientListener : public ClientConnectionListener, - public threads::ThreadDelegate { +class TcpClientListener : public ClientConnectionListener { public: /** * @breaf Constructor. @@ -64,14 +63,6 @@ class TcpClientListener : public ClientConnectionListener, bool enable_keepalive); /** - * @brief Start TCP client listener thread. - */ - void threadMain(); - - bool exitThreadMain(); - protected: - - /** * @brief Destructor. */ virtual ~TcpClientListener(); @@ -107,15 +98,26 @@ class TcpClientListener : public ClientConnectionListener, * @brief Terminate TCP client listener thread. */ virtual TransportAdapter::Error StopListening(); + private: const uint16_t port_; const bool enable_keepalive_; TransportAdapterController* controller_; - // TODO(Eamakhov): change to threads::Thread usage threads::Thread* thread_; int socket_; - bool thread_started_; bool thread_stop_requested_; + + void Loop(); + void StopLoop(); + + class ListeningThreadDelegate : public threads::ThreadDelegate { + public: + explicit ListeningThreadDelegate(TcpClientListener* parent); + virtual void threadMain(); + void exitThreadMain(); + private: + TcpClientListener* parent_; + }; }; } // namespace transport_adapter diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h index fba85aa601..690c3127bd 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h @@ -1,4 +1,4 @@ -/** +/* * \file tcp_connection_factory.h * \brief TcpConnectionFactory class header file. * @@ -54,7 +54,6 @@ class TcpConnectionFactory : public ServerConnectionFactory { * @param controller Pointer to the device adapter controller. */ TcpConnectionFactory(TransportAdapterController* controller); - protected: /** * @brief Start TCP connection factory. @@ -69,8 +68,8 @@ class TcpConnectionFactory : public ServerConnectionFactory { * * @return Error information about possible reason of failure. */ - virtual TransportAdapter::Error CreateConnection(const DeviceUID& device_uid, - const ApplicationHandle& app_handle); + virtual TransportAdapter::Error CreateConnection( + const DeviceUID& device_uid, const ApplicationHandle& app_handle); /** * @brief diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_device.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_device.h index 08821ab3c4..2b89e09020 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_device.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_device.h @@ -1,4 +1,4 @@ -/** +/* * \file tcp_device.h * \brief TcpDevice class header file. * @@ -47,6 +47,8 @@ #include <sys/types.h> #include <sys/socket.h> +#include "utils/lock.h" + namespace transport_manager { namespace transport_adapter { @@ -136,7 +138,7 @@ class TcpDevice : public Device { uint16_t port; }; std::map<ApplicationHandle, Application> applications_; - mutable pthread_mutex_t applications_mutex_; + mutable sync_primitives::Lock applications_mutex_; const in_addr_t in_addr_; const std::string name_; ApplicationHandle last_handle_; diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h index 8fe7b8e837..9af825ea93 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h @@ -1,4 +1,4 @@ -/** +/* * \file tcp_socket_connection.h * \brief TcpSocketConnection class header file. * diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h index 1319c40eeb..277194b512 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_transport_adapter.h @@ -1,4 +1,4 @@ -/** +/* * \file tcp_transport_adapter.h * \brief TcpTransportAdapter class header file. * diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/client_connection_listener.h b/src/components/transport_manager/include/transport_manager/transport_adapter/client_connection_listener.h index 41658fb45f..018dd46810 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/client_connection_listener.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/client_connection_listener.h @@ -1,6 +1,4 @@ -/** - * \file client_connection_listener.h - * \brief ClientConnectionListener class header file. +/* * Copyright (c) 2013, Ford Motor Company * All rights reserved. * diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/connection.h b/src/components/transport_manager/include/transport_manager/transport_adapter/connection.h index 094cb51921..d09e9643b1 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/connection.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/connection.h @@ -1,4 +1,4 @@ -/** +/* * \file connection.h * \brief Connection class header. * Copyright (c) 2013, Ford Motor Company diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/device_scanner.h b/src/components/transport_manager/include/transport_manager/transport_adapter/device_scanner.h index 5b09a726e5..36759a9385 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/device_scanner.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/device_scanner.h @@ -1,4 +1,4 @@ -/** +/* * \file device_scanner.h * \brief DeviceScanner class header file. * Copyright (c) 2013, Ford Motor Company diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/server_connection_factory.h b/src/components/transport_manager/include/transport_manager/transport_adapter/server_connection_factory.h index d944594d88..19c37aa6a6 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/server_connection_factory.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/server_connection_factory.h @@ -1,4 +1,4 @@ -/** +/* * \file server_connection_factory.h * \brief ServerConnectionFactory class header file. * Copyright (c) 2013, Ford Motor Company diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h index 851f250a88..399ddb1fcf 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h @@ -1,4 +1,4 @@ -/** +/* * \file threaded_socket_connection.h * \brief Header for classes responsible for communication over sockets. * Copyright (c) 2013, Ford Motor Company @@ -41,10 +41,12 @@ #include "transport_manager/transport_adapter/connection.h" #include "protocol/common.h" #include "utils/threads/thread_delegate.h" -#include "utils/threads/thread.h" +#include "utils/lock.h" using ::transport_manager::transport_adapter::Connection; +class Thread; + namespace transport_manager { namespace transport_adapter { @@ -133,7 +135,7 @@ class ThreadedSocketConnection : public Connection, int read_fd_; int write_fd_; void threadMain(); - bool exitThreadMain(); + void exitThreadMain(); void Transmit(); void Finalize(); TransportAdapter::Error Notify() const; @@ -147,7 +149,7 @@ class ThreadedSocketConnection : public Connection, **/ typedef std::queue<protocol_handler::RawMessagePtr> FrameQueue; FrameQueue frames_to_send_; - mutable pthread_mutex_t frames_to_send_mutex_; + mutable sync_primitives::Lock frames_to_send_mutex_; int socket_; bool terminate_flag_; diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h index 2c27e0d20f..f66f1c6bb9 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h @@ -39,6 +39,8 @@ #include <memory> #include <string> +#include "utils/lock.h" +#include "utils/rwlock.h" #include "transport_manager/transport_adapter/transport_adapter.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" #include "transport_manager/transport_adapter/connection.h" @@ -99,6 +101,12 @@ class TransportAdapterImpl : public TransportAdapter, virtual TransportAdapter::Error Init(); /** + * @brief Stops device adapter + * Called from transport manager to stop device adapter + */ + virtual void Terminate(); + + /** * @brief Add listener to the container(list) of device adapter listeners. * * @param listener Pointer to the device adapter listener. @@ -493,7 +501,7 @@ class TransportAdapterImpl : public TransportAdapter, /** * @brief Mutex restricting access to device map. **/ - mutable pthread_mutex_t devices_mutex_; + mutable sync_primitives::Lock devices_mutex_; /** * @brief Container(map) of connections. @@ -503,9 +511,16 @@ class TransportAdapterImpl : public TransportAdapter, /** * @brief Mutex restricting access to connections map. **/ - mutable pthread_mutex_t connections_mutex_; + mutable sync_primitives::RWLock connections_lock_; protected: +#ifdef TIME_TESTER + /** + * @brief Pointer to time metric observer + */ + TMMetricObserver* metric_observer_; +#endif // TIME_TESTER + /** * @brief Pointer to the device scanner. */ @@ -520,14 +535,8 @@ class TransportAdapterImpl : public TransportAdapter, * @brief Pointer to the factory of connections initiated from client. */ ClientConnectionListener* client_connection_listener_; - -#ifdef TIME_TESTER - /** - * @brief Pointer to time metric observer - */ - TMMetricObserver* metric_observer_; -#endif // TIME_TESTER }; + } // namespace transport_adapter } // namespace transport_manager diff --git a/src/components/transport_manager/include/transport_manager/transport_manager_impl.h b/src/components/transport_manager/include/transport_manager/transport_manager_impl.h index 62fdb3fa2e..4c38716f3f 100644 --- a/src/components/transport_manager/include/transport_manager/transport_manager_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_manager_impl.h @@ -33,15 +33,12 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TRANSPORT_MANAGER_IMPL_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TRANSPORT_MANAGER_IMPL_H_ -#include <pthread.h> - #include <queue> #include <map> #include <list> #include <algorithm> #include "utils/timer_thread.h" -#include "utils/rwlock.h" #include "transport_manager/transport_manager.h" #include "transport_manager/transport_manager_listener.h" @@ -104,6 +101,12 @@ class TransportManagerImpl : public TransportManager, virtual int Init(); /** + * Reinitializes transport manager + * @return Error code + */ + virtual int Reinit(); + + /** * @brief Start scanning for new devices. * * @return Code error. @@ -250,12 +253,6 @@ class TransportManagerImpl : public TransportManager, **/ void PostEvent(const TransportAdapterEvent& event); - /** - * @brief flag that indicates that thread is active - * if it is false then threads exist main loop - **/ - volatile bool all_thread_active_; - typedef std::list<TransportManagerListener*> TransportManagerListenerList; /** * @brief listener that would be called when TM's event happened. @@ -263,11 +260,6 @@ class TransportManagerImpl : public TransportManager, TransportManagerListenerList transport_manager_listener_; /** - * @brief Condition variable to wake up event - **/ - pthread_cond_t device_listener_thread_wakeup_; - - /** * @brief Flag that TM is initialized */ bool is_initialized_; @@ -352,6 +344,9 @@ class TransportManagerImpl : public TransportManager, unsigned char** frame); void OnDeviceListUpdated(TransportAdapter* ta); + void DisconnectAllDevices(); + void TerminateAllAdapters(); + int InitAllAdapters(); static Connection convert(const ConnectionInternal& p); }; // class ; diff --git a/src/components/transport_manager/include/transport_manager/usb/libusb/platform_usb_device.h b/src/components/transport_manager/include/transport_manager/usb/libusb/platform_usb_device.h index d1f485c9d5..b90c504a4b 100644 --- a/src/components/transport_manager/include/transport_manager/usb/libusb/platform_usb_device.h +++ b/src/components/transport_manager/include/transport_manager/usb/libusb/platform_usb_device.h @@ -1,4 +1,4 @@ -/** +/* * \file platform_usb_device.h * \brief libusb PlatformUsbDevice class header file. * diff --git a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_connection.h b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_connection.h index fc6af46a47..7c1fbd4551 100644 --- a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_connection.h +++ b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_connection.h @@ -49,7 +49,7 @@ class UsbConnection : public Connection { UsbConnection(const DeviceUID& device_uid, const ApplicationHandle& app_handle, TransportAdapterController* controller, - const UsbHandlerSptr& usb_handler, PlatformUsbDevice* device); + const UsbHandlerSptr usb_handler, PlatformUsbDevice* device); bool Init(); virtual ~UsbConnection(); diff --git a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h index fd6e77013a..215b66f6e3 100644 --- a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h +++ b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h @@ -1,4 +1,4 @@ -/** +/* * \file usb_handler.h * \brief libusb USB handler class header file. * @@ -36,16 +36,17 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_USB_LIBUSB_USB_HANDLER_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_USB_LIBUSB_USB_HANDLER_H_ -#include <pthread.h> - #include <libusb/libusb.h> #include "transport_manager/transport_adapter/transport_adapter.h" #include "transport_manager/usb/usb_control_transfer.h" #include "transport_manager/usb/libusb/platform_usb_device.h" -namespace transport_manager { +#include "utils/threads/thread.h" + +class Thread; +namespace transport_manager { namespace transport_adapter { class UsbHandler { @@ -71,9 +72,16 @@ class UsbHandler { friend void UsbTransferSequenceCallback(libusb_transfer* transfer); private: + class UsbHandlerDelegate: public threads::ThreadDelegate { + public: + explicit UsbHandlerDelegate(UsbHandler* handler); + void threadMain() OVERRIDE; + private: + UsbHandler* handler_; + }; + bool shutdown_requested_; - // TODO(Eamakhov): change to threads::Thread usage - pthread_t thread_; + threads::Thread* thread_; friend class UsbDeviceListener; std::list<class UsbDeviceListener*> usb_device_listeners_; diff --git a/src/components/transport_manager/include/transport_manager/usb/qnx/platform_usb_device.h b/src/components/transport_manager/include/transport_manager/usb/qnx/platform_usb_device.h index 939a8fcb3c..ab35f862c6 100644 --- a/src/components/transport_manager/include/transport_manager/usb/qnx/platform_usb_device.h +++ b/src/components/transport_manager/include/transport_manager/usb/qnx/platform_usb_device.h @@ -1,4 +1,4 @@ -/** +/* * \file platform_usb_device.h * \brief QNX PlatfromUsbDevice class header file. * diff --git a/src/components/transport_manager/include/transport_manager/usb/qnx/usb_connection.h b/src/components/transport_manager/include/transport_manager/usb/qnx/usb_connection.h index 3a0d2f8a26..d55c887bd1 100644 --- a/src/components/transport_manager/include/transport_manager/usb/qnx/usb_connection.h +++ b/src/components/transport_manager/include/transport_manager/usb/qnx/usb_connection.h @@ -36,7 +36,7 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_USB_QNX_USB_CONNECTION_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_USB_QNX_USB_CONNECTION_H_ -#include <pthread.h> +#include "utils/lock.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" #include "transport_manager/transport_adapter/connection.h" @@ -51,7 +51,7 @@ class UsbConnection : public Connection { UsbConnection(const DeviceUID& device_uid, const ApplicationHandle& app_handle, TransportAdapterController* controller, - const UsbHandlerSptr& libusb_handler, + const UsbHandlerSptr libusb_handler, PlatformUsbDevice* device); bool Init(); @@ -82,13 +82,13 @@ class UsbConnection : public Connection { unsigned char* in_buffer_; void* out_buffer_; - + usbd_urb* in_urb_; usbd_urb* out_urb_; std::list<protocol_handler::RawMessagePtr> out_messages_; ::protocol_handler::RawMessagePtr current_out_message_; - pthread_mutex_t out_messages_mutex_; + sync_primitives::Lock out_messages_mutex_; size_t bytes_sent_; bool disconnecting_; bool pending_in_transfer_; diff --git a/src/components/transport_manager/include/transport_manager/usb/qnx/usb_handler.h b/src/components/transport_manager/include/transport_manager/usb/qnx/usb_handler.h index 26b00087ff..c33e0f2361 100644 --- a/src/components/transport_manager/include/transport_manager/usb/qnx/usb_handler.h +++ b/src/components/transport_manager/include/transport_manager/usb/qnx/usb_handler.h @@ -1,4 +1,4 @@ -/** +/* * \file usb_handler.h * \brief QNX USB handler class header file. * diff --git a/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h b/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h index 55fb028ef7..b0d8c1e453 100644 --- a/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h +++ b/src/components/transport_manager/include/transport_manager/usb/usb_aoa_adapter.h @@ -1,4 +1,4 @@ -/** +/* * \file usb_aoa_adapter.h * \brief UsbAoaAdapter class header file. * diff --git a/src/components/transport_manager/include/transport_manager/usb/usb_connection_factory.h b/src/components/transport_manager/include/transport_manager/usb/usb_connection_factory.h index ed0fda91ee..ebd25bd37b 100644 --- a/src/components/transport_manager/include/transport_manager/usb/usb_connection_factory.h +++ b/src/components/transport_manager/include/transport_manager/usb/usb_connection_factory.h @@ -1,4 +1,4 @@ -/** +/* * \file usb_connection_factory.h * \brief UsbConnectionFactory class header file. * @@ -46,7 +46,7 @@ namespace transport_adapter { class UsbConnectionFactory : public ServerConnectionFactory { public: UsbConnectionFactory(TransportAdapterController* controller); - void SetUsbHandler(const UsbHandlerSptr& usb_handler); + void SetUsbHandler(const UsbHandlerSptr usb_handler); protected: virtual TransportAdapter::Error Init(); diff --git a/src/components/transport_manager/include/transport_manager/usb/usb_control_transfer.h b/src/components/transport_manager/include/transport_manager/usb/usb_control_transfer.h index 8c4f8a9d4c..c701a86e0a 100644 --- a/src/components/transport_manager/include/transport_manager/usb/usb_control_transfer.h +++ b/src/components/transport_manager/include/transport_manager/usb/usb_control_transfer.h @@ -1,4 +1,4 @@ -/** +/* * \file aoa_common.h * \brief Google AOA protocol header file. * diff --git a/src/components/transport_manager/include/transport_manager/usb/usb_device_scanner.h b/src/components/transport_manager/include/transport_manager/usb/usb_device_scanner.h index 0937222155..9efb7ba58d 100644 --- a/src/components/transport_manager/include/transport_manager/usb/usb_device_scanner.h +++ b/src/components/transport_manager/include/transport_manager/usb/usb_device_scanner.h @@ -1,4 +1,4 @@ -/** +/* * \file usb_device_scanner.h * \brief UsbDeviceScanner class header file. * @@ -38,8 +38,7 @@ #include <list> -#include <pthread.h> - +#include "utils/lock.h" #include "transport_manager/transport_adapter/device_scanner.h" #include "transport_manager/usb/common.h" @@ -69,7 +68,7 @@ class UsbDeviceScanner : public DeviceScanner, public UsbDeviceListener { typedef std::list<PlatformUsbDevice*> Devices; Devices devices_; - pthread_mutex_t devices_mutex_; + sync_primitives::Lock devices_mutex_; }; } // namespace diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc b/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc index 421104422b..02224baf4e 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc @@ -1,4 +1,4 @@ -/** +/* * \file bluetooth_connection_factory.cc * \brief BluetoothConnectionFactory class source file. * diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_device.cc b/src/components/transport_manager/src/bluetooth/bluetooth_device.cc index 1a47f6c7ff..c8061a7ac5 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device.cc @@ -33,6 +33,13 @@ #include "transport_manager/bluetooth/bluetooth_device.h" +#include <bluetooth/bluetooth.h> +#include <bluetooth/hci.h> +#include <bluetooth/hci_lib.h> +#include <bluetooth/sdp.h> +#include <bluetooth/sdp_lib.h> +#include <bluetooth/rfcomm.h> + #include <errno.h> #include <sys/types.h> #include <sys/socket.h> diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc index 547dc463b2..0fbb9d2245 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc @@ -1,4 +1,4 @@ -/** +/* * \file bluetooth_device_scanner.cc * \brief BluetoothDeviceScanner class header file. * @@ -52,6 +52,7 @@ #include "transport_manager/bluetooth/bluetooth_device.h" #include "utils/logger.h" +#include "utils/threads/thread.h" namespace transport_manager { namespace transport_adapter { @@ -117,44 +118,45 @@ BluetoothDeviceScanner::BluetoothDeviceScanner( }; sdp_uuid128_create(&smart_device_link_service_uuid_, smart_device_link_service_uuid_data); - thread_ = threads::CreateThread("BT Device Scaner", new BluetoothDeviceScannerDelegate(this)); + thread_ = threads::CreateThread("BT Device Scaner", + new BluetoothDeviceScannerDelegate(this)); } BluetoothDeviceScanner::~BluetoothDeviceScanner() { + thread_->join(); + delete thread_->delegate(); + threads::DeleteThread(thread_); } bool BluetoothDeviceScanner::IsInitialised() const { - return thread_->is_running(); + return thread_ && thread_->is_running(); } void BluetoothDeviceScanner::UpdateTotalDeviceList() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); DeviceVector devices; devices.insert(devices.end(), paired_devices_with_sdl_.begin(), paired_devices_with_sdl_.end()); devices.insert(devices.end(), found_devices_with_sdl_.begin(), found_devices_with_sdl_.end()); controller_->SearchDeviceDone(devices); - LOG4CXX_TRACE(logger_, "exit"); } void BluetoothDeviceScanner::DoInquiry() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); const int device_id = hci_get_route(0); if (device_id < 0) { LOG4CXX_INFO(logger_, "HCI device is not available"); shutdown_requested_ = true; controller_->SearchDeviceFailed(SearchDeviceError()); - LOG4CXX_TRACE(logger_, "exit. Condition: device_id < 0"); return; } int device_handle = hci_open_dev(device_id); if (device_handle < 0) { controller_->SearchDeviceFailed(SearchDeviceError()); - LOG4CXX_TRACE(logger_, "exit. Condition: device_handle < 0"); return; } @@ -203,8 +205,6 @@ void BluetoothDeviceScanner::DoInquiry() { LOG4CXX_DEBUG(logger_, "number_of_devices < 0"); controller_->SearchDeviceFailed(SearchDeviceError()); } - - LOG4CXX_TRACE(logger_, "exit"); } void BluetoothDeviceScanner::CheckSDLServiceOnDevices( @@ -371,7 +371,7 @@ bool BluetoothDeviceScanner::DiscoverSmartDeviceLinkRFCOMMChannels( } void BluetoothDeviceScanner::Thread() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); ready_ = true; if (auto_repeat_search_) { while (!shutdown_requested_) { @@ -394,12 +394,10 @@ void BluetoothDeviceScanner::Thread() { device_scan_requested_ = false; } } - - LOG4CXX_TRACE(logger_, "exit"); } void BluetoothDeviceScanner::TimedWaitForDeviceScanRequest() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); if (auto_repeat_pause_sec_ == 0) { LOG4CXX_TRACE(logger_, "exit. Condition: auto_repeat_pause_sec_ == 0"); @@ -417,26 +415,22 @@ void BluetoothDeviceScanner::TimedWaitForDeviceScanRequest() { } } } - - LOG4CXX_TRACE(logger_, "exit"); } TransportAdapter::Error BluetoothDeviceScanner::Init() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); if(!thread_->start()) { LOG4CXX_ERROR(logger_, "Bluetooth device scanner thread start failed"); - LOG4CXX_TRACE(logger_, "exit with TransportAdapter:Fail"); return TransportAdapter::FAIL; } LOG4CXX_INFO(logger_, "Bluetooth device scanner thread started"); - LOG4CXX_TRACE(logger_, "exit with TransportAdapter:OK"); return TransportAdapter::OK; } void BluetoothDeviceScanner::Terminate() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); shutdown_requested_ = true; - if (thread_->is_running()) { + if (thread_) { { sync_primitives::AutoLock auto_lock(device_scan_requested_lock_); device_scan_requested_ = false; @@ -445,36 +439,30 @@ void BluetoothDeviceScanner::Terminate() { LOG4CXX_INFO(logger_, "Waiting for bluetooth device scanner thread termination"); thread_->stop(); - LOG4CXX_INFO(logger_, "PASA Bluetooth device scanner thread joined"); + LOG4CXX_INFO(logger_, "Bluetooth device scanner thread stopped"); } - LOG4CXX_TRACE(logger_, "exit"); } TransportAdapter::Error BluetoothDeviceScanner::Scan() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); if ((!IsInitialised()) || shutdown_requested_) { - LOG4CXX_TRACE(logger_, "exit with TransportAdapter::BAD_STATE"); + LOG4CXX_WARN(logger_, "BAD_STATE"); return TransportAdapter::BAD_STATE; } if (auto_repeat_pause_sec_ == 0) { - LOG4CXX_TRACE(logger_, "exit with TransportAdapter::OK"); return TransportAdapter::OK; } TransportAdapter::Error ret = TransportAdapter::OK; - { - sync_primitives::AutoLock auto_lock(device_scan_requested_lock_); - if (false == device_scan_requested_) { - LOG4CXX_INFO(logger_, "Requesting device Scan"); - device_scan_requested_ = true; - device_scan_requested_cv_.NotifyOne(); - } else { - ret = TransportAdapter::BAD_STATE; - LOG4CXX_INFO(logger_, "Device Scan is currently in progress"); - } + sync_primitives::AutoLock auto_lock(device_scan_requested_lock_); + if (!device_scan_requested_) { + LOG4CXX_TRACE(logger_, "Requesting device Scan"); + device_scan_requested_ = true; + device_scan_requested_cv_.NotifyOne(); + } else { + ret = TransportAdapter::BAD_STATE; + LOG4CXX_WARN(logger_, "BAD_STATE"); } - - LOG4CXX_TRACE(logger_, "exit with Error: " << ret); return ret; } @@ -483,12 +471,10 @@ BluetoothDeviceScanner::BluetoothDeviceScannerDelegate::BluetoothDeviceScannerDe : scanner_(scanner) { } -void BluetoothDeviceScanner::BluetoothDeviceScannerDelegate::threadMain() -{ - LOG4CXX_TRACE_ENTER(logger_); +void BluetoothDeviceScanner::BluetoothDeviceScannerDelegate::threadMain() { + LOG4CXX_AUTO_TRACE(logger_); DCHECK(scanner_); scanner_->Thread(); - LOG4CXX_TRACE_EXIT(logger_); } } // namespace transport_adapter diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc b/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc index ac1ccecfb5..d6f9f26317 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc @@ -1,4 +1,4 @@ -/** +/* * * Copyright (c) 2013, Ford Motor Company * All rights reserved. @@ -60,7 +60,8 @@ BluetoothSocketConnection::~BluetoothSocketConnection() { } bool BluetoothSocketConnection::Establish(ConnectError** error) { - LOG4CXX_TRACE(logger_, "enter. (#" << pthread_self() << "), error: " << error); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "error: " << error); DeviceSptr device = controller()->FindDevice(device_handle()); BluetoothDevice* bluetooth_device = diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc index 7d60213b01..51ceebe5de 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc @@ -1,4 +1,4 @@ -/** +/* * \file bluetooth_transport_adapter.cc * \brief BluetoothTransportAdapter class source file. * diff --git a/src/components/transport_manager/src/tcp/dnssd_service_browser.cc b/src/components/transport_manager/src/tcp/dnssd_service_browser.cc index 5580585766..e8ba2ea874 100644 --- a/src/components/transport_manager/src/tcp/dnssd_service_browser.cc +++ b/src/components/transport_manager/src/tcp/dnssd_service_browser.cc @@ -1,4 +1,4 @@ -/** +/* * * Copyright (c) 2013, Ford Motor Company * All rights reserved. @@ -56,12 +56,15 @@ void DnssdServiceBrowser::Terminate() { } if (0 != avahi_service_browser_) { avahi_service_browser_free(avahi_service_browser_); + avahi_service_browser_ = NULL; } if (0 != avahi_client_) { avahi_client_free(avahi_client_); + avahi_client_ = NULL; } if (0 != avahi_threaded_poll_) { avahi_threaded_poll_free(avahi_threaded_poll_); + avahi_threaded_poll_ = NULL; } LOG4CXX_TRACE(logger_, "exit"); } @@ -78,11 +81,9 @@ DnssdServiceBrowser::DnssdServiceBrowser(TransportAdapterController* controller) service_records_(), mutex_(), initialised_(false) { - pthread_mutex_init(&mutex_, 0); } DnssdServiceBrowser::~DnssdServiceBrowser() { - pthread_mutex_destroy(&mutex_); } void DnssdServiceBrowser::OnClientConnected() { @@ -172,8 +173,8 @@ void AvahiServiceBrowserCallback(AvahiServiceBrowser* avahi_service_browser, void DnssdServiceBrowser::ServiceResolved( const DnssdServiceRecord& service_record) { - LOG4CXX_TRACE(logger_, "enter"); - pthread_mutex_lock(&mutex_); + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock locker(mutex_); ServiceRecords::iterator service_record_it = std::find( service_records_.begin(), service_records_.end(), service_record); if (service_record_it != service_records_.end()) { @@ -181,23 +182,19 @@ void DnssdServiceBrowser::ServiceResolved( } DeviceVector device_vector = PrepareDeviceVector(); controller_->SearchDeviceDone(device_vector); - pthread_mutex_unlock(&mutex_); - LOG4CXX_TRACE(logger_, "exit"); } void DnssdServiceBrowser::ServiceResolveFailed( const DnssdServiceRecord& service_record) { - LOG4CXX_TRACE(logger_, "enter"); - LOG4CXX_ERROR(logger_, + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "AvahiServiceResolver failure for: " << service_record.name); - pthread_mutex_lock(&mutex_); + sync_primitives::AutoLock locker(mutex_); ServiceRecords::iterator service_record_it = std::find( service_records_.begin(), service_records_.end(), service_record); if (service_record_it != service_records_.end()) { service_records_.erase(service_record_it); } - pthread_mutex_unlock(&mutex_); - LOG4CXX_TRACE(logger_, "exit"); } void AvahiServiceResolverCallback(AvahiServiceResolver* avahi_service_resolver, @@ -246,9 +243,11 @@ TransportAdapter::Error DnssdServiceBrowser::CreateAvahiClientAndBrowser() { LOG4CXX_TRACE(logger_, "enter"); if (0 != avahi_service_browser_) { avahi_service_browser_free(avahi_service_browser_); + avahi_service_browser_ = NULL; } if (0 != avahi_client_) { avahi_client_free(avahi_client_); + avahi_client_ = NULL; } int avahi_error; @@ -261,9 +260,9 @@ TransportAdapter::Error DnssdServiceBrowser::CreateAvahiClientAndBrowser() { return TransportAdapter::FAIL; } - pthread_mutex_lock(&mutex_); + mutex_.Acquire(); service_records_.clear(); - pthread_mutex_unlock(&mutex_); + mutex_.Release(); avahi_service_browser_ = avahi_service_browser_new( avahi_client_, AVAHI_IF_UNSPEC, /* TODO use only required iface */ @@ -305,7 +304,8 @@ TransportAdapter::Error DnssdServiceBrowser::Scan() { void DnssdServiceBrowser::AddService(AvahiIfIndex interface, AvahiProtocol protocol, const char* name, const char* type, const char* domain) { - LOG4CXX_TRACE(logger_, "enter: interface " << interface << " protocol " << protocol << + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "interface " << interface << " protocol " << protocol << " name " << name << " type " << type << " domain " << domain); DnssdServiceRecord record; record.interface = interface; @@ -314,7 +314,7 @@ void DnssdServiceBrowser::AddService(AvahiIfIndex interface, record.name = name; record.type = type; - pthread_mutex_lock(&mutex_); + sync_primitives::AutoLock locker(mutex_); if (service_records_.end() == std::find(service_records_.begin(), service_records_.end(), record)) { service_records_.push_back(record); @@ -323,15 +323,14 @@ void DnssdServiceBrowser::AddService(AvahiIfIndex interface, AVAHI_PROTO_INET, static_cast<AvahiLookupFlags>(0), AvahiServiceResolverCallback, this); } - pthread_mutex_unlock(&mutex_); - LOG4CXX_TRACE(logger_, "exit"); } void DnssdServiceBrowser::RemoveService(AvahiIfIndex interface, AvahiProtocol protocol, const char* name, const char* type, const char* domain) { - LOG4CXX_TRACE(logger_, "enter: interface " << interface << " protocol " << protocol << + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "interface " << interface << " protocol " << protocol << " name " << name << " type " << type << " domain " << domain); DnssdServiceRecord record; record.interface = interface; @@ -340,16 +339,14 @@ void DnssdServiceBrowser::RemoveService(AvahiIfIndex interface, record.type = type; record.domain_name = domain; - pthread_mutex_lock(&mutex_); + sync_primitives::AutoLock locker(mutex_); service_records_.erase( std::remove(service_records_.begin(), service_records_.end(), record), service_records_.end()); - pthread_mutex_unlock(&mutex_); - LOG4CXX_TRACE(logger_, "exit"); } DeviceVector DnssdServiceBrowser::PrepareDeviceVector() const { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); std::map<uint32_t, TcpDevice*> devices; for (ServiceRecords::const_iterator it = service_records_.begin(); it != service_records_.end(); ++it) { @@ -372,7 +369,6 @@ DeviceVector DnssdServiceBrowser::PrepareDeviceVector() const { it != devices.end(); ++it) { device_vector.push_back(DeviceSptr(it->second)); } - LOG4CXX_TRACE(logger_, "exit"); return device_vector; } diff --git a/src/components/transport_manager/src/tcp/tcp_client_listener.cc b/src/components/transport_manager/src/tcp/tcp_client_listener.cc index c0f39cc490..954c734d68 100644 --- a/src/components/transport_manager/src/tcp/tcp_client_listener.cc +++ b/src/components/transport_manager/src/tcp/tcp_client_listener.cc @@ -53,7 +53,7 @@ #include <sstream> #include "utils/logger.h" - +#include "utils/threads/thread.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" #include "transport_manager/tcp/tcp_device.h" #include "transport_manager/tcp/tcp_socket_connection.h" @@ -66,31 +66,35 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") TcpClientListener::TcpClientListener(TransportAdapterController* controller, const uint16_t port, const bool enable_keepalive) - : port_(port), - enable_keepalive_(enable_keepalive), - controller_(controller), - thread_(threads::CreateThread("TcpClientListener", this)), - socket_(-1), - thread_stop_requested_(false) { } + : port_(port), + enable_keepalive_(enable_keepalive), + controller_(controller), + thread_(0), + socket_(-1), + thread_stop_requested_(false) { + thread_ = threads::CreateThread("TcpClientListener", + new ListeningThreadDelegate(this)); +} TransportAdapter::Error TcpClientListener::Init() { + LOG4CXX_AUTO_TRACE(logger_); + thread_stop_requested_ = false; return TransportAdapter::OK; } void TcpClientListener::Terminate() { - LOG4CXX_TRACE(logger_, "enter"); - if (TransportAdapter::OK != StopListening()) { - LOG4CXX_ERROR(logger_, "Cannot stop listening TCP"); - } - LOG4CXX_TRACE(logger_, "exit"); + thread_->stop(); } bool TcpClientListener::IsInitialised() const { - return true; + return thread_; } TcpClientListener::~TcpClientListener() { - LOG4CXX_INFO(logger_, "destructor"); + LOG4CXX_AUTO_TRACE(logger_); + thread_->join(); + delete thread_->delegate(); + threads::DeleteThread(thread_); } void SetKeepaliveOptions(const int fd) { @@ -130,7 +134,7 @@ void SetKeepaliveOptions(const int fd) { mib[3] = TCPCTL_KEEPINTVL; sysctl(mib, kMidLength, NULL, NULL, &keepintvl, sizeof(keepintvl)); - struct timeval tval = { 0 }; + struct timeval tval = {0}; tval.tv_sec = keepidle; setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes)); setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &tval, sizeof(tval)); @@ -138,12 +142,13 @@ void SetKeepaliveOptions(const int fd) { LOG4CXX_TRACE(logger_, "exit"); } -void TcpClientListener::threadMain() { +void TcpClientListener::Loop() { LOG4CXX_TRACE(logger_, "enter"); while (!thread_stop_requested_) { sockaddr_in client_address; socklen_t client_address_size = sizeof(client_address); - const int connection_fd = accept(socket_, (struct sockaddr*)&client_address, + const int connection_fd = accept(socket_, + (struct sockaddr*) &client_address, &client_address_size); if (thread_stop_requested_) { LOG4CXX_DEBUG(logger_, "thread_stop_requested_"); @@ -157,6 +162,7 @@ void TcpClientListener::threadMain() { if (AF_INET != client_address.sin_family) { LOG4CXX_DEBUG(logger_, "Address of connected client is invalid"); + close(connection_fd); continue; } @@ -169,15 +175,16 @@ void TcpClientListener::threadMain() { SetKeepaliveOptions(connection_fd); } - TcpDevice* tcp_device = new TcpDevice(client_address.sin_addr.s_addr, device_name); + TcpDevice* tcp_device = new TcpDevice(client_address.sin_addr.s_addr, + device_name); DeviceSptr device = controller_->AddDevice(tcp_device); tcp_device = static_cast<TcpDevice*>(device.get()); const ApplicationHandle app_handle = tcp_device->AddIncomingApplication( - connection_fd); + connection_fd); TcpSocketConnection* connection( - new TcpSocketConnection(device->unique_device_id(), app_handle, - controller_)); + new TcpSocketConnection(device->unique_device_id(), app_handle, + controller_)); connection->set_socket(connection_fd); const TransportAdapter::Error error = connection->Start(); if (error != TransportAdapter::OK) { @@ -187,11 +194,26 @@ void TcpClientListener::threadMain() { LOG4CXX_TRACE(logger_, "exit"); } +void TcpClientListener::StopLoop() { + LOG4CXX_AUTO_TRACE(logger_); + thread_stop_requested_ = true; + // We need to connect to the listening socket to unblock accept() call + int byesocket = socket(AF_INET, SOCK_STREAM, 0); + sockaddr_in server_address = { 0 }; + server_address.sin_family = AF_INET; + server_address.sin_port = htons(port_); + server_address.sin_addr.s_addr = INADDR_ANY; + connect(byesocket, (sockaddr*) &server_address, sizeof(server_address)); + shutdown(byesocket, SHUT_RDWR); + close(byesocket); +} + TransportAdapter::Error TcpClientListener::StartListening() { LOG4CXX_TRACE(logger_, "enter"); - if (thread_->is_running()) { - LOG4CXX_TRACE(logger_, - "exit with TransportAdapter::BAD_STATE. Condition: thread_started_"); + if (!thread_ || thread_->is_running()) { + LOG4CXX_TRACE( + logger_, + "exit with TransportAdapter::BAD_STATE. Condition: thread_started_"); return TransportAdapter::BAD_STATE; } @@ -199,7 +221,8 @@ TransportAdapter::Error TcpClientListener::StartListening() { if (-1 == socket_) { LOG4CXX_ERROR_WITH_ERRNO(logger_, "Failed to create socket"); - LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL. Condition: -1 == socket_"); + LOG4CXX_TRACE(logger_, + "exit with TransportAdapter::FAIL. Condition: -1 == socket_"); return TransportAdapter::FAIL; } @@ -213,15 +236,17 @@ TransportAdapter::Error TcpClientListener::StartListening() { if (0 != bind(socket_, (sockaddr*) &server_address, sizeof(server_address))) { LOG4CXX_ERROR_WITH_ERRNO(logger_, "bind() failed"); - LOG4CXX_TRACE(logger_, - "exit with TransportAdapter::FAIL. Condition: 0 != bind(socket_, (sockaddr*) &server_address, sizeof(server_address))"); + LOG4CXX_TRACE( + logger_, + "exit with TransportAdapter::FAIL. Condition: 0 != bind(socket_, (sockaddr*) &server_address, sizeof(server_address))"); return TransportAdapter::FAIL; } if (0 != listen(socket_, 128)) { LOG4CXX_ERROR_WITH_ERRNO(logger_, "listen() failed"); - LOG4CXX_TRACE(logger_, - "exit with TransportAdapter::FAIL. Condition: 0 != listen(socket_, 128)"); + LOG4CXX_TRACE( + logger_, + "exit with TransportAdapter::FAIL. Condition: 0 != listen(socket_, 128)"); return TransportAdapter::FAIL; } @@ -235,33 +260,29 @@ TransportAdapter::Error TcpClientListener::StartListening() { return TransportAdapter::OK; } -bool TcpClientListener::exitThreadMain() { - StopListening(); - return true; +void TcpClientListener::ListeningThreadDelegate::exitThreadMain() { + parent_->StopLoop(); +} + +void TcpClientListener::ListeningThreadDelegate::threadMain() { + parent_->Loop(); +} + +TcpClientListener::ListeningThreadDelegate::ListeningThreadDelegate( + TcpClientListener* parent) + : parent_(parent) { } TransportAdapter::Error TcpClientListener::StopListening() { - LOG4CXX_TRACE(logger_, "enter"); - if (!thread_->is_running()) { - LOG4CXX_TRACE(logger_, - "exit with TransportAdapter::BAD_STATE. Condition !thread_started_"); + LOG4CXX_AUTO_TRACE(logger_); + if (!thread_ || !thread_->is_running()) { + LOG4CXX_TRACE(logger_, "TcpClientListener is not running now"); return TransportAdapter::BAD_STATE; } - thread_stop_requested_ = true; - // We need to connect to the listening socket to unblock accept() call - int byesocket = socket(AF_INET, SOCK_STREAM, 0); - sockaddr_in server_address = { 0 }; - server_address.sin_family = AF_INET; - server_address.sin_port = htons(port_); - server_address.sin_addr.s_addr = INADDR_ANY; - connect(byesocket, (sockaddr*)&server_address, sizeof(server_address)); - shutdown(byesocket, SHUT_RDWR); - close(byesocket); - LOG4CXX_DEBUG(logger_, "Tcp client listener thread terminated"); + thread_->stop(); close(socket_); socket_ = -1; - LOG4CXX_TRACE(logger_, "exit with TransportAdapter::OK"); return TransportAdapter::OK; } diff --git a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc index 69173a0e06..a8c2bda600 100644 --- a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc +++ b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc @@ -1,4 +1,4 @@ -/** +/* * * Copyright (c) 2013, Ford Motor Company * All rights reserved. diff --git a/src/components/transport_manager/src/tcp/tcp_device.cc b/src/components/transport_manager/src/tcp/tcp_device.cc index 2540c26ed0..130187c384 100644 --- a/src/components/transport_manager/src/tcp/tcp_device.cc +++ b/src/components/transport_manager/src/tcp/tcp_device.cc @@ -1,4 +1,4 @@ -/** +/* * * Copyright (c) 2013, Ford Motor Company * All rights reserved. @@ -43,9 +43,9 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") TcpDevice::TcpDevice(const in_addr_t& in_addr, const std::string& name) : Device(name, name), + applications_mutex_(), in_addr_(in_addr), last_handle_(0) { - pthread_mutex_init(&applications_mutex_, 0); } bool TcpDevice::IsSameAs(const Device* other) const { @@ -63,57 +63,53 @@ bool TcpDevice::IsSameAs(const Device* other) const { } ApplicationList TcpDevice::GetApplicationList() const { - LOG4CXX_TRACE(logger_, "enter"); - pthread_mutex_lock(&applications_mutex_); + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock locker(applications_mutex_); ApplicationList app_list; for (std::map<ApplicationHandle, Application>::const_iterator it = applications_.begin(); it != applications_.end(); ++it) { app_list.push_back(it->first); } - pthread_mutex_unlock(&applications_mutex_); - LOG4CXX_TRACE(logger_, "exit with app_list. It's size = " << app_list.size()); return app_list; } ApplicationHandle TcpDevice::AddIncomingApplication(int socket_fd) { - LOG4CXX_TRACE(logger_, "enter. Socket_fd: " << socket_fd); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Socket_fd: " << socket_fd); Application app; app.incoming = true; app.socket = socket_fd; app.port = 0; // this line removes compiler warning - pthread_mutex_lock(&applications_mutex_); + sync_primitives::AutoLock locker(applications_mutex_); const ApplicationHandle app_handle = ++last_handle_; applications_[app_handle] = app; - pthread_mutex_unlock(&applications_mutex_); - LOG4CXX_TRACE(logger_, "exit with app_handle " << app_handle); + LOG4CXX_DEBUG(logger_, "App_handle " << app_handle); return app_handle; } ApplicationHandle TcpDevice::AddDiscoveredApplication(int port) { - LOG4CXX_TRACE(logger_, "enter. port " << port); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Port " << port); Application app; app.incoming = false; app.socket = 0; // this line removes compiler warning app.port = port; - pthread_mutex_lock(&applications_mutex_); + sync_primitives::AutoLock locker(applications_mutex_); const ApplicationHandle app_handle = ++last_handle_; applications_[app_handle] = app; - pthread_mutex_unlock(&applications_mutex_); - LOG4CXX_TRACE(logger_, "exit with app_handle " << app_handle); + LOG4CXX_DEBUG(logger_, "App_handle " << app_handle); return app_handle; } void TcpDevice::RemoveApplication(const ApplicationHandle app_handle) { - LOG4CXX_TRACE(logger_, "enter. ApplicationHandle: " << app_handle); - pthread_mutex_lock(&applications_mutex_); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "ApplicationHandle: " << app_handle); + sync_primitives::AutoLock locker(applications_mutex_); applications_.erase(app_handle); - pthread_mutex_unlock(&applications_mutex_); - LOG4CXX_TRACE(logger_, "exit"); } TcpDevice::~TcpDevice() { - pthread_mutex_destroy(&applications_mutex_); } int TcpDevice::GetApplicationSocket(const ApplicationHandle app_handle) const { diff --git a/src/components/transport_manager/src/tcp/tcp_socket_connection.cc b/src/components/transport_manager/src/tcp/tcp_socket_connection.cc index 3b208d8a07..a1160a84a8 100644 --- a/src/components/transport_manager/src/tcp/tcp_socket_connection.cc +++ b/src/components/transport_manager/src/tcp/tcp_socket_connection.cc @@ -1,4 +1,4 @@ -/** +/* * * Copyright (c) 2013, Ford Motor Company * All rights reserved. @@ -35,10 +35,12 @@ #include "transport_manager/tcp/tcp_socket_connection.h" #include "transport_manager/tcp/tcp_device.h" #include "utils/logger.h" +#include "utils/threads/thread.h" #include <memory.h> #include <signal.h> #include <errno.h> +#include <unistd.h> namespace transport_manager { namespace transport_adapter { @@ -107,6 +109,9 @@ bool TcpServerOiginatedSocketConnection::Establish(ConnectError** error) { << application_handle() << ", error " << errno); *error = new ConnectError(); LOG4CXX_TRACE(logger_, "exit with FALSE. Condition: failed to connect to application"); + + ::close(socket); + return false; } diff --git a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc index 3747225a89..6c4ee0cd89 100644 --- a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc +++ b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc @@ -1,5 +1,4 @@ -/** - * +/* * Copyright (c) 2013, Ford Motor Company * All rights reserved. * @@ -36,6 +35,7 @@ #include <errno.h> #include <sstream> #include <cstdlib> +#include <stdio.h> #include "resumption/last_state.h" @@ -101,7 +101,7 @@ void TcpTransportAdapter::Store() const { if (port != -1) { // don't want to store incoming applications Json::Value application_dictionary; char port_record[12]; - sprintf(port_record, "%d", port); + snprintf(port_record, sizeof(port_record), "%d", port); application_dictionary["port"] = std::string(port_record); applications_dictionary.append(application_dictionary); } diff --git a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc index 1e189ed101..7bd54d337b 100644 --- a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc +++ b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2013, Ford Motor Company * All rights reserved. * @@ -36,7 +36,9 @@ #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> + #include "utils/logger.h" +#include "utils/threads/thread.h" #include "transport_manager/transport_adapter/threaded_socket_connection.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" @@ -55,42 +57,43 @@ ThreadedSocketConnection::ThreadedSocketConnection( terminate_flag_(false), unexpected_disconnect_(false), device_uid_(device_id), - app_handle_(app_handle) - { - pthread_mutex_init(&frames_to_send_mutex_, 0); + app_handle_(app_handle), + thread_(NULL) { } ThreadedSocketConnection::~ThreadedSocketConnection() { terminate_flag_ = true; Notify(); - pthread_mutex_destroy(&frames_to_send_mutex_); - + if (thread_) { + thread_->join(); + delete thread_->delegate(); + threads::DeleteThread(thread_); + } } void ThreadedSocketConnection::Abort() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); unexpected_disconnect_ = true; terminate_flag_ = true; - LOG4CXX_TRACE(logger_, "exit"); } TransportAdapter::Error ThreadedSocketConnection::Start() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); int fds[2]; const int pipe_ret = pipe(fds); if (0 == pipe_ret) { - LOG4CXX_DEBUG(logger_, "pipe created(#" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "pipe created"); read_fd_ = fds[0]; write_fd_ = fds[1]; } else { - LOG4CXX_WARN(logger_, "pipe creation failed (#" << pthread_self() << ")"); + LOG4CXX_WARN(logger_, "pipe creation failed"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL"); return TransportAdapter::FAIL; } const int fcntl_ret = fcntl(read_fd_, F_SETFL, fcntl(read_fd_, F_GETFL) | O_NONBLOCK); if (0 != fcntl_ret) { - LOG4CXX_WARN(logger_, "fcntl failed (#" << pthread_self() << ")"); + LOG4CXX_WARN(logger_, "fcntl failed"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL"); return TransportAdapter::FAIL; } @@ -99,23 +102,23 @@ TransportAdapter::Error ThreadedSocketConnection::Start() { thread_ = threads::CreateThread(thread_name.c_str(), this); if (!thread_->start()) { - LOG4CXX_WARN(logger_, "thread creation failed (#" << pthread_self() << ")"); + LOG4CXX_WARN(logger_, "thread creation failed"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL"); return TransportAdapter::FAIL; } - LOG4CXX_DEBUG(logger_, "thread created (#" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "thread created"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::OK"); return TransportAdapter::OK; } void ThreadedSocketConnection::Finalize() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); if (unexpected_disconnect_) { - LOG4CXX_DEBUG(logger_, "unexpected_disconnect (#" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "unexpected_disconnect"); controller_->ConnectionAborted(device_handle(), application_handle(), CommunicationError()); } else { - LOG4CXX_DEBUG(logger_, "not unexpected_disconnect (#" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "not unexpected_disconnect"); controller_->ConnectionFinished(device_handle(), application_handle()); } close(socket_); @@ -145,9 +148,9 @@ TransportAdapter::Error ThreadedSocketConnection::Notify() const { TransportAdapter::Error ThreadedSocketConnection::SendData( ::protocol_handler::RawMessagePtr message) { LOG4CXX_TRACE(logger_, "enter"); - pthread_mutex_lock(&frames_to_send_mutex_); + frames_to_send_mutex_.Acquire(); frames_to_send_.push(message); - pthread_mutex_unlock(&frames_to_send_mutex_); + frames_to_send_mutex_.Release(); TransportAdapter::Error error = Notify(); LOG4CXX_TRACE(logger_, "exit with error" << error); return error; @@ -161,10 +164,9 @@ TransportAdapter::Error ThreadedSocketConnection::Disconnect() { return error; } -bool ThreadedSocketConnection::exitThreadMain() { +void ThreadedSocketConnection::exitThreadMain() { terminate_flag_ = true; Notify(); - return true; } void ThreadedSocketConnection::threadMain() { @@ -172,15 +174,15 @@ void ThreadedSocketConnection::threadMain() { controller_->ConnectionCreated(this, device_uid_, app_handle_); ConnectError* connect_error = NULL; if (Establish(&connect_error)) { - LOG4CXX_DEBUG(logger_, "Connection established (#" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "Connection established"); controller_->ConnectDone(device_handle(), application_handle()); while (!terminate_flag_) { Transmit(); } - LOG4CXX_DEBUG(logger_, "Connection is to finalize (#" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "Connection is to finalize"); Finalize(); while (!frames_to_send_.empty()) { - LOG4CXX_INFO(logger_, "removing message (#" << pthread_self() << ")"); + LOG4CXX_INFO(logger_, "removing message"); ::protocol_handler::RawMessagePtr message = frames_to_send_.front(); frames_to_send_.pop(); controller_->DataSendFailed(device_handle(), application_handle(), @@ -188,7 +190,7 @@ void ThreadedSocketConnection::threadMain() { } controller_->DisconnectDone(device_handle(), application_handle()); } else { - LOG4CXX_ERROR(logger_, "Connection Establish failed (#" << pthread_self() << ")"); + LOG4CXX_ERROR(logger_, "Connection Establish failed"); controller_->ConnectFailed(device_handle(), application_handle(), *connect_error); delete connect_error; @@ -212,14 +214,14 @@ void ThreadedSocketConnection::Transmit() { poll_fds[1].fd = read_fd_; poll_fds[1].events = POLLIN | POLLPRI; - LOG4CXX_DEBUG(logger_, "poll (#" << pthread_self() << ") " << this); + LOG4CXX_DEBUG(logger_, "poll " << this); if (-1 == poll(poll_fds, poll_fds_size, -1)) { LOG4CXX_ERROR_WITH_ERRNO(logger_, "poll failed for connection " << this); Abort(); LOG4CXX_TRACE(logger_, "exit. Condition: -1 == poll(poll_fds, poll_fds_size, -1)"); return; } - LOG4CXX_DEBUG(logger_, "poll is ok (#" << pthread_self() << ") " << this << " revents0:" + LOG4CXX_DEBUG(logger_, "poll is ok " << this << " revents0:" << std::hex << poll_fds[0].revents << " revents1:" << std::hex << poll_fds[1].revents); // error check @@ -256,12 +258,12 @@ void ThreadedSocketConnection::Transmit() { // send data if possible if (!frames_to_send_.empty() && (poll_fds[0].revents | POLLOUT)) { - LOG4CXX_DEBUG(logger_, "frames_to_send_ not empty() (#" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "frames_to_send_ not empty() "); // send data const bool send_ok = Send(); if (!send_ok) { - LOG4CXX_ERROR(logger_, "Send() failed (#" << pthread_self() << ")"); + LOG4CXX_ERROR(logger_, "Send() failed "); Abort(); LOG4CXX_TRACE(logger_, "exit. Condition: !send_ok"); return; @@ -272,7 +274,7 @@ void ThreadedSocketConnection::Transmit() { if (poll_fds[0].revents & (POLLIN | POLLPRI)) { const bool receive_ok = Receive(); if (!receive_ok) { - LOG4CXX_ERROR(logger_, "Receive() failed (#" << pthread_self() << ")"); + LOG4CXX_ERROR(logger_, "Receive() failed "); Abort(); LOG4CXX_TRACE(logger_, "exit. Condition: !receive_ok"); return; @@ -318,19 +320,19 @@ bool ThreadedSocketConnection::Receive() { bool ThreadedSocketConnection::Send() { LOG4CXX_TRACE(logger_, "enter"); FrameQueue frames_to_send; - pthread_mutex_lock(&frames_to_send_mutex_); + frames_to_send_mutex_.Acquire(); std::swap(frames_to_send, frames_to_send_); - pthread_mutex_unlock(&frames_to_send_mutex_); + frames_to_send_mutex_.Release(); size_t offset = 0; while (!frames_to_send.empty()) { - LOG4CXX_INFO(logger_, "frames_to_send is not empty" << pthread_self() << ")"); + LOG4CXX_INFO(logger_, "frames_to_send is not empty"); ::protocol_handler::RawMessagePtr frame = frames_to_send.front(); const ssize_t bytes_sent = ::send(socket_, frame->data() + offset, frame->data_size() - offset, 0); if (bytes_sent >= 0) { - LOG4CXX_DEBUG(logger_, "bytes_sent >= 0" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "bytes_sent >= 0"); offset += bytes_sent; if (offset == frame->data_size()) { frames_to_send.pop(); @@ -338,7 +340,7 @@ bool ThreadedSocketConnection::Send() { controller_->DataSendDone(device_handle(), application_handle(), frame); } } else { - LOG4CXX_DEBUG(logger_, "bytes_sent < 0" << pthread_self() << ")"); + LOG4CXX_DEBUG(logger_, "bytes_sent < 0"); LOG4CXX_ERROR_WITH_ERRNO(logger_, "Send failed for connection " << this); frames_to_send.pop(); offset = 0; diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc index 3330e93e31..67b2b1ad58 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc @@ -53,56 +53,64 @@ TransportAdapterImpl::TransportAdapterImpl( devices_(), devices_mutex_(), connections_(), - connections_mutex_(), - device_scanner_(device_scanner), - server_connection_factory_(server_connection_factory), - client_connection_listener_(client_connection_listener) + connections_lock_(), #ifdef TIME_TESTER - , metric_observer_(NULL) + metric_observer_(NULL), #endif // TIME_TESTER -{ - pthread_mutex_init(&devices_mutex_, 0); - pthread_mutex_init(&connections_mutex_, 0); + device_scanner_(device_scanner), + server_connection_factory_(server_connection_factory), + client_connection_listener_(client_connection_listener) { } TransportAdapterImpl::~TransportAdapterImpl() { + Terminate(); + + if (device_scanner_) { + LOG4CXX_DEBUG(logger_, "Deleting device_scanner_ " << device_scanner_); + delete device_scanner_; + LOG4CXX_DEBUG(logger_, "device_scanner_ deleted."); + } + if (server_connection_factory_) { + LOG4CXX_DEBUG(logger_, "Deleting server_connection_factory " << server_connection_factory_); + delete server_connection_factory_; + LOG4CXX_DEBUG(logger_, "server_connection_factory deleted."); + } + if (client_connection_listener_) { + LOG4CXX_DEBUG(logger_, "Deleting client_connection_listener_ " << client_connection_listener_); + delete client_connection_listener_; + LOG4CXX_DEBUG(logger_, "client_connection_listener_ deleted."); + } +} + +void TransportAdapterImpl::Terminate() { if (device_scanner_) { device_scanner_->Terminate(); LOG4CXX_DEBUG(logger_, "device_scanner_ " << device_scanner_ << " terminated."); - delete device_scanner_; - LOG4CXX_DEBUG(logger_, "device_scanner_ " << device_scanner_ << " deleted."); } if (server_connection_factory_) { server_connection_factory_->Terminate(); LOG4CXX_DEBUG(logger_, "server_connection_factory " << server_connection_factory_ << " terminated."); - delete server_connection_factory_; - LOG4CXX_DEBUG(logger_, "server_connection_factory " << server_connection_factory_ << " deleted."); } if (client_connection_listener_) { client_connection_listener_->Terminate(); LOG4CXX_DEBUG(logger_, "client_connection_listener_ " << client_connection_listener_ << " terminated."); - delete client_connection_listener_; - LOG4CXX_DEBUG(logger_, "client_connection_listener_ " << client_connection_listener_ << " deleted."); } - pthread_mutex_lock(&connections_mutex_); ConnectionMap connections; + connections_lock_.AcquireForWriting(); std::swap(connections, connections_); - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); connections.clear(); LOG4CXX_DEBUG(logger_, "Connections deleted"); - pthread_mutex_lock(&devices_mutex_); + devices_mutex_.Acquire(); DeviceMap devices; std::swap(devices, devices_); - pthread_mutex_unlock(&devices_mutex_); + devices_mutex_.Release(); devices.clear(); LOG4CXX_DEBUG(logger_, "Devices deleted"); - - pthread_mutex_destroy(&connections_mutex_); - pthread_mutex_destroy(&devices_mutex_); } TransportAdapter::Error TransportAdapterImpl::Init() { @@ -159,7 +167,7 @@ TransportAdapter::Error TransportAdapterImpl::Connect( return BAD_STATE; } - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForWriting(); const bool already_exists = connections_.end() != connections_.find(std::make_pair(device_id, app_handle)); @@ -169,7 +177,7 @@ TransportAdapter::Error TransportAdapterImpl::Connect( info.device_id = device_id; info.state = ConnectionInfo::NEW; } - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); if (already_exists) { LOG4CXX_TRACE(logger_, "exit with ALREADY_EXISTS"); return ALREADY_EXISTS; @@ -178,9 +186,9 @@ TransportAdapter::Error TransportAdapterImpl::Connect( const TransportAdapter::Error err = server_connection_factory_->CreateConnection(device_id, app_handle); if (TransportAdapter::OK != err) { - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForWriting(); connections_.erase(std::make_pair(device_id, app_handle)); - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); } LOG4CXX_TRACE(logger_, "exit with error: " << err); return err; @@ -228,20 +236,25 @@ TransportAdapter::Error TransportAdapterImpl::DisconnectDevice( } Error error = OK; - pthread_mutex_lock(&connections_mutex_); - for (ConnectionMap::iterator it = connections_.begin(); - it != connections_.end(); ++it) { - ConnectionInfo& info = it->second; - if (info.device_id == device_id && - info.state != ConnectionInfo::FINALISING) { - if (OK != info.connection->Disconnect()) { - error = FAIL; - LOG4CXX_ERROR(logger_, "Error on disconnect" << error); - } + std::vector<ConnectionInfo> to_disconnect; + connections_lock_.AcquireForReading(); + for (ConnectionMap::const_iterator i = connections_.begin(); i != connections_.end(); ++i) { + ConnectionInfo info = i->second; + if (info.device_id == device_id && info.state != ConnectionInfo::FINALISING) { + to_disconnect.push_back(info); + } + } + connections_lock_.Release(); + + for (std::vector<ConnectionInfo>::const_iterator j = to_disconnect.begin(); j != to_disconnect.end(); ++j) { + ConnectionInfo info = *j; + if (OK != info.connection->Disconnect()) { + error = FAIL; + LOG4CXX_ERROR(logger_, "Error on disconnect " << error); } } - pthread_mutex_unlock(&connections_mutex_); + LOG4CXX_TRACE(logger_, "exit with error " << error); return error; } @@ -293,19 +306,23 @@ TransportAdapter::Error TransportAdapterImpl::StopClientListening() { return BAD_STATE; } TransportAdapter::Error err = client_connection_listener_->StopListening(); + for(DeviceMap::iterator it = devices_.begin(); + it != devices_.end(); + ++it) { + it->second->Stop(); + } LOG4CXX_TRACE(logger_, "exit with error: " << err); return err; } DeviceList TransportAdapterImpl::GetDeviceList() const { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); DeviceList devices; - pthread_mutex_lock(&devices_mutex_); + sync_primitives::AutoLock locker(devices_mutex_); for (DeviceMap::const_iterator it = devices_.begin(); it != devices_.end(); ++it) { devices.push_back(it->first); } - pthread_mutex_unlock(&devices_mutex_); LOG4CXX_TRACE(logger_, "exit with DeviceList. It's' size = " << devices.size()); return devices; } @@ -314,7 +331,7 @@ DeviceSptr TransportAdapterImpl::AddDevice(DeviceSptr device) { LOG4CXX_TRACE(logger_, "enter. device: " << device); DeviceSptr existing_device; bool same_device_found = false; - pthread_mutex_lock(&devices_mutex_); + devices_mutex_.Acquire(); for (DeviceMap::const_iterator i = devices_.begin(); i != devices_.end(); ++i) { existing_device = i->second; @@ -327,7 +344,7 @@ DeviceSptr TransportAdapterImpl::AddDevice(DeviceSptr device) { if (!same_device_found) { devices_[device->unique_device_id()] = device; } - pthread_mutex_unlock(&devices_mutex_); + devices_mutex_.Release(); if (same_device_found) { LOG4CXX_TRACE(logger_, "exit with TRUE. Condition: same_device_found"); return existing_device; @@ -352,7 +369,7 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { DeviceSptr device = *it; bool device_found = false; - pthread_mutex_lock(&devices_mutex_); + devices_mutex_.Acquire(); for (DeviceMap::iterator it = devices_.begin(); it != devices_.end(); ++it) { DeviceSptr existing_device = it->second; @@ -363,7 +380,7 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { break; } } - pthread_mutex_unlock(&devices_mutex_); + devices_mutex_.Release(); if (!device_found) { LOG4CXX_INFO(logger_, "Adding new device " << device->unique_device_id() @@ -375,7 +392,7 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { new_devices[device->unique_device_id()] = device; } - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForReading(); std::set<DeviceUID> connected_devices; for (ConnectionMap::const_iterator it = connections_.begin(); it != connections_.end(); ++it) { @@ -384,10 +401,10 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { connected_devices.insert(info.device_id); } } - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); DeviceMap all_devices = new_devices; - pthread_mutex_lock(&devices_mutex_); + devices_mutex_.Acquire(); for (DeviceMap::iterator it = devices_.begin(); it != devices_.end(); ++it) { DeviceSptr existing_device = it->second; @@ -399,7 +416,7 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { } } devices_ = all_devices; - pthread_mutex_unlock(&devices_mutex_); + devices_mutex_.Release(); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { @@ -453,9 +470,8 @@ bool TransportAdapterImpl::IsServerOriginatedConnectSupported() const { } bool TransportAdapterImpl::IsClientOriginatedConnectSupported() const { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_TRACE(logger_, "IsClientOriginatedConnectSupported"); return client_connection_listener_ != 0; - LOG4CXX_TRACE(logger_, "exit"); } void TransportAdapterImpl::ConnectionCreated( @@ -463,14 +479,13 @@ void TransportAdapterImpl::ConnectionCreated( const ApplicationHandle& app_handle) { LOG4CXX_TRACE(logger_, "enter connection:" << connection << ", device_id: " << &device_id << ", app_handle: " << &app_handle); - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForReading(); ConnectionInfo& info = connections_[std::make_pair(device_id, app_handle)]; info.app_handle = app_handle; info.device_id = device_id; info.connection = connection; info.state = ConnectionInfo::NEW; - pthread_mutex_unlock(&connections_mutex_); - LOG4CXX_TRACE(logger_, "exit"); + connections_lock_.Release(); } void TransportAdapterImpl::DeviceDisconnected( @@ -488,17 +503,18 @@ void TransportAdapterImpl::DeviceDisconnected( } } - pthread_mutex_lock(&connections_mutex_); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { TransportAdapterListener* listener = *it; listener->OnDisconnectDeviceDone(this, device_uid); } + + connections_lock_.AcquireForWriting(); for (ApplicationList::const_iterator i = app_list.begin(); i != app_list.end(); ++i) { ApplicationHandle app_handle = *i; connections_.erase(std::make_pair(device_uid, app_handle)); } - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); RemoveDevice(device_uid); LOG4CXX_TRACE(logger_, "exit"); @@ -511,7 +527,7 @@ void TransportAdapterImpl::DisconnectDone( LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_uid << ", app_handle: " << &app_uid); bool device_disconnected = true; - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForReading(); for (ConnectionMap::const_iterator it = connections_.begin(); it != connections_.end(); ++it) { const DeviceUID& current_device_id = it->first.first; @@ -523,7 +539,7 @@ void TransportAdapterImpl::DisconnectDone( break; } } - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { TransportAdapterListener* listener = *it; @@ -532,9 +548,9 @@ void TransportAdapterImpl::DisconnectDone( listener->OnDisconnectDeviceDone(this, device_uid); } } - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForWriting(); connections_.erase(std::make_pair(device_uid, app_uid)); - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); if (device_disconnected) { RemoveDevice(device_uid); @@ -600,14 +616,13 @@ DeviceSptr TransportAdapterImpl::FindDevice(const DeviceUID& device_id) const { LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_id); DeviceSptr ret; LOG4CXX_DEBUG(logger_, "devices_.size() = " << devices_.size()); - pthread_mutex_lock(&devices_mutex_); + sync_primitives::AutoLock locker(devices_mutex_); DeviceMap::const_iterator it = devices_.find(device_id); if (it != devices_.end()) { ret = it->second; } else { LOG4CXX_WARN(logger_, "Device " << device_id << " not found."); } - pthread_mutex_unlock(&devices_mutex_); LOG4CXX_TRACE(logger_, "exit with DeviceSptr: " << ret); return ret; } @@ -616,14 +631,14 @@ void TransportAdapterImpl::ConnectDone(const DeviceUID& device_id, const ApplicationHandle& app_handle) { LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForReading(); ConnectionMap::iterator it_conn = connections_.find(std::make_pair(device_id, app_handle)); if (it_conn != connections_.end()) { ConnectionInfo& info = it_conn->second; info.state = ConnectionInfo::ESTABLISHED; } - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { @@ -640,9 +655,9 @@ void TransportAdapterImpl::ConnectFailed(const DeviceUID& device_handle, const ApplicationHandle app_uid = app_handle; LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_uid << ", app_handle: " << &app_uid << ", error: " << &error); - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForWriting(); connections_.erase(std::make_pair(device_uid, app_uid)); - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { (*it)->OnConnectFailed(this, device_uid, app_uid, error); @@ -674,15 +689,14 @@ void TransportAdapterImpl::ConnectionFinished( const DeviceUID& device_id, const ApplicationHandle& app_handle) { LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForReading(); ConnectionMap::iterator it = connections_.find(std::make_pair(device_id, app_handle)); if (it != connections_.end()) { ConnectionInfo& info = it->second; info.state = ConnectionInfo::FINALISING; } - pthread_mutex_unlock(&connections_mutex_); - LOG4CXX_TRACE(logger_, "exit"); + connections_lock_.Release(); } void TransportAdapterImpl::ConnectionAborted( @@ -768,7 +782,7 @@ Connection* TransportAdapterImpl::FindEstablishedConnection( LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); Connection* connection = NULL; - pthread_mutex_lock(&connections_mutex_); + connections_lock_.AcquireForReading(); ConnectionMap::const_iterator it = connections_.find(std::make_pair(device_id, app_handle)); if (it != connections_.end()) { @@ -777,7 +791,7 @@ Connection* TransportAdapterImpl::FindEstablishedConnection( connection = info.connection; } } - pthread_mutex_unlock(&connections_mutex_); + connections_lock_.Release(); LOG4CXX_TRACE(logger_, "exit with Connection: " << connection); return connection; } @@ -820,8 +834,9 @@ TransportAdapter::Error TransportAdapterImpl::ConnectDevice(DeviceSptr device) { } void TransportAdapterImpl::RemoveDevice(const DeviceUID& device_handle) { - LOG4CXX_TRACE(logger_, "enter. device_handle: " << &device_handle); - pthread_mutex_lock(&devices_mutex_); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Device_handle: " << &device_handle); + sync_primitives::AutoLock locker(devices_mutex_); DeviceMap::iterator i = devices_.find( device_handle); //ykazakov: there is no erase for const iterator on QNX if (i != devices_.end()) { @@ -835,8 +850,6 @@ void TransportAdapterImpl::RemoveDevice(const DeviceUID& device_handle) { } } } - pthread_mutex_unlock(&devices_mutex_); - LOG4CXX_TRACE(logger_, "exit"); } diff --git a/src/components/transport_manager/src/transport_manager_default.cc b/src/components/transport_manager/src/transport_manager_default.cc index ffd1b3d860..835c2c17ed 100644 --- a/src/components/transport_manager/src/transport_manager_default.cc +++ b/src/components/transport_manager/src/transport_manager_default.cc @@ -43,7 +43,6 @@ #include "transport_manager/bluetooth/bluetooth_transport_adapter.h" #endif -// CUSTOMER_PASA #if defined(USB_SUPPORT) #include "transport_manager/usb/usb_aoa_adapter.h" @@ -72,6 +71,8 @@ int TransportManagerDefault::Init() { #endif // TIME_TESTER AddTransportAdapter(ta); #endif + + uint16_t port = profile::Profile::instance()->transport_manager_tcp_adapter_port(); ta = new transport_adapter::TcpTransportAdapter(port); #ifdef TIME_TESTER @@ -81,7 +82,6 @@ int TransportManagerDefault::Init() { #endif // TIME_TESTER AddTransportAdapter(ta); -// CUSTOMER_PASA #if defined(USB_SUPPORT) ta = new transport_adapter::UsbAoaAdapter(); diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc index 0ee1d3304d..6c3edd7b91 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -32,7 +32,6 @@ #include "transport_manager/transport_manager_impl.h" -#include <pthread.h> #include <stdint.h> #include <cstring> #include <queue> @@ -70,22 +69,20 @@ TransportManagerImpl::Connection TransportManagerImpl::convert( } TransportManagerImpl::TransportManagerImpl() - : all_thread_active_(false), - device_listener_thread_wakeup_(), - is_initialized_(false), + : is_initialized_(false), #ifdef TIME_TESTER metric_observer_(NULL), #endif // TIME_TESTER connection_id_counter_(0), message_queue_("TM MessageQueue", this), event_queue_("TM EventQueue", this) { - LOG4CXX_INFO(logger_, "=============================================="); - pthread_cond_init(&device_listener_thread_wakeup_, NULL); - LOG4CXX_DEBUG(logger_, "TransportManager object created"); + LOG4CXX_TRACE(logger_, "TransportManager has created"); } TransportManagerImpl::~TransportManagerImpl() { LOG4CXX_DEBUG(logger_, "TransportManager object destroying"); + message_queue_.Shutdown(); + event_queue_.Shutdown(); for (std::vector<TransportAdapter*>::iterator it = transport_adapters_.begin(); @@ -99,7 +96,6 @@ TransportManagerImpl::~TransportManagerImpl() { delete it->second; } - pthread_cond_destroy(&device_listener_thread_wakeup_); LOG4CXX_INFO(logger_, "TransportManager object destroyed"); } @@ -226,18 +222,48 @@ int TransportManagerImpl::AddEventListener(TransportManagerListener* listener) { return E_SUCCESS; } +void TransportManagerImpl::DisconnectAllDevices() { + LOG4CXX_AUTO_TRACE(logger_); + for (DeviceInfoList::iterator i = device_list_.begin(); + i != device_list_.end(); ++i) { + DeviceInfo& device = i->second; + DisconnectDevice(device.device_handle()); + } +} + +void TransportManagerImpl::TerminateAllAdapters() { + LOG4CXX_AUTO_TRACE(logger_); + for (std::vector<TransportAdapter*>::iterator i = transport_adapters_.begin(); + i != transport_adapters_.end(); ++i) { + (*i)->Terminate(); + } +} + +int TransportManagerImpl::InitAllAdapters() { + LOG4CXX_AUTO_TRACE(logger_); + for (std::vector<TransportAdapter*>::iterator i = transport_adapters_.begin(); + i != transport_adapters_.end(); ++i) { + if ((*i)->Init() != TransportAdapter::OK) { + return E_ADAPTERS_FAIL; + } + } + return E_SUCCESS; +} + int TransportManagerImpl::Stop() { - LOG4CXX_TRACE(logger_, "enter"); - if (!all_thread_active_) { - LOG4CXX_TRACE(logger_, - "exit with E_TM_IS_NOT_INITIALIZED. Condition: !all_thread_active_"); + LOG4CXX_AUTO_TRACE(logger_); + if (!is_initialized_) { + LOG4CXX_WARN(logger_, "TransportManager is not initialized_"); return E_TM_IS_NOT_INITIALIZED; } - all_thread_active_ = false; - pthread_cond_signal(&device_listener_thread_wakeup_); + message_queue_.Shutdown(); + event_queue_.Shutdown(); - LOG4CXX_TRACE(logger_, "exit with E_SUCCESS"); + DisconnectAllDevices(); + TerminateAllAdapters(); + + is_initialized_ = false; return E_SUCCESS; } @@ -390,12 +416,19 @@ int TransportManagerImpl::SearchDevices() { int TransportManagerImpl::Init() { LOG4CXX_TRACE(logger_, "enter"); - all_thread_active_ = true; is_initialized_ = true; LOG4CXX_TRACE(logger_, "exit with E_SUCCESS"); return E_SUCCESS; } +int TransportManagerImpl::Reinit() { + LOG4CXX_AUTO_TRACE(logger_); + DisconnectAllDevices(); + TerminateAllAdapters(); + int ret = InitAllAdapters(); + return ret; +} + int TransportManagerImpl::Visibility(const bool& on_off) const { LOG4CXX_TRACE(logger_, "enter. On_off: " << &on_off); TransportAdapter::Error ret; @@ -478,10 +511,9 @@ void TransportManagerImpl::PostMessage(const ::protocol_handler::RawMessagePtr m } void TransportManagerImpl::PostEvent(const TransportAdapterEvent& event) { - LOG4CXX_TRACE(logger_, "enter. TransportAdapterEvent: " << &event); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "TransportAdapterEvent: " << &event); event_queue_.PostMessage(event); - pthread_cond_signal(&device_listener_thread_wakeup_); - LOG4CXX_TRACE(logger_, "exit"); } void TransportManagerImpl::AddConnection(const ConnectionInternal& c) { diff --git a/src/components/transport_manager/src/usb/libusb/platform_usb_device.cc b/src/components/transport_manager/src/usb/libusb/platform_usb_device.cc index 103e03a4f6..1ca1a54b32 100644 --- a/src/components/transport_manager/src/usb/libusb/platform_usb_device.cc +++ b/src/components/transport_manager/src/usb/libusb/platform_usb_device.cc @@ -1,4 +1,4 @@ -/** +/* * * Copyright (c) 2013, Ford Motor Company * All rights reserved. diff --git a/src/components/transport_manager/src/usb/libusb/usb_connection.cc b/src/components/transport_manager/src/usb/libusb/usb_connection.cc index 40891d3513..b8096514bc 100644 --- a/src/components/transport_manager/src/usb/libusb/usb_connection.cc +++ b/src/components/transport_manager/src/usb/libusb/usb_connection.cc @@ -30,6 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <pthread.h> #include <unistd.h> #include <iomanip> @@ -51,7 +52,7 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") UsbConnection::UsbConnection(const DeviceUID& device_uid, const ApplicationHandle& app_handle, TransportAdapterController* controller, - const UsbHandlerSptr& usb_handler, + const UsbHandlerSptr usb_handler, PlatformUsbDevice* device) : device_uid_(device_uid), app_handle_(app_handle), 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 diff --git a/src/components/transport_manager/src/usb/qnx/platform_usb_device.cc b/src/components/transport_manager/src/usb/qnx/platform_usb_device.cc index 0f35a16ae7..132fe52cae 100644 --- a/src/components/transport_manager/src/usb/qnx/platform_usb_device.cc +++ b/src/components/transport_manager/src/usb/qnx/platform_usb_device.cc @@ -1,4 +1,4 @@ -/** +/* * \file platform_usb_device.cc * \brief QNX PlatformUsbDevice class source file. * diff --git a/src/components/transport_manager/src/usb/qnx/usb_connection.cc b/src/components/transport_manager/src/usb/qnx/usb_connection.cc index db3cac014d..a3844b2e04 100644 --- a/src/components/transport_manager/src/usb/qnx/usb_connection.cc +++ b/src/components/transport_manager/src/usb/qnx/usb_connection.cc @@ -50,7 +50,7 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") UsbConnection::UsbConnection(const DeviceUID& device_uid, const ApplicationHandle& app_handle, TransportAdapterController* controller, - const UsbHandlerSptr& libusb_handler, + const UsbHandlerSptr libusb_handler, PlatformUsbDevice* device) : device_uid_(device_uid), app_handle_(app_handle), @@ -60,6 +60,7 @@ UsbConnection::UsbConnection(const DeviceUID& device_uid, in_pipe_(NULL), out_pipe_(NULL), in_buffer_(NULL), + out_buffer_(NULL), in_urb_(NULL), out_urb_(NULL), out_messages_(), @@ -69,7 +70,6 @@ UsbConnection::UsbConnection(const DeviceUID& device_uid, disconnecting_(false), pending_in_transfer_(false), pending_out_transfer_(false) { - pthread_mutex_init(&out_messages_mutex_, 0); } UsbConnection::~UsbConnection() { @@ -89,8 +89,6 @@ UsbConnection::~UsbConnection() { LOG4CXX_ERROR(logger_, "Failed to close pipe: " << close_pipe_rc); } } - - pthread_mutex_destroy(&out_messages_mutex_); } void InTransferCallback(usbd_urb* urb, usbd_pipe*, void* data) { @@ -212,7 +210,7 @@ void UsbConnection::OnOutTransfer(usbd_urb* urb) { } } - pthread_mutex_lock(&out_messages_mutex_); + sync_primitives::AutoLock locker(out_messages_mutex_); if (error) { LOG4CXX_ERROR(logger_, "USB out transfer failed"); @@ -234,14 +232,13 @@ void UsbConnection::OnOutTransfer(usbd_urb* urb) { } else { pending_out_transfer_ = false; } - pthread_mutex_unlock(&out_messages_mutex_); } TransportAdapter::Error UsbConnection::SendData(::protocol_handler::RawMessagePtr message) { if (disconnecting_) { return TransportAdapter::BAD_STATE; } - pthread_mutex_lock(&out_messages_mutex_); + sync_primitives::AutoLock locker(out_messages_mutex_); if (current_out_message_.valid()) { out_messages_.push_back(message); } else { @@ -251,13 +248,12 @@ TransportAdapter::Error UsbConnection::SendData(::protocol_handler::RawMessagePt DataSendError()); } } - pthread_mutex_unlock(&out_messages_mutex_); return TransportAdapter::OK; } void UsbConnection::Finalise() { LOG4CXX_INFO(logger_, "Finalising"); - pthread_mutex_lock(&out_messages_mutex_); + sync_primitives::AutoLock locker(out_messages_mutex_); disconnecting_ = true; usbd_abort_pipe(in_pipe_); usbd_abort_pipe(out_pipe_); @@ -265,7 +261,6 @@ void UsbConnection::Finalise() { it != out_messages_.end(); it = out_messages_.erase(it)) { controller_->DataSendFailed(device_uid_, app_handle_, *it, DataSendError()); } - pthread_mutex_unlock(&out_messages_mutex_); while (pending_in_transfer_ || pending_out_transfer_) sched_yield(); } diff --git a/src/components/transport_manager/src/usb/qnx/usb_handler.cc b/src/components/transport_manager/src/usb/qnx/usb_handler.cc index 7ab36169b1..d78b6c8184 100644 --- a/src/components/transport_manager/src/usb/qnx/usb_handler.cc +++ b/src/components/transport_manager/src/usb/qnx/usb_handler.cc @@ -1,4 +1,4 @@ -/** +/* * \file usb_handler.cc * \brief UsbHandler class source file. * diff --git a/src/components/transport_manager/src/usb/usb_aoa_adapter.cc b/src/components/transport_manager/src/usb/usb_aoa_adapter.cc index 464b9ea35e..b3ebb104dc 100644 --- a/src/components/transport_manager/src/usb/usb_aoa_adapter.cc +++ b/src/components/transport_manager/src/usb/usb_aoa_adapter.cc @@ -1,4 +1,4 @@ -/** +/* * \file usb_aoa_adapter.cpp * \brief UsbAoaAdapter class source file. * diff --git a/src/components/transport_manager/src/usb/usb_connection_factory.cc b/src/components/transport_manager/src/usb/usb_connection_factory.cc index d57391ebcc..4562473536 100644 --- a/src/components/transport_manager/src/usb/usb_connection_factory.cc +++ b/src/components/transport_manager/src/usb/usb_connection_factory.cc @@ -54,7 +54,7 @@ TransportAdapter::Error UsbConnectionFactory::Init() { return TransportAdapter::OK; } -void UsbConnectionFactory::SetUsbHandler(const UsbHandlerSptr& usb_handler) { +void UsbConnectionFactory::SetUsbHandler(const UsbHandlerSptr usb_handler) { usb_handler_ = usb_handler; } diff --git a/src/components/transport_manager/src/usb/usb_device_scanner.cc b/src/components/transport_manager/src/usb/usb_device_scanner.cc index bf9535941c..bddc20dd3c 100644 --- a/src/components/transport_manager/src/usb/usb_device_scanner.cc +++ b/src/components/transport_manager/src/usb/usb_device_scanner.cc @@ -47,7 +47,8 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") class AoaInitSequence : public UsbControlTransferSequence { public: AoaInitSequence(); - virtual ~AoaInitSequence() {} + virtual ~AoaInitSequence() { + } private: class AoaGetProtocolRequest; @@ -56,7 +57,7 @@ class AoaInitSequence : public UsbControlTransferSequence { }; void UsbDeviceScanner::OnDeviceArrived(PlatformUsbDevice* device) { - LOG4CXX_TRACE(logger_, "enter. PlatformUsbDevice* " << device); + LOG4CXX_AUTO_TRACE(logger_); if (IsAppleDevice(device)) { SupportedDeviceFound(device); } else { @@ -66,13 +67,13 @@ void UsbDeviceScanner::OnDeviceArrived(PlatformUsbDevice* device) { TurnIntoAccessoryMode(device); } } - LOG4CXX_TRACE(logger_, "exit"); } void UsbDeviceScanner::OnDeviceLeft(PlatformUsbDevice* device) { - LOG4CXX_TRACE(logger_, "enter. PlatformUsbDevice " << device); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "PlatformUsbDevice " << device); bool list_changed = false; - pthread_mutex_lock(&devices_mutex_); + devices_mutex_.Acquire(); for (Devices::iterator it = devices_.begin(); it != devices_.end(); ++it) { if (device == *it) { devices_.erase(it); @@ -80,24 +81,22 @@ void UsbDeviceScanner::OnDeviceLeft(PlatformUsbDevice* device) { break; } } - pthread_mutex_unlock(&devices_mutex_); + devices_mutex_.Release(); if (list_changed) { UpdateList(); } - LOG4CXX_TRACE(logger_, "exit"); } UsbDeviceScanner::UsbDeviceScanner(TransportAdapterController* controller) - : controller_(controller) { - pthread_mutex_init(&devices_mutex_, 0); + : controller_(controller) { } UsbDeviceScanner::~UsbDeviceScanner() { - pthread_mutex_destroy(&devices_mutex_); } class AoaInitSequence::AoaGetProtocolRequest : public UsbControlInTransfer { - virtual ~AoaGetProtocolRequest() {} + virtual ~AoaGetProtocolRequest() { + } virtual RequestType Type() const { return VENDOR; } @@ -115,7 +114,7 @@ class AoaInitSequence::AoaGetProtocolRequest : public UsbControlInTransfer { } virtual bool OnCompleted(unsigned char* data) const { const int protocol_version = data[1] << 8 | data[0]; - LOG4CXX_INFO(logger_, "AOA protocol version " << protocol_version); + LOG4CXX_DEBUG(logger_, "AOA protocol version " << protocol_version); if (protocol_version == 0) { // AOA protocol not supported return false; @@ -127,10 +126,14 @@ class AoaInitSequence::AoaGetProtocolRequest : public UsbControlInTransfer { class AoaInitSequence::AoaSendIdString : public UsbControlOutTransfer { public: AoaSendIdString(uint16_t index, const char* string, uint16_t length) - : index_(index), string_(string), length_(length) {} + : index_(index), + string_(string), + length_(length) { + } private: - virtual ~AoaSendIdString() {} + virtual ~AoaSendIdString() { + } virtual RequestType Type() const { return VENDOR; } @@ -155,7 +158,8 @@ class AoaInitSequence::AoaSendIdString : public UsbControlOutTransfer { }; class AoaInitSequence::AoaTurnIntoAccessoryMode : public UsbControlOutTransfer { - virtual ~AoaTurnIntoAccessoryMode() {} + virtual ~AoaTurnIntoAccessoryMode() { + } virtual RequestType Type() const { return VENDOR; } @@ -183,7 +187,8 @@ static char version[] = "1.0"; static char uri[] = "http://www.ford.com"; static char serial_num[] = "N000000"; -AoaInitSequence::AoaInitSequence() : UsbControlTransferSequence() { +AoaInitSequence::AoaInitSequence() + : UsbControlTransferSequence() { AddTransfer(new AoaGetProtocolRequest); AddTransfer(new AoaSendIdString(0, manufacturer, sizeof(manufacturer))); AddTransfer(new AoaSendIdString(1, model_name, sizeof(model_name))); @@ -195,25 +200,26 @@ AoaInitSequence::AoaInitSequence() : UsbControlTransferSequence() { } void UsbDeviceScanner::TurnIntoAccessoryMode(PlatformUsbDevice* device) { - LOG4CXX_TRACE(logger_, "enter. PlatformUsbDevice: " << device); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "PlatformUsbDevice: " << device); GetUsbHandler()->StartControlTransferSequence(new AoaInitSequence, device); - LOG4CXX_TRACE(logger_, "exit"); } void UsbDeviceScanner::SupportedDeviceFound(PlatformUsbDevice* device) { - LOG4CXX_TRACE(logger_, "enter PlatformUsbDevice: " << device); + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "PlatformUsbDevice: " << device); - pthread_mutex_lock(&devices_mutex_); + devices_mutex_.Acquire(); devices_.push_back(device); - pthread_mutex_unlock(&devices_mutex_); - LOG4CXX_INFO(logger_, "USB device (bus number " - << static_cast<int>(device->bus_number()) - << ", address " - << static_cast<int>(device->address()) - << ") identified as: " << device->GetManufacturer() - << ", " << device->GetProductName()); + devices_mutex_.Release(); + LOG4CXX_DEBUG( + logger_, + "USB device (bus number " << static_cast<int>(device->bus_number()) + << ", address " << static_cast<int>(device->address()) + << ") identified as: " << device->GetManufacturer() + << ", " << device->GetProductName() + << ", serial: " << device->GetSerialNumber()); UpdateList(); - LOG4CXX_TRACE(logger_, "exit"); } TransportAdapter::Error UsbDeviceScanner::Init() { @@ -225,30 +231,28 @@ TransportAdapter::Error UsbDeviceScanner::Scan() { } void UsbDeviceScanner::UpdateList() { - LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_AUTO_TRACE(logger_); DeviceVector device_vector; - pthread_mutex_lock(&devices_mutex_); + devices_mutex_.Acquire(); for (Devices::const_iterator it = devices_.begin(); it != devices_.end(); - ++it) { - const std::string device_name = - (*it)->GetManufacturer() + " " + (*it)->GetProductName(); + ++it) { + const std::string device_name = (*it)->GetManufacturer() + " " + + (*it)->GetProductName(); std::ostringstream oss; oss << (*it)->GetManufacturer() << ":" << (*it)->GetProductName() << ":" - << (*it)->GetSerialNumber() << ":" - << static_cast<int>((*it)->bus_number()) << ":" - << static_cast<int>((*it)->address()); + << (*it)->GetSerialNumber(); const DeviceUID device_uid = oss.str(); DeviceSptr device(new UsbDevice(*it, device_name, device_uid)); device_vector.push_back(device); } - pthread_mutex_unlock(&devices_mutex_); + devices_mutex_.Release(); - LOG4CXX_INFO(logger_, "USB search done " << device_vector.size()); + LOG4CXX_DEBUG(logger_, "USB search done " << device_vector.size()); controller_->SearchDeviceDone(device_vector); - LOG4CXX_TRACE(logger_, "exit"); } -void UsbDeviceScanner::Terminate() {} +void UsbDeviceScanner::Terminate() { +} bool UsbDeviceScanner::IsInitialised() const { return true; |