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