diff options
Diffstat (limited to 'src/components/transport_manager')
53 files changed, 443 insertions, 519 deletions
diff --git a/src/components/transport_manager/CMakeLists.txt b/src/components/transport_manager/CMakeLists.txt index 68358a5f3d..15ecc91619 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() +endif()
\ No newline at end of file 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 4d1d474377..48d1f15538 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 f28147a3b5..4abef3c604 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,6 +37,11 @@ #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 d1bed9b3dc..0c68c67216 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,9 +46,7 @@ #include "transport_manager/transport_adapter/device_scanner.h" #include "utils/conditional_variable.h" #include "utils/lock.h" -#include "utils/threads/thread_delegate.h" - -class Thread; +#include "utils/threads/thread.h" 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 3de77ab529..e1606da878 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 69a588fd37..075b5da55f 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 d31beea26c..cd319ca543 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_; - sync_primitives::Lock mutex_; + pthread_mutex_t 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 f54e5a8fc2..12eab5a1b5 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" -class Thread; +#include "utils/threads/thread_delegate.h" +#include "utils/threads/thread.h" namespace transport_manager { namespace transport_adapter { @@ -49,7 +49,8 @@ class TransportAdapterController; /** * @brief Listener of device adapter that use TCP transport. */ -class TcpClientListener : public ClientConnectionListener { +class TcpClientListener : public ClientConnectionListener, + public threads::ThreadDelegate { public: /** * @breaf Constructor. @@ -63,6 +64,14 @@ class TcpClientListener : public ClientConnectionListener { bool enable_keepalive); /** + * @brief Start TCP client listener thread. + */ + void threadMain(); + + bool exitThreadMain(); + protected: + + /** * @brief Destructor. */ virtual ~TcpClientListener(); @@ -98,26 +107,15 @@ 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 690c3127bd..fba85aa601 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,6 +54,7 @@ class TcpConnectionFactory : public ServerConnectionFactory { * @param controller Pointer to the device adapter controller. */ TcpConnectionFactory(TransportAdapterController* controller); + protected: /** * @brief Start TCP connection factory. @@ -68,8 +69,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 2b89e09020..08821ab3c4 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,8 +47,6 @@ #include <sys/types.h> #include <sys/socket.h> -#include "utils/lock.h" - namespace transport_manager { namespace transport_adapter { @@ -138,7 +136,7 @@ class TcpDevice : public Device { uint16_t port; }; std::map<ApplicationHandle, Application> applications_; - mutable sync_primitives::Lock applications_mutex_; + mutable pthread_mutex_t 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 9af825ea93..8fe7b8e837 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 277194b512..1319c40eeb 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 018dd46810..41658fb45f 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,4 +1,6 @@ -/* +/** + * \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 d09e9643b1..094cb51921 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 36759a9385..5b09a726e5 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 19c37aa6a6..d944594d88 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 399ddb1fcf..851f250a88 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,12 +41,10 @@ #include "transport_manager/transport_adapter/connection.h" #include "protocol/common.h" #include "utils/threads/thread_delegate.h" -#include "utils/lock.h" +#include "utils/threads/thread.h" using ::transport_manager::transport_adapter::Connection; -class Thread; - namespace transport_manager { namespace transport_adapter { @@ -135,7 +133,7 @@ class ThreadedSocketConnection : public Connection, int read_fd_; int write_fd_; void threadMain(); - void exitThreadMain(); + bool exitThreadMain(); void Transmit(); void Finalize(); TransportAdapter::Error Notify() const; @@ -149,7 +147,7 @@ class ThreadedSocketConnection : public Connection, **/ typedef std::queue<protocol_handler::RawMessagePtr> FrameQueue; FrameQueue frames_to_send_; - mutable sync_primitives::Lock frames_to_send_mutex_; + mutable pthread_mutex_t 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 f66f1c6bb9..2c27e0d20f 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,8 +39,6 @@ #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" @@ -101,12 +99,6 @@ 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. @@ -501,7 +493,7 @@ class TransportAdapterImpl : public TransportAdapter, /** * @brief Mutex restricting access to device map. **/ - mutable sync_primitives::Lock devices_mutex_; + mutable pthread_mutex_t devices_mutex_; /** * @brief Container(map) of connections. @@ -511,16 +503,9 @@ class TransportAdapterImpl : public TransportAdapter, /** * @brief Mutex restricting access to connections map. **/ - mutable sync_primitives::RWLock connections_lock_; + mutable pthread_mutex_t connections_mutex_; protected: -#ifdef TIME_TESTER - /** - * @brief Pointer to time metric observer - */ - TMMetricObserver* metric_observer_; -#endif // TIME_TESTER - /** * @brief Pointer to the device scanner. */ @@ -535,8 +520,14 @@ 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 4c38716f3f..62fdb3fa2e 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,12 +33,15 @@ #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" @@ -101,12 +104,6 @@ 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. @@ -253,6 +250,12 @@ 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. @@ -260,6 +263,11 @@ 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_; @@ -344,9 +352,6 @@ 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 b90c504a4b..d1f485c9d5 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 7c1fbd4551..fc6af46a47 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 215b66f6e3..fd6e77013a 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,17 +36,16 @@ #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" -#include "utils/threads/thread.h" - -class Thread; - namespace transport_manager { + namespace transport_adapter { class UsbHandler { @@ -72,16 +71,9 @@ 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_; - threads::Thread* thread_; + // TODO(Eamakhov): change to threads::Thread usage + pthread_t 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 ab35f862c6..939a8fcb3c 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 d55c887bd1..3a0d2f8a26 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 "utils/lock.h" +#include <pthread.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_; - sync_primitives::Lock out_messages_mutex_; + pthread_mutex_t 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 c33e0f2361..26b00087ff 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 b0d8c1e453..55fb028ef7 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 ebd25bd37b..ed0fda91ee 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 c701a86e0a..8c4f8a9d4c 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 9efb7ba58d..0937222155 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,7 +38,8 @@ #include <list> -#include "utils/lock.h" +#include <pthread.h> + #include "transport_manager/transport_adapter/device_scanner.h" #include "transport_manager/usb/common.h" @@ -68,7 +69,7 @@ class UsbDeviceScanner : public DeviceScanner, public UsbDeviceListener { typedef std::list<PlatformUsbDevice*> Devices; Devices devices_; - sync_primitives::Lock devices_mutex_; + pthread_mutex_t 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 02224baf4e..421104422b 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 c8061a7ac5..1a47f6c7ff 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device.cc @@ -33,13 +33,6 @@ #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 0fbb9d2245..547dc463b2 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,7 +52,6 @@ #include "transport_manager/bluetooth/bluetooth_device.h" #include "utils/logger.h" -#include "utils/threads/thread.h" namespace transport_manager { namespace transport_adapter { @@ -118,45 +117,44 @@ 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_ && thread_->is_running(); + return thread_->is_running(); } void BluetoothDeviceScanner::UpdateTotalDeviceList() { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); 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_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); 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; } @@ -205,6 +203,8 @@ 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_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); ready_ = true; if (auto_repeat_search_) { while (!shutdown_requested_) { @@ -394,10 +394,12 @@ void BluetoothDeviceScanner::Thread() { device_scan_requested_ = false; } } + + LOG4CXX_TRACE(logger_, "exit"); } void BluetoothDeviceScanner::TimedWaitForDeviceScanRequest() { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); if (auto_repeat_pause_sec_ == 0) { LOG4CXX_TRACE(logger_, "exit. Condition: auto_repeat_pause_sec_ == 0"); @@ -415,22 +417,26 @@ void BluetoothDeviceScanner::TimedWaitForDeviceScanRequest() { } } } + + LOG4CXX_TRACE(logger_, "exit"); } TransportAdapter::Error BluetoothDeviceScanner::Init() { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); 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_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); shutdown_requested_ = true; - if (thread_) { + if (thread_->is_running()) { { sync_primitives::AutoLock auto_lock(device_scan_requested_lock_); device_scan_requested_ = false; @@ -439,30 +445,36 @@ void BluetoothDeviceScanner::Terminate() { LOG4CXX_INFO(logger_, "Waiting for bluetooth device scanner thread termination"); thread_->stop(); - LOG4CXX_INFO(logger_, "Bluetooth device scanner thread stopped"); + LOG4CXX_INFO(logger_, "PASA Bluetooth device scanner thread joined"); } + LOG4CXX_TRACE(logger_, "exit"); } TransportAdapter::Error BluetoothDeviceScanner::Scan() { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); if ((!IsInitialised()) || shutdown_requested_) { - LOG4CXX_WARN(logger_, "BAD_STATE"); + LOG4CXX_TRACE(logger_, "exit with TransportAdapter::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 (!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"); + { + 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"); + } } + + LOG4CXX_TRACE(logger_, "exit with Error: " << ret); return ret; } @@ -471,10 +483,12 @@ BluetoothDeviceScanner::BluetoothDeviceScannerDelegate::BluetoothDeviceScannerDe : scanner_(scanner) { } -void BluetoothDeviceScanner::BluetoothDeviceScannerDelegate::threadMain() { - LOG4CXX_AUTO_TRACE(logger_); +void BluetoothDeviceScanner::BluetoothDeviceScannerDelegate::threadMain() +{ + LOG4CXX_TRACE_ENTER(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 d6f9f26317..ac1ccecfb5 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,8 +60,7 @@ BluetoothSocketConnection::~BluetoothSocketConnection() { } bool BluetoothSocketConnection::Establish(ConnectError** error) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "error: " << error); + LOG4CXX_TRACE(logger_, "enter. (#" << pthread_self() << "), 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 51ceebe5de..7d60213b01 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 e8ba2ea874..5580585766 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,15 +56,12 @@ 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"); } @@ -81,9 +78,11 @@ DnssdServiceBrowser::DnssdServiceBrowser(TransportAdapterController* controller) service_records_(), mutex_(), initialised_(false) { + pthread_mutex_init(&mutex_, 0); } DnssdServiceBrowser::~DnssdServiceBrowser() { + pthread_mutex_destroy(&mutex_); } void DnssdServiceBrowser::OnClientConnected() { @@ -173,8 +172,8 @@ void AvahiServiceBrowserCallback(AvahiServiceBrowser* avahi_service_browser, void DnssdServiceBrowser::ServiceResolved( const DnssdServiceRecord& service_record) { - LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock locker(mutex_); + LOG4CXX_TRACE(logger_, "enter"); + pthread_mutex_lock(&mutex_); ServiceRecords::iterator service_record_it = std::find( service_records_.begin(), service_records_.end(), service_record); if (service_record_it != service_records_.end()) { @@ -182,19 +181,23 @@ 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_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, + LOG4CXX_TRACE(logger_, "enter"); + LOG4CXX_ERROR(logger_, "AvahiServiceResolver failure for: " << service_record.name); - sync_primitives::AutoLock locker(mutex_); + pthread_mutex_lock(&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, @@ -243,11 +246,9 @@ 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; @@ -260,9 +261,9 @@ TransportAdapter::Error DnssdServiceBrowser::CreateAvahiClientAndBrowser() { return TransportAdapter::FAIL; } - mutex_.Acquire(); + pthread_mutex_lock(&mutex_); service_records_.clear(); - mutex_.Release(); + pthread_mutex_unlock(&mutex_); avahi_service_browser_ = avahi_service_browser_new( avahi_client_, AVAHI_IF_UNSPEC, /* TODO use only required iface */ @@ -304,8 +305,7 @@ TransportAdapter::Error DnssdServiceBrowser::Scan() { void DnssdServiceBrowser::AddService(AvahiIfIndex interface, AvahiProtocol protocol, const char* name, const char* type, const char* domain) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "interface " << interface << " protocol " << protocol << + LOG4CXX_TRACE(logger_, "enter: 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; - sync_primitives::AutoLock locker(mutex_); + pthread_mutex_lock(&mutex_); if (service_records_.end() == std::find(service_records_.begin(), service_records_.end(), record)) { service_records_.push_back(record); @@ -323,14 +323,15 @@ 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_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "interface " << interface << " protocol " << protocol << + LOG4CXX_TRACE(logger_, "enter: interface " << interface << " protocol " << protocol << " name " << name << " type " << type << " domain " << domain); DnssdServiceRecord record; record.interface = interface; @@ -339,14 +340,16 @@ void DnssdServiceBrowser::RemoveService(AvahiIfIndex interface, record.type = type; record.domain_name = domain; - sync_primitives::AutoLock locker(mutex_); + pthread_mutex_lock(&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_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); std::map<uint32_t, TcpDevice*> devices; for (ServiceRecords::const_iterator it = service_records_.begin(); it != service_records_.end(); ++it) { @@ -369,6 +372,7 @@ 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 954c734d68..c0f39cc490 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,35 +66,31 @@ 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_(0), - socket_(-1), - thread_stop_requested_(false) { - thread_ = threads::CreateThread("TcpClientListener", - new ListeningThreadDelegate(this)); -} + : port_(port), + enable_keepalive_(enable_keepalive), + controller_(controller), + thread_(threads::CreateThread("TcpClientListener", this)), + socket_(-1), + thread_stop_requested_(false) { } TransportAdapter::Error TcpClientListener::Init() { - LOG4CXX_AUTO_TRACE(logger_); - thread_stop_requested_ = false; return TransportAdapter::OK; } void TcpClientListener::Terminate() { - thread_->stop(); + LOG4CXX_TRACE(logger_, "enter"); + if (TransportAdapter::OK != StopListening()) { + LOG4CXX_ERROR(logger_, "Cannot stop listening TCP"); + } + LOG4CXX_TRACE(logger_, "exit"); } bool TcpClientListener::IsInitialised() const { - return thread_; + return true; } TcpClientListener::~TcpClientListener() { - LOG4CXX_AUTO_TRACE(logger_); - thread_->join(); - delete thread_->delegate(); - threads::DeleteThread(thread_); + LOG4CXX_INFO(logger_, "destructor"); } void SetKeepaliveOptions(const int fd) { @@ -134,7 +130,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)); @@ -142,13 +138,12 @@ void SetKeepaliveOptions(const int fd) { LOG4CXX_TRACE(logger_, "exit"); } -void TcpClientListener::Loop() { +void TcpClientListener::threadMain() { 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_"); @@ -162,7 +157,6 @@ void TcpClientListener::Loop() { if (AF_INET != client_address.sin_family) { LOG4CXX_DEBUG(logger_, "Address of connected client is invalid"); - close(connection_fd); continue; } @@ -175,16 +169,15 @@ void TcpClientListener::Loop() { 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) { @@ -194,26 +187,11 @@ void TcpClientListener::Loop() { 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_ || thread_->is_running()) { - LOG4CXX_TRACE( - logger_, - "exit with TransportAdapter::BAD_STATE. Condition: thread_started_"); + if (thread_->is_running()) { + LOG4CXX_TRACE(logger_, + "exit with TransportAdapter::BAD_STATE. Condition: thread_started_"); return TransportAdapter::BAD_STATE; } @@ -221,8 +199,7 @@ 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; } @@ -236,17 +213,15 @@ 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; } @@ -260,29 +235,33 @@ TransportAdapter::Error TcpClientListener::StartListening() { return TransportAdapter::OK; } -void TcpClientListener::ListeningThreadDelegate::exitThreadMain() { - parent_->StopLoop(); -} - -void TcpClientListener::ListeningThreadDelegate::threadMain() { - parent_->Loop(); -} - -TcpClientListener::ListeningThreadDelegate::ListeningThreadDelegate( - TcpClientListener* parent) - : parent_(parent) { +bool TcpClientListener::exitThreadMain() { + StopListening(); + return true; } TransportAdapter::Error TcpClientListener::StopListening() { - LOG4CXX_AUTO_TRACE(logger_); - if (!thread_ || !thread_->is_running()) { - LOG4CXX_TRACE(logger_, "TcpClientListener is not running now"); + LOG4CXX_TRACE(logger_, "enter"); + if (!thread_->is_running()) { + LOG4CXX_TRACE(logger_, + "exit with TransportAdapter::BAD_STATE. Condition !thread_started_"); return TransportAdapter::BAD_STATE; } - thread_->stop(); + 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"); 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 a8c2bda600..69173a0e06 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 130187c384..2540c26ed0 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,53 +63,57 @@ bool TcpDevice::IsSameAs(const Device* other) const { } ApplicationList TcpDevice::GetApplicationList() const { - LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock locker(applications_mutex_); + LOG4CXX_TRACE(logger_, "enter"); + pthread_mutex_lock(&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_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "Socket_fd: " << socket_fd); + LOG4CXX_TRACE(logger_, "enter. Socket_fd: " << socket_fd); Application app; app.incoming = true; app.socket = socket_fd; app.port = 0; // this line removes compiler warning - sync_primitives::AutoLock locker(applications_mutex_); + pthread_mutex_lock(&applications_mutex_); const ApplicationHandle app_handle = ++last_handle_; applications_[app_handle] = app; - LOG4CXX_DEBUG(logger_, "App_handle " << app_handle); + pthread_mutex_unlock(&applications_mutex_); + LOG4CXX_TRACE(logger_, "exit with app_handle " << app_handle); return app_handle; } ApplicationHandle TcpDevice::AddDiscoveredApplication(int port) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "Port " << port); + LOG4CXX_TRACE(logger_, "enter. port " << port); Application app; app.incoming = false; app.socket = 0; // this line removes compiler warning app.port = port; - sync_primitives::AutoLock locker(applications_mutex_); + pthread_mutex_lock(&applications_mutex_); const ApplicationHandle app_handle = ++last_handle_; applications_[app_handle] = app; - LOG4CXX_DEBUG(logger_, "App_handle " << app_handle); + pthread_mutex_unlock(&applications_mutex_); + LOG4CXX_TRACE(logger_, "exit with app_handle " << app_handle); return app_handle; } void TcpDevice::RemoveApplication(const ApplicationHandle app_handle) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "ApplicationHandle: " << app_handle); - sync_primitives::AutoLock locker(applications_mutex_); + LOG4CXX_TRACE(logger_, "enter. ApplicationHandle: " << app_handle); + pthread_mutex_lock(&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 a1160a84a8..3b208d8a07 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,12 +35,10 @@ #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 { @@ -109,9 +107,6 @@ 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 6c4ee0cd89..3747225a89 100644 --- a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc +++ b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc @@ -1,4 +1,5 @@ -/* +/** + * * Copyright (c) 2013, Ford Motor Company * All rights reserved. * @@ -35,7 +36,6 @@ #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]; - snprintf(port_record, sizeof(port_record), "%d", port); + sprintf(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 7bd54d337b..1e189ed101 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,9 +36,7 @@ #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" @@ -57,43 +55,42 @@ ThreadedSocketConnection::ThreadedSocketConnection( terminate_flag_(false), unexpected_disconnect_(false), device_uid_(device_id), - app_handle_(app_handle), - thread_(NULL) { + app_handle_(app_handle) + { + pthread_mutex_init(&frames_to_send_mutex_, 0); } ThreadedSocketConnection::~ThreadedSocketConnection() { terminate_flag_ = true; Notify(); - if (thread_) { - thread_->join(); - delete thread_->delegate(); - threads::DeleteThread(thread_); - } + pthread_mutex_destroy(&frames_to_send_mutex_); + } void ThreadedSocketConnection::Abort() { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); unexpected_disconnect_ = true; terminate_flag_ = true; + LOG4CXX_TRACE(logger_, "exit"); } TransportAdapter::Error ThreadedSocketConnection::Start() { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); int fds[2]; const int pipe_ret = pipe(fds); if (0 == pipe_ret) { - LOG4CXX_DEBUG(logger_, "pipe created"); + LOG4CXX_DEBUG(logger_, "pipe created(#" << pthread_self() << ")"); read_fd_ = fds[0]; write_fd_ = fds[1]; } else { - LOG4CXX_WARN(logger_, "pipe creation failed"); + LOG4CXX_WARN(logger_, "pipe creation failed (#" << pthread_self() << ")"); 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"); + LOG4CXX_WARN(logger_, "fcntl failed (#" << pthread_self() << ")"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL"); return TransportAdapter::FAIL; } @@ -102,23 +99,23 @@ TransportAdapter::Error ThreadedSocketConnection::Start() { thread_ = threads::CreateThread(thread_name.c_str(), this); if (!thread_->start()) { - LOG4CXX_WARN(logger_, "thread creation failed"); + LOG4CXX_WARN(logger_, "thread creation failed (#" << pthread_self() << ")"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL"); return TransportAdapter::FAIL; } - LOG4CXX_DEBUG(logger_, "thread created"); + LOG4CXX_DEBUG(logger_, "thread created (#" << pthread_self() << ")"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::OK"); return TransportAdapter::OK; } void ThreadedSocketConnection::Finalize() { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); if (unexpected_disconnect_) { - LOG4CXX_DEBUG(logger_, "unexpected_disconnect"); + LOG4CXX_DEBUG(logger_, "unexpected_disconnect (#" << pthread_self() << ")"); controller_->ConnectionAborted(device_handle(), application_handle(), CommunicationError()); } else { - LOG4CXX_DEBUG(logger_, "not unexpected_disconnect"); + LOG4CXX_DEBUG(logger_, "not unexpected_disconnect (#" << pthread_self() << ")"); controller_->ConnectionFinished(device_handle(), application_handle()); } close(socket_); @@ -148,9 +145,9 @@ TransportAdapter::Error ThreadedSocketConnection::Notify() const { TransportAdapter::Error ThreadedSocketConnection::SendData( ::protocol_handler::RawMessagePtr message) { LOG4CXX_TRACE(logger_, "enter"); - frames_to_send_mutex_.Acquire(); + pthread_mutex_lock(&frames_to_send_mutex_); frames_to_send_.push(message); - frames_to_send_mutex_.Release(); + pthread_mutex_unlock(&frames_to_send_mutex_); TransportAdapter::Error error = Notify(); LOG4CXX_TRACE(logger_, "exit with error" << error); return error; @@ -164,9 +161,10 @@ TransportAdapter::Error ThreadedSocketConnection::Disconnect() { return error; } -void ThreadedSocketConnection::exitThreadMain() { +bool ThreadedSocketConnection::exitThreadMain() { terminate_flag_ = true; Notify(); + return true; } void ThreadedSocketConnection::threadMain() { @@ -174,15 +172,15 @@ void ThreadedSocketConnection::threadMain() { controller_->ConnectionCreated(this, device_uid_, app_handle_); ConnectError* connect_error = NULL; if (Establish(&connect_error)) { - LOG4CXX_DEBUG(logger_, "Connection established"); + LOG4CXX_DEBUG(logger_, "Connection established (#" << pthread_self() << ")"); controller_->ConnectDone(device_handle(), application_handle()); while (!terminate_flag_) { Transmit(); } - LOG4CXX_DEBUG(logger_, "Connection is to finalize"); + LOG4CXX_DEBUG(logger_, "Connection is to finalize (#" << pthread_self() << ")"); Finalize(); while (!frames_to_send_.empty()) { - LOG4CXX_INFO(logger_, "removing message"); + LOG4CXX_INFO(logger_, "removing message (#" << pthread_self() << ")"); ::protocol_handler::RawMessagePtr message = frames_to_send_.front(); frames_to_send_.pop(); controller_->DataSendFailed(device_handle(), application_handle(), @@ -190,7 +188,7 @@ void ThreadedSocketConnection::threadMain() { } controller_->DisconnectDone(device_handle(), application_handle()); } else { - LOG4CXX_ERROR(logger_, "Connection Establish failed"); + LOG4CXX_ERROR(logger_, "Connection Establish failed (#" << pthread_self() << ")"); controller_->ConnectFailed(device_handle(), application_handle(), *connect_error); delete connect_error; @@ -214,14 +212,14 @@ void ThreadedSocketConnection::Transmit() { poll_fds[1].fd = read_fd_; poll_fds[1].events = POLLIN | POLLPRI; - LOG4CXX_DEBUG(logger_, "poll " << this); + LOG4CXX_DEBUG(logger_, "poll (#" << pthread_self() << ") " << 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 " << this << " revents0:" + LOG4CXX_DEBUG(logger_, "poll is ok (#" << pthread_self() << ") " << this << " revents0:" << std::hex << poll_fds[0].revents << " revents1:" << std::hex << poll_fds[1].revents); // error check @@ -258,12 +256,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() "); + LOG4CXX_DEBUG(logger_, "frames_to_send_ not empty() (#" << pthread_self() << ")"); // send data const bool send_ok = Send(); if (!send_ok) { - LOG4CXX_ERROR(logger_, "Send() failed "); + LOG4CXX_ERROR(logger_, "Send() failed (#" << pthread_self() << ")"); Abort(); LOG4CXX_TRACE(logger_, "exit. Condition: !send_ok"); return; @@ -274,7 +272,7 @@ void ThreadedSocketConnection::Transmit() { if (poll_fds[0].revents & (POLLIN | POLLPRI)) { const bool receive_ok = Receive(); if (!receive_ok) { - LOG4CXX_ERROR(logger_, "Receive() failed "); + LOG4CXX_ERROR(logger_, "Receive() failed (#" << pthread_self() << ")"); Abort(); LOG4CXX_TRACE(logger_, "exit. Condition: !receive_ok"); return; @@ -320,19 +318,19 @@ bool ThreadedSocketConnection::Receive() { bool ThreadedSocketConnection::Send() { LOG4CXX_TRACE(logger_, "enter"); FrameQueue frames_to_send; - frames_to_send_mutex_.Acquire(); + pthread_mutex_lock(&frames_to_send_mutex_); std::swap(frames_to_send, frames_to_send_); - frames_to_send_mutex_.Release(); + pthread_mutex_unlock(&frames_to_send_mutex_); size_t offset = 0; while (!frames_to_send.empty()) { - LOG4CXX_INFO(logger_, "frames_to_send is not empty"); + LOG4CXX_INFO(logger_, "frames_to_send is not empty" << pthread_self() << ")"); ::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"); + LOG4CXX_DEBUG(logger_, "bytes_sent >= 0" << pthread_self() << ")"); offset += bytes_sent; if (offset == frame->data_size()) { frames_to_send.pop(); @@ -340,7 +338,7 @@ bool ThreadedSocketConnection::Send() { controller_->DataSendDone(device_handle(), application_handle(), frame); } } else { - LOG4CXX_DEBUG(logger_, "bytes_sent < 0"); + LOG4CXX_DEBUG(logger_, "bytes_sent < 0" << pthread_self() << ")"); 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 67b2b1ad58..3330e93e31 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,64 +53,56 @@ TransportAdapterImpl::TransportAdapterImpl( devices_(), devices_mutex_(), connections_(), - connections_lock_(), -#ifdef TIME_TESTER - metric_observer_(NULL), -#endif // TIME_TESTER + connections_mutex_(), device_scanner_(device_scanner), server_connection_factory_(server_connection_factory), - client_connection_listener_(client_connection_listener) { + client_connection_listener_(client_connection_listener) +#ifdef TIME_TESTER + , metric_observer_(NULL) +#endif // TIME_TESTER +{ + pthread_mutex_init(&devices_mutex_, 0); + pthread_mutex_init(&connections_mutex_, 0); } 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_); - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); connections.clear(); LOG4CXX_DEBUG(logger_, "Connections deleted"); - devices_mutex_.Acquire(); + pthread_mutex_lock(&devices_mutex_); DeviceMap devices; std::swap(devices, devices_); - devices_mutex_.Release(); + pthread_mutex_unlock(&devices_mutex_); devices.clear(); LOG4CXX_DEBUG(logger_, "Devices deleted"); + + pthread_mutex_destroy(&connections_mutex_); + pthread_mutex_destroy(&devices_mutex_); } TransportAdapter::Error TransportAdapterImpl::Init() { @@ -167,7 +159,7 @@ TransportAdapter::Error TransportAdapterImpl::Connect( return BAD_STATE; } - connections_lock_.AcquireForWriting(); + pthread_mutex_lock(&connections_mutex_); const bool already_exists = connections_.end() != connections_.find(std::make_pair(device_id, app_handle)); @@ -177,7 +169,7 @@ TransportAdapter::Error TransportAdapterImpl::Connect( info.device_id = device_id; info.state = ConnectionInfo::NEW; } - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); if (already_exists) { LOG4CXX_TRACE(logger_, "exit with ALREADY_EXISTS"); return ALREADY_EXISTS; @@ -186,9 +178,9 @@ TransportAdapter::Error TransportAdapterImpl::Connect( const TransportAdapter::Error err = server_connection_factory_->CreateConnection(device_id, app_handle); if (TransportAdapter::OK != err) { - connections_lock_.AcquireForWriting(); + pthread_mutex_lock(&connections_mutex_); connections_.erase(std::make_pair(device_id, app_handle)); - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); } LOG4CXX_TRACE(logger_, "exit with error: " << err); return err; @@ -236,25 +228,20 @@ TransportAdapter::Error TransportAdapterImpl::DisconnectDevice( } Error error = OK; + pthread_mutex_lock(&connections_mutex_); + for (ConnectionMap::iterator it = connections_.begin(); + it != connections_.end(); ++it) { - 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); + 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); + } } } - + pthread_mutex_unlock(&connections_mutex_); LOG4CXX_TRACE(logger_, "exit with error " << error); return error; } @@ -306,23 +293,19 @@ 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_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); DeviceList devices; - sync_primitives::AutoLock locker(devices_mutex_); + pthread_mutex_lock(&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; } @@ -331,7 +314,7 @@ DeviceSptr TransportAdapterImpl::AddDevice(DeviceSptr device) { LOG4CXX_TRACE(logger_, "enter. device: " << device); DeviceSptr existing_device; bool same_device_found = false; - devices_mutex_.Acquire(); + pthread_mutex_lock(&devices_mutex_); for (DeviceMap::const_iterator i = devices_.begin(); i != devices_.end(); ++i) { existing_device = i->second; @@ -344,7 +327,7 @@ DeviceSptr TransportAdapterImpl::AddDevice(DeviceSptr device) { if (!same_device_found) { devices_[device->unique_device_id()] = device; } - devices_mutex_.Release(); + pthread_mutex_unlock(&devices_mutex_); if (same_device_found) { LOG4CXX_TRACE(logger_, "exit with TRUE. Condition: same_device_found"); return existing_device; @@ -369,7 +352,7 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { DeviceSptr device = *it; bool device_found = false; - devices_mutex_.Acquire(); + pthread_mutex_lock(&devices_mutex_); for (DeviceMap::iterator it = devices_.begin(); it != devices_.end(); ++it) { DeviceSptr existing_device = it->second; @@ -380,7 +363,7 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { break; } } - devices_mutex_.Release(); + pthread_mutex_unlock(&devices_mutex_); if (!device_found) { LOG4CXX_INFO(logger_, "Adding new device " << device->unique_device_id() @@ -392,7 +375,7 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { new_devices[device->unique_device_id()] = device; } - connections_lock_.AcquireForReading(); + pthread_mutex_lock(&connections_mutex_); std::set<DeviceUID> connected_devices; for (ConnectionMap::const_iterator it = connections_.begin(); it != connections_.end(); ++it) { @@ -401,10 +384,10 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { connected_devices.insert(info.device_id); } } - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); DeviceMap all_devices = new_devices; - devices_mutex_.Acquire(); + pthread_mutex_lock(&devices_mutex_); for (DeviceMap::iterator it = devices_.begin(); it != devices_.end(); ++it) { DeviceSptr existing_device = it->second; @@ -416,7 +399,7 @@ void TransportAdapterImpl::SearchDeviceDone(const DeviceVector& devices) { } } devices_ = all_devices; - devices_mutex_.Release(); + pthread_mutex_unlock(&devices_mutex_); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { @@ -470,8 +453,9 @@ bool TransportAdapterImpl::IsServerOriginatedConnectSupported() const { } bool TransportAdapterImpl::IsClientOriginatedConnectSupported() const { - LOG4CXX_TRACE(logger_, "IsClientOriginatedConnectSupported"); + LOG4CXX_TRACE(logger_, "enter"); return client_connection_listener_ != 0; + LOG4CXX_TRACE(logger_, "exit"); } void TransportAdapterImpl::ConnectionCreated( @@ -479,13 +463,14 @@ void TransportAdapterImpl::ConnectionCreated( const ApplicationHandle& app_handle) { LOG4CXX_TRACE(logger_, "enter connection:" << connection << ", device_id: " << &device_id << ", app_handle: " << &app_handle); - connections_lock_.AcquireForReading(); + pthread_mutex_lock(&connections_mutex_); 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; - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); + LOG4CXX_TRACE(logger_, "exit"); } void TransportAdapterImpl::DeviceDisconnected( @@ -503,18 +488,17 @@ 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)); } - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); RemoveDevice(device_uid); LOG4CXX_TRACE(logger_, "exit"); @@ -527,7 +511,7 @@ void TransportAdapterImpl::DisconnectDone( LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_uid << ", app_handle: " << &app_uid); bool device_disconnected = true; - connections_lock_.AcquireForReading(); + pthread_mutex_lock(&connections_mutex_); for (ConnectionMap::const_iterator it = connections_.begin(); it != connections_.end(); ++it) { const DeviceUID& current_device_id = it->first.first; @@ -539,7 +523,7 @@ void TransportAdapterImpl::DisconnectDone( break; } } - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { TransportAdapterListener* listener = *it; @@ -548,9 +532,9 @@ void TransportAdapterImpl::DisconnectDone( listener->OnDisconnectDeviceDone(this, device_uid); } } - connections_lock_.AcquireForWriting(); + pthread_mutex_lock(&connections_mutex_); connections_.erase(std::make_pair(device_uid, app_uid)); - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); if (device_disconnected) { RemoveDevice(device_uid); @@ -616,13 +600,14 @@ 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()); - sync_primitives::AutoLock locker(devices_mutex_); + pthread_mutex_lock(&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; } @@ -631,14 +616,14 @@ void TransportAdapterImpl::ConnectDone(const DeviceUID& device_id, const ApplicationHandle& app_handle) { LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); - connections_lock_.AcquireForReading(); + pthread_mutex_lock(&connections_mutex_); 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; } - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { @@ -655,9 +640,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); - connections_lock_.AcquireForWriting(); + pthread_mutex_lock(&connections_mutex_); connections_.erase(std::make_pair(device_uid, app_uid)); - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); for (TransportAdapterListenerList::iterator it = listeners_.begin(); it != listeners_.end(); ++it) { (*it)->OnConnectFailed(this, device_uid, app_uid, error); @@ -689,14 +674,15 @@ void TransportAdapterImpl::ConnectionFinished( const DeviceUID& device_id, const ApplicationHandle& app_handle) { LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); - connections_lock_.AcquireForReading(); + pthread_mutex_lock(&connections_mutex_); ConnectionMap::iterator it = connections_.find(std::make_pair(device_id, app_handle)); if (it != connections_.end()) { ConnectionInfo& info = it->second; info.state = ConnectionInfo::FINALISING; } - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); + LOG4CXX_TRACE(logger_, "exit"); } void TransportAdapterImpl::ConnectionAborted( @@ -782,7 +768,7 @@ Connection* TransportAdapterImpl::FindEstablishedConnection( LOG4CXX_TRACE(logger_, "enter. device_id: " << &device_id << ", app_handle: " << &app_handle); Connection* connection = NULL; - connections_lock_.AcquireForReading(); + pthread_mutex_lock(&connections_mutex_); ConnectionMap::const_iterator it = connections_.find(std::make_pair(device_id, app_handle)); if (it != connections_.end()) { @@ -791,7 +777,7 @@ Connection* TransportAdapterImpl::FindEstablishedConnection( connection = info.connection; } } - connections_lock_.Release(); + pthread_mutex_unlock(&connections_mutex_); LOG4CXX_TRACE(logger_, "exit with Connection: " << connection); return connection; } @@ -834,9 +820,8 @@ TransportAdapter::Error TransportAdapterImpl::ConnectDevice(DeviceSptr device) { } void TransportAdapterImpl::RemoveDevice(const DeviceUID& device_handle) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "Device_handle: " << &device_handle); - sync_primitives::AutoLock locker(devices_mutex_); + LOG4CXX_TRACE(logger_, "enter. device_handle: " << &device_handle); + pthread_mutex_lock(&devices_mutex_); DeviceMap::iterator i = devices_.find( device_handle); //ykazakov: there is no erase for const iterator on QNX if (i != devices_.end()) { @@ -850,6 +835,8 @@ 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 835c2c17ed..ffd1b3d860 100644 --- a/src/components/transport_manager/src/transport_manager_default.cc +++ b/src/components/transport_manager/src/transport_manager_default.cc @@ -43,6 +43,7 @@ #include "transport_manager/bluetooth/bluetooth_transport_adapter.h" #endif +// CUSTOMER_PASA #if defined(USB_SUPPORT) #include "transport_manager/usb/usb_aoa_adapter.h" @@ -71,8 +72,6 @@ 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 @@ -82,6 +81,7 @@ 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 6c3edd7b91..0ee1d3304d 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -32,6 +32,7 @@ #include "transport_manager/transport_manager_impl.h" +#include <pthread.h> #include <stdint.h> #include <cstring> #include <queue> @@ -69,20 +70,22 @@ TransportManagerImpl::Connection TransportManagerImpl::convert( } TransportManagerImpl::TransportManagerImpl() - : is_initialized_(false), + : all_thread_active_(false), + device_listener_thread_wakeup_(), + 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_TRACE(logger_, "TransportManager has created"); + LOG4CXX_INFO(logger_, "=============================================="); + pthread_cond_init(&device_listener_thread_wakeup_, NULL); + LOG4CXX_DEBUG(logger_, "TransportManager object created"); } TransportManagerImpl::~TransportManagerImpl() { LOG4CXX_DEBUG(logger_, "TransportManager object destroying"); - message_queue_.Shutdown(); - event_queue_.Shutdown(); for (std::vector<TransportAdapter*>::iterator it = transport_adapters_.begin(); @@ -96,6 +99,7 @@ TransportManagerImpl::~TransportManagerImpl() { delete it->second; } + pthread_cond_destroy(&device_listener_thread_wakeup_); LOG4CXX_INFO(logger_, "TransportManager object destroyed"); } @@ -222,48 +226,18 @@ 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_AUTO_TRACE(logger_); - if (!is_initialized_) { - LOG4CXX_WARN(logger_, "TransportManager is not initialized_"); + LOG4CXX_TRACE(logger_, "enter"); + if (!all_thread_active_) { + LOG4CXX_TRACE(logger_, + "exit with E_TM_IS_NOT_INITIALIZED. Condition: !all_thread_active_"); return E_TM_IS_NOT_INITIALIZED; } + all_thread_active_ = false; - message_queue_.Shutdown(); - event_queue_.Shutdown(); - - DisconnectAllDevices(); - TerminateAllAdapters(); + pthread_cond_signal(&device_listener_thread_wakeup_); - is_initialized_ = false; + LOG4CXX_TRACE(logger_, "exit with E_SUCCESS"); return E_SUCCESS; } @@ -416,19 +390,12 @@ 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; @@ -511,9 +478,10 @@ void TransportManagerImpl::PostMessage(const ::protocol_handler::RawMessagePtr m } void TransportManagerImpl::PostEvent(const TransportAdapterEvent& event) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "TransportAdapterEvent: " << &event); + LOG4CXX_TRACE(logger_, "enter. 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 1ca1a54b32..103e03a4f6 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 b8096514bc..40891d3513 100644 --- a/src/components/transport_manager/src/usb/libusb/usb_connection.cc +++ b/src/components/transport_manager/src/usb/libusb/usb_connection.cc @@ -30,7 +30,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include <pthread.h> #include <unistd.h> #include <iomanip> @@ -52,7 +51,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 776bb56c5d..eb0ffdb4dc 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,9 +39,7 @@ #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 { @@ -77,16 +75,14 @@ class UsbHandler::ControlTransferSequenceState { UsbHandler::UsbHandler() : shutdown_requested_(false), - thread_(NULL), + thread_(), usb_device_listeners_(), devices_(), transfer_sequences_(), device_handles_to_close_(), libusb_context_(NULL), arrived_callback_handle_(), - left_callback_handle_() { - thread_ = threads::CreateThread("UsbHandler", new UsbHandlerDelegate(this)); -} + left_callback_handle_() {} UsbHandler::~UsbHandler() { shutdown_requested_ = true; @@ -95,15 +91,12 @@ UsbHandler::~UsbHandler() { arrived_callback_handle_); libusb_hotplug_deregister_callback(libusb_context_, left_callback_handle_); } - thread_->stop(); + pthread_join(thread_, 0); 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) { @@ -216,6 +209,11 @@ 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 " @@ -288,12 +286,19 @@ TransportAdapter::Error UsbHandler::Init() { return TransportAdapter::FAIL; } - if (!thread_->start()) { - LOG4CXX_ERROR(logger_, "USB device scanner thread start failed, error code"); + 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); LOG4CXX_TRACE(logger_, - "exit with TransportAdapter::FAIL."); + "exit with TransportAdapter::FAIL. Condition: 0 !== thread_start_error"); 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; } @@ -352,13 +357,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_IN; + libusb_endpoint_direction endpoint_direction; if (transfer->Direction() == UsbControlTransfer::IN) { endpoint_direction = LIBUSB_ENDPOINT_IN; } else if (transfer->Direction() == UsbControlTransfer::OUT) { endpoint_direction = LIBUSB_ENDPOINT_OUT; } else { - NOTREACHED(); + assert(0); } const uint8_t request = transfer->Request(); const uint16_t value = transfer->Value(); @@ -465,16 +470,5 @@ void UsbHandler::ControlTransferSequenceState::Finish() { finished_ = true; } -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 +} // namespace +} // namespace 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 132fe52cae..0f35a16ae7 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 a3844b2e04..db3cac014d 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,7 +60,6 @@ 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_(), @@ -70,6 +69,7 @@ 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,6 +89,8 @@ 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) { @@ -210,7 +212,7 @@ void UsbConnection::OnOutTransfer(usbd_urb* urb) { } } - sync_primitives::AutoLock locker(out_messages_mutex_); + pthread_mutex_lock(&out_messages_mutex_); if (error) { LOG4CXX_ERROR(logger_, "USB out transfer failed"); @@ -232,13 +234,14 @@ 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; } - sync_primitives::AutoLock locker(out_messages_mutex_); + pthread_mutex_lock(&out_messages_mutex_); if (current_out_message_.valid()) { out_messages_.push_back(message); } else { @@ -248,12 +251,13 @@ TransportAdapter::Error UsbConnection::SendData(::protocol_handler::RawMessagePt DataSendError()); } } + pthread_mutex_unlock(&out_messages_mutex_); return TransportAdapter::OK; } void UsbConnection::Finalise() { LOG4CXX_INFO(logger_, "Finalising"); - sync_primitives::AutoLock locker(out_messages_mutex_); + pthread_mutex_lock(&out_messages_mutex_); disconnecting_ = true; usbd_abort_pipe(in_pipe_); usbd_abort_pipe(out_pipe_); @@ -261,6 +265,7 @@ 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 d78b6c8184..7ab36169b1 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 b3ebb104dc..464b9ea35e 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 4562473536..d57391ebcc 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 bddc20dd3c..bf9535941c 100644 --- a/src/components/transport_manager/src/usb/usb_device_scanner.cc +++ b/src/components/transport_manager/src/usb/usb_device_scanner.cc @@ -47,8 +47,7 @@ CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") class AoaInitSequence : public UsbControlTransferSequence { public: AoaInitSequence(); - virtual ~AoaInitSequence() { - } + virtual ~AoaInitSequence() {} private: class AoaGetProtocolRequest; @@ -57,7 +56,7 @@ class AoaInitSequence : public UsbControlTransferSequence { }; void UsbDeviceScanner::OnDeviceArrived(PlatformUsbDevice* device) { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter. PlatformUsbDevice* " << device); if (IsAppleDevice(device)) { SupportedDeviceFound(device); } else { @@ -67,13 +66,13 @@ void UsbDeviceScanner::OnDeviceArrived(PlatformUsbDevice* device) { TurnIntoAccessoryMode(device); } } + LOG4CXX_TRACE(logger_, "exit"); } void UsbDeviceScanner::OnDeviceLeft(PlatformUsbDevice* device) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "PlatformUsbDevice " << device); + LOG4CXX_TRACE(logger_, "enter. PlatformUsbDevice " << device); bool list_changed = false; - devices_mutex_.Acquire(); + pthread_mutex_lock(&devices_mutex_); for (Devices::iterator it = devices_.begin(); it != devices_.end(); ++it) { if (device == *it) { devices_.erase(it); @@ -81,22 +80,24 @@ void UsbDeviceScanner::OnDeviceLeft(PlatformUsbDevice* device) { break; } } - devices_mutex_.Release(); + pthread_mutex_unlock(&devices_mutex_); if (list_changed) { UpdateList(); } + LOG4CXX_TRACE(logger_, "exit"); } UsbDeviceScanner::UsbDeviceScanner(TransportAdapterController* controller) - : controller_(controller) { + : controller_(controller) { + pthread_mutex_init(&devices_mutex_, 0); } UsbDeviceScanner::~UsbDeviceScanner() { + pthread_mutex_destroy(&devices_mutex_); } class AoaInitSequence::AoaGetProtocolRequest : public UsbControlInTransfer { - virtual ~AoaGetProtocolRequest() { - } + virtual ~AoaGetProtocolRequest() {} virtual RequestType Type() const { return VENDOR; } @@ -114,7 +115,7 @@ class AoaInitSequence::AoaGetProtocolRequest : public UsbControlInTransfer { } virtual bool OnCompleted(unsigned char* data) const { const int protocol_version = data[1] << 8 | data[0]; - LOG4CXX_DEBUG(logger_, "AOA protocol version " << protocol_version); + LOG4CXX_INFO(logger_, "AOA protocol version " << protocol_version); if (protocol_version == 0) { // AOA protocol not supported return false; @@ -126,14 +127,10 @@ 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; } @@ -158,8 +155,7 @@ class AoaInitSequence::AoaSendIdString : public UsbControlOutTransfer { }; class AoaInitSequence::AoaTurnIntoAccessoryMode : public UsbControlOutTransfer { - virtual ~AoaTurnIntoAccessoryMode() { - } + virtual ~AoaTurnIntoAccessoryMode() {} virtual RequestType Type() const { return VENDOR; } @@ -187,8 +183,7 @@ 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))); @@ -200,26 +195,25 @@ AoaInitSequence::AoaInitSequence() } void UsbDeviceScanner::TurnIntoAccessoryMode(PlatformUsbDevice* device) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_DEBUG(logger_, "PlatformUsbDevice: " << device); + LOG4CXX_TRACE(logger_, "enter. PlatformUsbDevice: " << device); GetUsbHandler()->StartControlTransferSequence(new AoaInitSequence, device); + LOG4CXX_TRACE(logger_, "exit"); } void UsbDeviceScanner::SupportedDeviceFound(PlatformUsbDevice* device) { - LOG4CXX_AUTO_TRACE(logger_); - LOG4CXX_TRACE(logger_, "PlatformUsbDevice: " << device); + LOG4CXX_TRACE(logger_, "enter PlatformUsbDevice: " << device); - devices_mutex_.Acquire(); + pthread_mutex_lock(&devices_mutex_); devices_.push_back(device); - 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()); + 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()); UpdateList(); + LOG4CXX_TRACE(logger_, "exit"); } TransportAdapter::Error UsbDeviceScanner::Init() { @@ -231,28 +225,30 @@ TransportAdapter::Error UsbDeviceScanner::Scan() { } void UsbDeviceScanner::UpdateList() { - LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_TRACE(logger_, "enter"); DeviceVector device_vector; - devices_mutex_.Acquire(); + pthread_mutex_lock(&devices_mutex_); 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(); + << (*it)->GetSerialNumber() << ":" + << static_cast<int>((*it)->bus_number()) << ":" + << static_cast<int>((*it)->address()); const DeviceUID device_uid = oss.str(); DeviceSptr device(new UsbDevice(*it, device_name, device_uid)); device_vector.push_back(device); } - devices_mutex_.Release(); + pthread_mutex_unlock(&devices_mutex_); - LOG4CXX_DEBUG(logger_, "USB search done " << device_vector.size()); + LOG4CXX_INFO(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; |