From b35608fb9048ba96bc0806c8b1d07feb3203cca1 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 18 May 2016 20:48:42 +0900 Subject: [PATCH 01/16] sensord: add lock in permission_checker functions Change-Id: I1969e07d02482f44d6db810b3c33b17b4282d28d Signed-off-by: kibak.yoon --- src/server/permission_checker.cpp | 6 ++++++ src/server/permission_checker.h | 13 ++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/server/permission_checker.cpp b/src/server/permission_checker.cpp index e2ed12e..e811217 100644 --- a/src/server/permission_checker.cpp +++ b/src/server/permission_checker.cpp @@ -77,6 +77,8 @@ permission_checker& permission_checker::get_instance() void permission_checker::init() { + AUTOLOCK(m_mutex); + m_permission_infos.push_back(std::make_shared (SENSOR_PERMISSION_STANDARD, false, "")); m_permission_infos.push_back(std::make_shared (SENSOR_PERMISSION_BIO, true, "http://tizen.org/privilege/healthinfo")); @@ -96,6 +98,8 @@ void permission_checker::init() void permission_checker::deinit() { + AUTOLOCK(m_mutex); + if (cynara_env) cynara_finish(cynara_env); @@ -104,6 +108,8 @@ void permission_checker::deinit() int permission_checker::get_permission(int sock_fd) { + AUTOLOCK(m_mutex); + int permission = SENSOR_PERMISSION_NONE; for (unsigned int i = 0; i < m_permission_infos.size(); ++i) { diff --git a/src/server/permission_checker.h b/src/server/permission_checker.h index 53fa3b6..cf9f444 100644 --- a/src/server/permission_checker.h +++ b/src/server/permission_checker.h @@ -20,11 +20,17 @@ #ifndef _PERMISSION_CHECKER_H_ #define _PERMISSION_CHECKER_H_ +#include #include #include #include class permission_checker { +public: + static permission_checker& get_instance(); + + int get_permission(int sock_fd); + private: class permission_info { public: @@ -49,13 +55,10 @@ private: void init(); void deinit(); +private: permission_info_vector m_permission_infos; int m_permission_set; - -public: - static permission_checker& get_instance(); - - int get_permission(int sock_fd); + cmutex m_mutex; }; #endif /* _PERMISSION_CHECKER_H_ */ -- 2.7.4 From 7d2a17a88bd73eb9afa5b0279156df1710b054c2 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 18 May 2016 20:52:46 +0900 Subject: [PATCH 02/16] sensord: add log message in destructor of sensors - add NULL check in get_name() in physical_sensor Change-Id: Idef67bd894d46e141a674302415893015131437e Signed-off-by: kibak.yoon --- src/sensor/hrm/hrm_sensor.cpp | 1 + src/server/physical_sensor.cpp | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sensor/hrm/hrm_sensor.cpp b/src/sensor/hrm/hrm_sensor.cpp index aa48965..d29ff49 100644 --- a/src/sensor/hrm/hrm_sensor.cpp +++ b/src/sensor/hrm/hrm_sensor.cpp @@ -30,4 +30,5 @@ hrm_sensor::hrm_sensor() hrm_sensor::~hrm_sensor() { + _I("hrm_sensor is destroyed : %#x", this); } diff --git a/src/server/physical_sensor.cpp b/src/server/physical_sensor.cpp index 689ffed..b16561d 100644 --- a/src/server/physical_sensor.cpp +++ b/src/server/physical_sensor.cpp @@ -32,6 +32,7 @@ physical_sensor::physical_sensor() physical_sensor::~physical_sensor() { + _I("physical sensor is destroyed"); } void physical_sensor::set_sensor_info(const sensor_info_t *info) @@ -56,8 +57,8 @@ unsigned int physical_sensor::get_event_type(void) const char* physical_sensor::get_name(void) { - if (!m_info->name) - return UNKNOWN_NAME; + retv_if(!m_info, UNKNOWN_NAME); + retv_if(!m_info->name, UNKNOWN_NAME); return m_info->name; } -- 2.7.4 From a4d0c2a85e73a0fdba0b46a61aa5926c16bcca94 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 18 May 2016 20:56:26 +0900 Subject: [PATCH 03/16] sensord: add stop() in event_dispatcher thread - because sensord can be shutdown, event_dispatcher can be stopped. Change-Id: Idd59e0f34dad468c3f4a32d3a47e4329cdec0936 Signed-off-by: kibak.yoon --- src/server/sensor_event_dispatcher.cpp | 26 ++++++++++++++++++-------- src/server/sensor_event_dispatcher.h | 2 ++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/server/sensor_event_dispatcher.cpp b/src/server/sensor_event_dispatcher.cpp index 200cc95..c1fc3cb 100644 --- a/src/server/sensor_event_dispatcher.cpp +++ b/src/server/sensor_event_dispatcher.cpp @@ -30,6 +30,7 @@ using std::pair; #define MAX_PENDING_CONNECTION 32 sensor_event_dispatcher::sensor_event_dispatcher() +: m_running(false) { } @@ -45,12 +46,21 @@ sensor_event_dispatcher& sensor_event_dispatcher::get_instance() bool sensor_event_dispatcher::run(void) { + m_running = true; + thread dispatcher(&sensor_event_dispatcher::dispatch_event, this); dispatcher.detach(); return true; } +bool sensor_event_dispatcher::stop(void) +{ + m_running = false; + + return true; +} + void sensor_event_dispatcher::accept_event_channel(csocket client_socket) { int client_id; @@ -99,7 +109,7 @@ void sensor_event_dispatcher::dispatch_event(void) _I("Event Dispatcher started"); - while (true) { + while (m_running) { void *seed_event = get_event_queue().pop(); vector sensor_events; @@ -273,6 +283,9 @@ bool sensor_event_dispatcher::add_active_virtual_sensor(virtual_sensor *sensor) { AUTOLOCK(m_active_virtual_sensors_mutex); + if (!m_running) + return true; + if (has_active_virtual_sensor(sensor)) { _E("[%s] sensor is already added on active virtual sensors", sensor->get_name()); return false; @@ -287,14 +300,11 @@ bool sensor_event_dispatcher::delete_active_virtual_sensor(virtual_sensor *senso { AUTOLOCK(m_active_virtual_sensors_mutex); - auto it_v_sensor = find(m_active_virtual_sensors.begin(), m_active_virtual_sensors.end(), sensor); - - if (it_v_sensor == m_active_virtual_sensors.end()) { - _E("Fail to delete non-existent [%s] sensor on active virtual sensors", sensor->get_name()); - return false; - } + if (!m_running) + return true; - m_active_virtual_sensors.erase(it_v_sensor); + if (sensor) + m_active_virtual_sensors.remove(sensor); return true; } diff --git a/src/server/sensor_event_dispatcher.h b/src/server/sensor_event_dispatcher.h index 243fb70..ee7e630 100644 --- a/src/server/sensor_event_dispatcher.h +++ b/src/server/sensor_event_dispatcher.h @@ -37,6 +37,7 @@ public: static sensor_event_dispatcher& get_instance(); bool run(void); + bool stop(void); void accept_event_connections(csocket client_socket); void request_last_event(int client_id, sensor_id_t sensor_id); @@ -51,6 +52,7 @@ private: event_type_last_event_map m_last_events; virtual_sensors m_active_virtual_sensors; cmutex m_active_virtual_sensors_mutex; + bool m_running; sensor_event_dispatcher(); ~sensor_event_dispatcher(); -- 2.7.4 From bbdde42c7d0095ae7aa0da3622bdb30fd474d7b6 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 18 May 2016 21:04:48 +0900 Subject: [PATCH 04/16] sensord: set signal fd to poller for knowing what signal is received - delete fds which is added to poller when event_poller is destroyed. Change-Id: I098326f609b215e448c92420d88cfa7616d8f9c9 Signed-off-by: kibak.yoon --- src/server/sensor_event_poller.cpp | 24 ++++++++++++++++++++++-- src/server/sensor_event_poller.h | 10 +++++++--- src/shared/poller.cpp | 32 +++++++++++++++++++++++++++++--- src/shared/poller.h | 8 ++++++++ 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/server/sensor_event_poller.cpp b/src/server/sensor_event_poller.cpp index 1327b44..994c1f0 100644 --- a/src/server/sensor_event_poller.cpp +++ b/src/server/sensor_event_poller.cpp @@ -17,21 +17,27 @@ * */ -#include +#include +#include #include #include #include #include #include +#include sensor_event_poller::sensor_event_poller() { init_sensor_map(); init_fd(); + init_signal_fd(); } sensor_event_poller::~sensor_event_poller() { + fd_sensors_t::iterator it; + for (it = m_fd_sensors.begin(); it != m_fd_sensors.end(); it = m_fd_sensors.upper_bound(it->first)) + m_poller.del_fd(it->first); } void sensor_event_poller::init_sensor_map() @@ -58,7 +64,7 @@ void sensor_event_poller::init_sensor_map() } } -void sensor_event_poller::init_fd() +void sensor_event_poller::init_fd(void) { fd_sensors_t::iterator it; for (it = m_fd_sensors.begin(); it != m_fd_sensors.end(); it = m_fd_sensors.upper_bound(it->first)) { @@ -67,6 +73,20 @@ void sensor_event_poller::init_fd() } } +void sensor_event_poller::init_signal_fd(void) +{ + int sfd; + sigset_t mask; + + sigemptyset(&mask); + sigaddset(&mask, SIGTERM); + sigaddset(&mask, SIGABRT); + sigaddset(&mask, SIGINT); + + sfd = signalfd(-1, &mask, 0); + m_poller.add_signal_fd(sfd); +} + bool sensor_event_poller::add_poll_fd(int fd) { return m_poller.add_fd(fd); diff --git a/src/server/sensor_event_poller.h b/src/server/sensor_event_poller.h index 03e5a59..c6c9ade 100644 --- a/src/server/sensor_event_poller.h +++ b/src/server/sensor_event_poller.h @@ -31,13 +31,17 @@ public: sensor_event_poller(); virtual ~sensor_event_poller(); - bool poll(); + bool poll(void); + private: poller m_poller; fd_sensors_t m_fd_sensors; - void init_fd(); - void init_sensor_map(); +private: + void init_sensor_map(void); + void init_fd(void); + void init_signal_fd(void); + bool add_poll_fd(int fd); bool read_fd(int fd, std::vector &ids); bool process_event(int fd, const std::vector &ids); diff --git a/src/shared/poller.cpp b/src/shared/poller.cpp index b1a3ded..8e05af8 100644 --- a/src/shared/poller.cpp +++ b/src/shared/poller.cpp @@ -25,6 +25,7 @@ poller::poller() : m_epfd(-1) +, sfd(-1) { init_poll_fd(); } @@ -38,8 +39,8 @@ poller::poller(int fd) poller::~poller() { - if (m_epfd) - close(m_epfd); + if (m_epfd >= 0) + ::close(m_epfd); } void poller::init_poll_fd(void) @@ -47,6 +48,12 @@ void poller::init_poll_fd(void) m_epfd = epoll_create(EPOLL_MAX); } +bool poller::add_signal_fd(int fd) +{ + sfd = fd; + return add_fd(fd); +} + bool poller::add_fd(int fd) { struct epoll_event event; @@ -62,6 +69,20 @@ bool poller::add_fd(int fd) return true; } +bool poller::del_fd(int fd) +{ + struct epoll_event event; + + event.data.fd = fd; + + if (epoll_ctl(m_epfd, EPOLL_CTL_DEL, fd, &event)) { + _ERRNO(errno, _E, "Failed to del fd[%d]", fd); + return false; + } + + return true; +} + bool poller::fill_event_queue(void) { const int EPOLL_MAX_EVENT = 1; @@ -82,7 +103,7 @@ bool poller::fill_event_queue(void) return false; } - for (int i = 0; i < nr_events; i++) + for (int i = 0; i < nr_events; i++) m_event_queue.push(event_items[i]); return true; @@ -110,6 +131,11 @@ bool poller::poll(struct epoll_event &event) return false; } + if (event.data.fd == sfd) { + _E("received signal"); + return false; + } + return true; } } diff --git a/src/shared/poller.h b/src/shared/poller.h index b43d491..e61408d 100644 --- a/src/shared/poller.h +++ b/src/shared/poller.h @@ -31,12 +31,20 @@ public: poller(int fd); virtual ~poller(); + bool add_signal_fd(int fd); + bool add_fd(int fd); + bool del_fd(int fd); + bool poll(struct epoll_event &event); + private: int m_epfd; + int sfd; + std::queue m_event_queue; +private: void init_poll_fd(void); bool fill_event_queue(void); }; -- 2.7.4 From d028b7e131090c0693a4b0093cc223dd5c448b8f Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 18 May 2016 21:17:24 +0900 Subject: [PATCH 05/16] sensord: change raw pointer to shared pointer for managing device(HAL) handles - erase items in map and dlclose so handle in destructor explicitly Change-Id: I8c7e8359fe9741b31f857e127c3a8e2a192df1c7 Signed-off-by: kibak.yoon --- src/server/sensor_loader.cpp | 22 +++++++++++++--------- src/server/sensor_loader.h | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/server/sensor_loader.cpp b/src/server/sensor_loader.cpp index d5961c8..f82856f 100644 --- a/src/server/sensor_loader.cpp +++ b/src/server/sensor_loader.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -58,8 +59,14 @@ sensor_loader::sensor_loader() sensor_loader::~sensor_loader() { - for (auto it = m_handles.begin(); it != m_handles.end(); ++it) - dlclose(*it); + sensor_device_map_t::iterator it_device; + std::vector::iterator it_handle; + + for (it_device = m_devices.begin(); it_device != m_devices.end();) + it_device = m_devices.erase(it_device); + + for (it_handle = m_handles.begin(); it_handle != m_handles.end(); ++it_handle) + dlclose(*it_handle); m_handles.clear(); } @@ -136,10 +143,11 @@ bool sensor_loader::load_sensor_devices(const string &path, void* &handle) for (int i = 0; i < device_size; ++i) { device = static_cast(_devices[i]); + std::shared_ptr device_ptr(device); - int info_size = device->get_sensors(&infos); + int info_size = device_ptr->get_sensors(&infos); for (int j = 0; j < info_size; ++j) - m_devices[&infos[j]] = device; + m_devices[&infos[j]] = device_ptr; } handle = _handle; @@ -187,9 +195,7 @@ void sensor_loader::create_physical_sensors(sensor_type_t type) for (it = m_devices.begin(); it != m_devices.end(); ++it) { info = it->first; - device = it->second; - if (m_devices[info] == NULL) - continue; + device = it->second.get(); if (type != UNKNOWN_SENSOR) { if (type != (sensor_type_t)(info->type)) @@ -214,8 +220,6 @@ void sensor_loader::create_physical_sensors(sensor_type_t type) m_sensors.insert(std::make_pair(_type, sensor_ptr)); _I("created [%s] sensor", sensor->get_name()); - - m_devices[info] = NULL; } } diff --git a/src/server/sensor_loader.h b/src/server/sensor_loader.h index ef659e3..486effe 100644 --- a/src/server/sensor_loader.h +++ b/src/server/sensor_loader.h @@ -36,7 +36,7 @@ class sensor_base; typedef std::multimap> sensor_map_t; -typedef std::map sensor_device_map_t; +typedef std::map> sensor_device_map_t; class sensor_loader { private: -- 2.7.4 From c79d9e3bae93607767ad89c6e627dcd6bb9bda79 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 19 May 2016 11:54:06 +0900 Subject: [PATCH 06/16] sensord: auto_rotation: fix interval setting in auto_rotation - use interval instead of m_interval Change-Id: I8ae7d1371f8b9e4c7110f1caf4b7541f45c239ea Signed-off-by: kibak.yoon --- src/sensor/auto_rotation/auto_rotation_sensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sensor/auto_rotation/auto_rotation_sensor.cpp b/src/sensor/auto_rotation/auto_rotation_sensor.cpp index 335d41e..b3f0784 100644 --- a/src/sensor/auto_rotation/auto_rotation_sensor.cpp +++ b/src/sensor/auto_rotation/auto_rotation_sensor.cpp @@ -178,7 +178,7 @@ int auto_rotation_sensor::get_data(sensor_data_t **data, int *length) bool auto_rotation_sensor::set_interval(unsigned long interval) { - m_accel_sensor->add_interval((intptr_t)this , m_interval, true); + m_accel_sensor->add_interval((intptr_t)this , interval, true); m_interval = interval; return false; -- 2.7.4 From f3957f2da642de9571cce3c18b7242c22684707a Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 19 May 2016 11:54:50 +0900 Subject: [PATCH 07/16] sensord: terminate sensor daemon safely - checking event by using select() before accept() if event is accepted when sensord is terminating, restoring connection has a problem that client cannot connect to sensord. - in server, quit g_main_loop and close socket safely. - sensord.service : off restart option Change-Id: Ibb2c9eca3cdc26b9782e93d3a3e0337b0a28f1a0 Signed-off-by: kibak.yoon --- packaging/sensord.service | 2 - src/server/main.cpp | 12 ++-- src/server/server.cpp | 136 ++++++++++++++++++++++++++++++++++------------ src/server/server.h | 21 ++++++- src/shared/csocket.cpp | 48 +++++++++++++--- src/shared/csocket.h | 1 + 6 files changed, 168 insertions(+), 52 deletions(-) diff --git a/packaging/sensord.service b/packaging/sensord.service index 50dc0ad..5cb2e72 100644 --- a/packaging/sensord.service +++ b/packaging/sensord.service @@ -6,8 +6,6 @@ User=sensor Group=input Type=notify ExecStart=/usr/bin/sensord -Restart=always -RestartSec=0 MemoryLimit=20M Sockets=sensord_command.socket Sockets=sensord_event.socket diff --git a/src/server/main.cpp b/src/server/main.cpp index 2ef0bfa..b136d69 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -34,8 +34,7 @@ static void sig_term_handler(int signo, siginfo_t *info, void *data) _E("Received SIGTERM(%d) from %s(%d)\n", signo, proc_name, info->si_pid); - /* TODO: Refactoring */ - raise(SIGKILL); + server::get_instance().stop(); } static void signal_init(void) @@ -51,6 +50,8 @@ static void signal_init(void) sig_act.sa_sigaction = sig_term_handler; sig_act.sa_flags = SA_SIGINFO; sigaction(SIGTERM, &sig_act, NULL); + sigaction(SIGABRT, &sig_act, NULL); + sigaction(SIGINT, &sig_act, NULL); } static void set_cal_data(void) @@ -63,7 +64,9 @@ static void set_cal_data(void) } fprintf(fp, "%d", SET_CAL); - fclose(fp); + + if (fp) + fclose(fp); _I("Succeeded to set calibration data"); @@ -78,12 +81,13 @@ int main(int argc, char *argv[]) set_cal_data(); + /* TODO: loader has to be moved to server */ sensor_loader::get_instance().load(); server::get_instance().run(); - server::get_instance().stop(); _I("Sensord terminated"); + return 0; } diff --git a/src/server/server.cpp b/src/server/server.cpp index 7a5e416..184df3d 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -17,14 +17,17 @@ * */ +#include +#include + #include #include #include #include #include #include -#include #include +#include #define SYSTEMD_SOCKET_MAX 2 @@ -32,12 +35,12 @@ using std::thread; server::server() : m_mainloop(NULL) +, m_running(false) { } server::~server() { - stop(); } int server::get_systemd_socket(const char *name) @@ -73,46 +76,77 @@ int server::get_systemd_socket(const char *name) void server::accept_command_channel(void) { command_worker *cmd_worker; + _I("Command channel acceptor is started"); - while (true) { + while (m_running) { csocket client_command_socket; + if (!m_command_channel_accept_socket.is_valid()) { + _E("Failed to accept, event_channel_accept_socket is closed"); + break; + } + if (!m_command_channel_accept_socket.accept(client_command_socket)) { _E("Failed to accept command channel from a client"); continue; } + if (!m_running) { + _E("server die"); + break; + } + _D("New client (socket_fd : %d) connected", client_command_socket.get_socket_fd()); + /* TODO: if socket is closed, it should be erased */ + client_command_sockets.push_back(client_command_socket); + cmd_worker = new(std::nothrow) command_worker(client_command_socket); if (!cmd_worker) { _E("Failed to allocate memory"); - continue; + break; } if (!cmd_worker->start()) delete cmd_worker; } + + _I("Command channel acceptor is terminated"); } void server::accept_event_channel(void) { - _I("Event channel acceptor is started"); + _I("Event channel acceptor is started!"); - while (true) { + while (m_running) { csocket client_event_socket; + if (!m_event_channel_accept_socket.is_valid()) { + _E("Failed to accept, event_channel_accept_socket is closed"); + break; + } + if (!m_event_channel_accept_socket.accept(client_event_socket)) { _E("Failed to accept event channel from a client"); continue; } + if (!m_running) { + _E("server die"); + break; + } + + /* TODO: if socket is closed, it should be erased */ + client_event_sockets.push_back(client_event_socket); + _D("New client(socket_fd : %d) connected", client_event_socket.get_socket_fd()); sensor_event_dispatcher::get_instance().accept_event_connections(client_event_socket); } + + _I("Event channel acceptor is terminated"); } void server::poll_event(void) @@ -127,32 +161,6 @@ void server::poll_event(void) } } -void server::run(void) -{ - m_mainloop = g_main_loop_new(NULL, false); - - sensor_event_dispatcher::get_instance().run(); - - listen_command_channel(); - listen_event_channel(); - - thread event_channel_accepter(&server::accept_event_channel, this); - event_channel_accepter.detach(); - - thread command_channel_accepter(&server::accept_command_channel, this); - command_channel_accepter.detach(); - - thread event_poller(&server::poll_event, this); - event_poller.detach(); - - sd_notify(0, "READY=1"); - - g_main_loop_run(m_mainloop); - g_main_loop_unref(m_mainloop); - - return; -} - bool server::listen_command_channel(void) { int sock_fd = -1; @@ -221,13 +229,69 @@ bool server::listen_event_channel(void) return true; } -void server::stop(void) +void server::close_socket(void) { - if (m_mainloop) - g_main_loop_quit(m_mainloop); - m_command_channel_accept_socket.close(); m_event_channel_accept_socket.close(); + + for (int i = 0; i < client_command_sockets.size(); ++i) + client_command_sockets[i].close(); + + for (int i = 0; i < client_event_sockets.size(); ++i) + client_event_sockets[i].close(); + + client_command_sockets.clear(); + client_event_sockets.clear(); +} + +void server::initialize(void) +{ + m_running = true; + m_mainloop = g_main_loop_new(NULL, false); + + sensor_event_dispatcher::get_instance().run(); + + listen_command_channel(); + listen_event_channel(); + + std::thread event_channel_accepter(&server::accept_event_channel, this); + event_channel_accepter.detach(); + + std::thread command_channel_accepter(&server::accept_command_channel, this); + command_channel_accepter.detach(); + + std::thread event_poller(&server::poll_event, this); + event_poller.detach(); + + sd_notify(0, "READY=1"); + + g_main_loop_run(m_mainloop); +} + +void server::terminate(void) +{ + sensor_event_dispatcher::get_instance().stop(); + + close_socket(); +} + +void server::run(void) +{ + initialize(); + terminate(); +} + +void server::stop(void) +{ + _I("Sensord server stopped"); + + m_running = false; + + if (m_mainloop) { + g_main_loop_quit(m_mainloop); + g_main_loop_unref(m_mainloop); + m_mainloop = NULL; + } } server& server::get_instance() diff --git a/src/server/server.h b/src/server/server.h index 3f32b3f..3dbd0d4 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -22,23 +22,35 @@ #include #include +#include +#include class server { public: + static server& get_instance(); + +public: void run(void); void stop(void); - static server& get_instance(); private: GMainLoop *m_mainloop; csocket m_command_channel_accept_socket; csocket m_event_channel_accept_socket; + std::vector client_command_sockets; + std::vector client_event_sockets; + + bool m_running; + +private: server(); - ~server(); + virtual ~server(); + + void initialize(void); + void terminate(void); void poll_event(void); - void accept_client(void); bool listen_command_channel(void); bool listen_event_channel(void); @@ -46,6 +58,9 @@ private: void accept_command_channel(void); void accept_event_channel(void); + void close_socket(void); + + /* TODO: move to socket class */ int get_systemd_socket(const char *name); }; diff --git a/src/shared/csocket.cpp b/src/shared/csocket.cpp index 8481333..4a01a38 100644 --- a/src/shared/csocket.cpp +++ b/src/shared/csocket.cpp @@ -130,9 +130,46 @@ bool csocket::listen(const int max_connections) bool csocket::accept(csocket& client_socket) const { + const int TIMEOUT = 1; + struct timeval tv; int addr_length = sizeof(m_addr); int err = 0; + fd_set read_fds; + + while (true) { + FD_ZERO(&read_fds); + FD_SET(m_sock_fd, &read_fds); + + tv.tv_sec = TIMEOUT; + tv.tv_usec = 0; + + err = ::select(m_sock_fd + 1, &read_fds, NULL, NULL, &tv); + if (err == -1) { + _ERRNO(errno, _E, "Failed to select(), m_sock_fd : %d", m_sock_fd); + return false; + } + + if (!is_valid()) { + _E("socket is closed, m_sock_fd : %d", m_sock_fd); + return false; + } + + /* timeout */ + if (!err) + continue; + + if (FD_ISSET(m_sock_fd, &read_fds)) + break; + + _ERRNO(errno, _E, "Failed to select(), msock_fd : %d", m_sock_fd); + } + + if (!is_valid()) { + _E("socket is closed, m_sock_fd : %d", m_sock_fd); + return false; + } + do { client_socket.m_sock_fd = ::accept(m_sock_fd, (sockaddr *)&m_addr, (socklen_t *)&addr_length); if (!client_socket.is_valid()) @@ -169,7 +206,7 @@ ssize_t csocket::recv_for_seqpacket(void* buffer, size_t size) const ssize_t err, len; do { - len = ::recv(m_sock_fd, buffer, size, m_recv_flags); + len = ::recv(m_sock_fd, buffer, size, m_recv_flags); if (len > 0) { err = 0; @@ -180,20 +217,17 @@ ssize_t csocket::recv_for_seqpacket(void* buffer, size_t size) const } else { err = errno; } - } while (err == EINTR); + } while (err == EINTR); - if ((err == EAGAIN) || (err == EWOULDBLOCK)) { - _ERRNO(err, _D, "Failed to recv(%d, %#x, %d, %#x) = %d", - m_socket_fd, buffer, size, m_recv_flags, len); + if ((err == EAGAIN) || (err == EWOULDBLOCK)) return 0; - } if (err) { _ERRNO(err, _E, "Failed to recv(%d, %#x, %d, %#x) = %d", m_sock_fd, buffer, size, m_recv_flags, len); } - return err == 0 ? len : -err; + return err == 0 ? len : -err; } ssize_t csocket::send_for_stream(const void *buffer, size_t size) const diff --git a/src/shared/csocket.h b/src/shared/csocket.h index 55582cf..1391531 100644 --- a/src/shared/csocket.h +++ b/src/shared/csocket.h @@ -69,6 +69,7 @@ private: ssize_t recv_for_seqpacket(void* buffer, size_t size) const; ssize_t recv_for_stream(void* buffer, size_t size) const; +private: int m_sock_fd; int m_sock_type; sockaddr_un m_addr; -- 2.7.4 From 4df48dbdb373f3b02bb9a1e05858f26847d0d18e Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 19 May 2016 13:11:32 +0900 Subject: [PATCH 08/16] sensord: set cynara configuration for cache size - cynara cache size : 16 Change-Id: Ia28f3b0da49a731ff2fa7493800482cdd08e77ad Signed-off-by: kibak.yoon --- src/server/permission_checker.cpp | 29 +++++++++++++++++++++++++++-- src/server/permission_checker.h | 6 ++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/server/permission_checker.cpp b/src/server/permission_checker.cpp index e811217..b8ece6e 100644 --- a/src/server/permission_checker.cpp +++ b/src/server/permission_checker.cpp @@ -25,6 +25,8 @@ #include #include +#define CACHE_SIZE 16 + static cynara *cynara_env = NULL; static bool check_privilege_by_sockfd(int sock_fd, const char *priv) @@ -90,10 +92,33 @@ void permission_checker::init() _I("Permission Set = %d", m_permission_set); - if (cynara_initialize(&cynara_env, NULL) != CYNARA_API_SUCCESS) { + init_cynara(); +} + +void permission_checker::init_cynara(void) +{ + cynara_configuration *conf; + + int err = cynara_configuration_create(&conf); + retm_if(err != CYNARA_API_SUCCESS, "Failed to create cynara configuration"); + + err = cynara_configuration_set_cache_size(conf, CACHE_SIZE); + if (err != CYNARA_API_SUCCESS) { + _E("Failed to set cynara cache"); + cynara_configuration_destroy(conf); + return; + } + + err = cynara_initialize(&cynara_env, conf); + cynara_configuration_destroy(conf); + + if (err != CYNARA_API_SUCCESS) { + _E("Failed to initialize cynara"); cynara_env = NULL; - _E("Cynara initialization failed"); + return; } + + _I("Cynara initialized"); } void permission_checker::deinit() diff --git a/src/server/permission_checker.h b/src/server/permission_checker.h index cf9f444..c7ccbb0 100644 --- a/src/server/permission_checker.h +++ b/src/server/permission_checker.h @@ -52,13 +52,15 @@ private: permission_checker(permission_checker const&) {}; permission_checker& operator=(permission_checker const&); - void init(); - void deinit(); + void init(void); + void deinit(void); private: permission_info_vector m_permission_infos; int m_permission_set; cmutex m_mutex; + + void init_cynara(void); }; #endif /* _PERMISSION_CHECKER_H_ */ -- 2.7.4 From 623b2709f08ef52a518cdc4b5ed68ce059d8b215 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 23 May 2016 15:46:30 +0900 Subject: [PATCH 09/16] sensord:fix compiler warnings due to the comparison of the signed and unsigned int -Wsign-compare Change-Id: I0f1b785c38aa3972a0b3fc249cf02f532d05d3e3 Signed-off-by: kibak.yoon --- src/server/server.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/server.cpp b/src/server/server.cpp index 184df3d..fb5882d 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -234,10 +234,10 @@ void server::close_socket(void) m_command_channel_accept_socket.close(); m_event_channel_accept_socket.close(); - for (int i = 0; i < client_command_sockets.size(); ++i) + for (unsigned int i = 0; i < client_command_sockets.size(); ++i) client_command_sockets[i].close(); - for (int i = 0; i < client_event_sockets.size(); ++i) + for (unsigned int i = 0; i < client_event_sockets.size(); ++i) client_event_sockets[i].close(); client_command_sockets.clear(); -- 2.7.4 From 6bf96b7ef2285273a6b546b47efa5a221ffc81a8 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 23 May 2016 15:44:33 +0900 Subject: [PATCH 10/16] sensord: version up 2.0.5 Change-Id: I7502e5b53f45ccfdd35a25b11df337f242730c37 Signed-off-by: kibak.yoon --- packaging/sensord.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/sensord.spec b/packaging/sensord.spec index c3f0488..d4eb4ef 100644 --- a/packaging/sensord.spec +++ b/packaging/sensord.spec @@ -1,6 +1,6 @@ Name: sensord Summary: Sensor daemon -Version: 2.0.4 +Version: 2.0.5 Release: 0 Group: System/Sensor Framework License: Apache-2.0 -- 2.7.4 From c7bcb3067de0ce4d7039cb3e417d1089516bc894 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 23 May 2016 21:47:05 +0900 Subject: [PATCH 11/16] sensord: fix default interval when there is no client which registers event - POLL_MAX_HZ_MS is too big, so it has to be changed to POLL_10HZ_MS(default) Change-Id: I611c0983c601c02ab822b700efda4153dcb6a420 Signed-off-by: kibak.yoon --- src/client/sensor_handle_info.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/sensor_handle_info.cpp b/src/client/sensor_handle_info.cpp index 99647d7..69ccac4 100644 --- a/src/client/sensor_handle_info.cpp +++ b/src/client/sensor_handle_info.cpp @@ -130,7 +130,7 @@ void sensor_handle_info::get_batch(unsigned int &interval, unsigned int &latency { if (m_reg_event_infos.empty()) { _D("No events are registered for client %s", get_client_name()); - interval = POLL_MAX_HZ_MS; + interval = POLL_10HZ_MS; latency = 0; return; } -- 2.7.4 From b50978051344e9ade9353dbda38cee331817235c Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Tue, 24 May 2016 13:18:19 +0900 Subject: [PATCH 12/16] sensord: add/remove useless spaces for code style Change-Id: Idae508f8b763a3b2674c1e121dce42b289c46fd4 Signed-off-by: kibak.yoon --- src/client/sensor_handle_info.cpp | 2 +- src/client/sensor_internal_deprecated.h | 2 +- src/server/client_info_manager.cpp | 2 +- src/server/sensor_loader.cpp | 2 +- src/server/sensor_usage.cpp | 2 +- src/shared/csocket.cpp | 4 +++- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/client/sensor_handle_info.cpp b/src/client/sensor_handle_info.cpp index 69ccac4..6dc1984 100644 --- a/src/client/sensor_handle_info.cpp +++ b/src/client/sensor_handle_info.cpp @@ -81,7 +81,7 @@ bool sensor_handle_info::add_reg_event_info(unsigned int event_type, unsigned in event_info.m_cb = cb; event_info.m_user_data = user_data; - m_reg_event_infos.insert(pair (event_type, event_info)); + m_reg_event_infos.insert(pair(event_type, event_info)); return true; } diff --git a/src/client/sensor_internal_deprecated.h b/src/client/sensor_internal_deprecated.h index 31496db..d74cab8 100644 --- a/src/client/sensor_internal_deprecated.h +++ b/src/client/sensor_internal_deprecated.h @@ -117,7 +117,7 @@ DEPRECATED int sf_start(int handle, int option); DEPRECATED int sf_stop(int handle); /** - * @fn int sf_register_event(int handle, unsigned int event_type, event_conditon_t *event_condition, sensor_callback_func_t cb, void *user_data ) + * @fn int sf_register_event(int handle, unsigned int event_type, event_conditon_t *event_condition, sensor_callback_func_t cb, void *user_data) * @brief This API registers a user defined callback function with a connected sensor for a particular event. This callback function will be called when there is a change in the state of respective sensor. user_data will be the parameter used during the callback call. Callback interval can be adjusted using even_contion_t argument. * @param[in] handle received handle value by sf_connect() * @param[in] event_type your desired event_type to register it diff --git a/src/server/client_info_manager.cpp b/src/server/client_info_manager.cpp index d4bb7c9..d065592 100644 --- a/src/server/client_info_manager.cpp +++ b/src/server/client_info_manager.cpp @@ -203,7 +203,7 @@ int client_info_manager::create_client_record(void) client_record.set_client_id(client_id); - m_clients.insert(pair (client_id, client_record)); + m_clients.insert(pair(client_id, client_record)); return client_id; } diff --git a/src/server/sensor_loader.cpp b/src/server/sensor_loader.cpp index f82856f..cf9f6ce 100644 --- a/src/server/sensor_loader.cpp +++ b/src/server/sensor_loader.cpp @@ -342,7 +342,7 @@ sensor_base* sensor_loader::get_sensor(sensor_id_t id) { vector sensors; - sensor_type_t type = static_cast (id >> SENSOR_TYPE_SHIFT); + sensor_type_t type = static_cast(id >> SENSOR_TYPE_SHIFT); unsigned int index = (id & SENSOR_INDEX_MASK); sensors = get_sensors(type); diff --git a/src/server/sensor_usage.cpp b/src/server/sensor_usage.cpp index 142ec4b..780bdff 100644 --- a/src/server/sensor_usage.cpp +++ b/src/server/sensor_usage.cpp @@ -66,7 +66,7 @@ bool sensor_usage::is_event_registered(unsigned int event_type) { auto it_event = find(m_reg_events.begin(), m_reg_events.end(), event_type); - if (it_event == m_reg_events.end()){ + if (it_event == m_reg_events.end()) { _D("Event[%#x] is not registered", event_type); return false; } diff --git a/src/shared/csocket.cpp b/src/shared/csocket.cpp index 4a01a38..00697f6 100644 --- a/src/shared/csocket.cpp +++ b/src/shared/csocket.cpp @@ -60,7 +60,9 @@ csocket::csocket(const csocket &sock) memcpy(&m_addr, &sock.m_addr, sizeof(sockaddr_un)); } -csocket::~csocket() { } +csocket::~csocket() +{ +} bool csocket::create(int sock_type) { -- 2.7.4 From 853f26dbf7bf91fb1d936c35b11247c5d6145eea Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Tue, 24 May 2016 13:22:20 +0900 Subject: [PATCH 13/16] sensord: change the log level from INFO to ERROR - it must be ERROR level. Change-Id: I23fbff0d2e26def0751c4e03730a7a4e7a8971c6 Signed-off-by: kibak.yoon --- src/client/sensor_event_listener.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/sensor_event_listener.cpp b/src/client/sensor_event_listener.cpp index cb629af..2dc8cd4 100644 --- a/src/client/sensor_event_listener.cpp +++ b/src/client/sensor_event_listener.cpp @@ -306,7 +306,7 @@ void sensor_event_listener::listen_events(void) len = sensor_event_poll(buffer, sizeof(sensor_event_t), event); if (len <= 0) { - _I("Failed to sensor_event_poll()"); + _E("Failed to sensor_event_poll()"); break; } @@ -316,7 +316,7 @@ void sensor_event_listener::listen_events(void) len = sensor_event_poll(buffer_data, data_len, event); if (len <= 0) { - _I("Failed to sensor_event_poll() for sensor_data"); + _E("Failed to sensor_event_poll() for sensor_data"); free(buffer_data); break; } -- 2.7.4 From 77613ee04d0ac4ac04d2f4368aca611c58bcce59 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Tue, 24 May 2016 13:36:59 +0900 Subject: [PATCH 14/16] sensord: write void explicitly when no parameters allowed - 6.7.5.3 Function declarators * The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters. Change-Id: I5a9afdd938a317c23a86d7fc4cd0514a91f0b6b5 Signed-off-by: kibak.yoon --- src/client/sensor_client_info.cpp | 2 +- src/sensor/auto_rotation/auto_rotation_sensor.cpp | 2 +- src/sensor/auto_rotation/auto_rotation_sensor.h | 2 +- src/sensor/gravity/gravity_sensor.cpp | 6 +++--- src/sensor/gravity/gravity_sensor.h | 4 ++-- src/sensor/linear_accel/linear_accel_sensor.cpp | 2 +- src/sensor/orientation/orientation_sensor.cpp | 2 +- src/sensor/rotation_vector/rotation_vector_sensor.cpp | 2 +- src/sensor/sensor_fusion/orientation_filter.h | 16 ++++++++-------- src/sensor/sensor_fusion/quaternion.h | 2 +- src/server/client_info_manager.cpp | 2 +- src/server/client_info_manager.h | 2 +- src/server/permission_checker.cpp | 10 +++++----- src/server/permission_checker.h | 2 +- src/server/physical_sensor.cpp | 6 +++--- src/server/physical_sensor.h | 2 +- src/server/sensor_base.cpp | 10 +++++----- src/server/sensor_base.h | 2 +- src/server/sensor_event_dispatcher.cpp | 2 +- src/server/sensor_event_dispatcher.h | 2 +- src/server/sensor_event_poller.cpp | 4 ++-- src/server/sensor_event_queue.cpp | 2 +- src/server/sensor_event_queue.h | 2 +- src/server/sensor_loader.cpp | 2 +- src/server/sensor_loader.h | 2 +- src/server/server.cpp | 2 +- src/server/server.h | 2 +- src/shared/cmutex.cpp | 4 ++-- src/shared/cmutex.h | 3 ++- 29 files changed, 52 insertions(+), 51 deletions(-) diff --git a/src/client/sensor_client_info.cpp b/src/client/sensor_client_info.cpp index a7dbf7e..ecb453e 100644 --- a/src/client/sensor_client_info.cpp +++ b/src/client/sensor_client_info.cpp @@ -85,7 +85,7 @@ bool sensor_client_info::delete_handle(int handle) return true; } -bool sensor_client_info::is_active() +bool sensor_client_info::is_active(void) { AUTOLOCK(m_handle_info_lock); diff --git a/src/sensor/auto_rotation/auto_rotation_sensor.cpp b/src/sensor/auto_rotation/auto_rotation_sensor.cpp index b3f0784..0cebedd 100644 --- a/src/sensor/auto_rotation/auto_rotation_sensor.cpp +++ b/src/sensor/auto_rotation/auto_rotation_sensor.cpp @@ -214,7 +214,7 @@ bool auto_rotation_sensor::on_stop(void) return deactivate(); } -auto_rotation_alg *auto_rotation_sensor::get_alg() +auto_rotation_alg *auto_rotation_sensor::get_alg(void) { auto_rotation_alg *alg = new(std::nothrow) auto_rotation_alg_emul(); retvm_if(!alg, NULL, "Failed to allocate memory"); diff --git a/src/sensor/auto_rotation/auto_rotation_sensor.h b/src/sensor/auto_rotation/auto_rotation_sensor.h index 506f244..ddd4e3c 100644 --- a/src/sensor/auto_rotation/auto_rotation_sensor.h +++ b/src/sensor/auto_rotation/auto_rotation_sensor.h @@ -59,7 +59,7 @@ private: virtual bool on_start(void); virtual bool on_stop(void); - auto_rotation_alg *get_alg(); + auto_rotation_alg *get_alg(void); }; #endif /* _AUTO_ROTATION_SENSOR_H_ */ diff --git a/src/sensor/gravity/gravity_sensor.cpp b/src/sensor/gravity/gravity_sensor.cpp index e071226..931940a 100644 --- a/src/sensor/gravity/gravity_sensor.cpp +++ b/src/sensor/gravity/gravity_sensor.cpp @@ -71,7 +71,7 @@ gravity_sensor::~gravity_sensor() _I("gravity_sensor is destroyed!\n"); } -bool gravity_sensor::init() +bool gravity_sensor::init(void) { /* Acc (+ Gyro) fusion */ m_accel_sensor = sensor_loader::get_instance().get_sensor(ACCELEROMETER_SENSOR); @@ -323,7 +323,7 @@ void gravity_sensor::fusion_set_gyro(const sensor_event_t& event) m_time_new = event.data->timestamp; } -void gravity_sensor::fusion_update_angle() +void gravity_sensor::fusion_update_angle(void) { _D("AngleIn: (%f, %f, %f)", m_angle_n[0], m_angle_n[1], m_angle_n[2]); _D("AngAccl: (%f, %f, %f)", m_velocity[0], m_velocity[1], m_velocity[2]); @@ -341,7 +341,7 @@ void gravity_sensor::fusion_update_angle() _D("Angle' : (%f, %f, %f)", m_angle[0], m_angle[1], m_angle[2]); } -void gravity_sensor::fusion_get_gravity() +void gravity_sensor::fusion_get_gravity(void) { double x = 0, y = 0, z = 0; double norm; diff --git a/src/sensor/gravity/gravity_sensor.h b/src/sensor/gravity/gravity_sensor.h index c9ed7d7..093465c 100644 --- a/src/sensor/gravity/gravity_sensor.h +++ b/src/sensor/gravity/gravity_sensor.h @@ -81,8 +81,8 @@ private: void fusion_set_accel(const sensor_event_t& event); void fusion_set_gyro(const sensor_event_t& event); - void fusion_update_angle(); - void fusion_get_gravity(); + void fusion_update_angle(void); + void fusion_get_gravity(void); double complementary(double angle, double angle_in, double vel, double delta_t, double alpha); void complementary(unsigned long long time_diff); }; diff --git a/src/sensor/linear_accel/linear_accel_sensor.cpp b/src/sensor/linear_accel/linear_accel_sensor.cpp index 7e89700..f5ad037 100644 --- a/src/sensor/linear_accel/linear_accel_sensor.cpp +++ b/src/sensor/linear_accel/linear_accel_sensor.cpp @@ -58,7 +58,7 @@ linear_accel_sensor::~linear_accel_sensor() _I("linear_accel_sensor is destroyed!\n"); } -bool linear_accel_sensor::init() +bool linear_accel_sensor::init(void) { m_accel_sensor = sensor_loader::get_instance().get_sensor(ACCELEROMETER_SENSOR); diff --git a/src/sensor/orientation/orientation_sensor.cpp b/src/sensor/orientation/orientation_sensor.cpp index 940aed3..8f4bd79 100644 --- a/src/sensor/orientation/orientation_sensor.cpp +++ b/src/sensor/orientation/orientation_sensor.cpp @@ -52,7 +52,7 @@ orientation_sensor::~orientation_sensor() _I("%s is destroyed!", SENSOR_NAME); } -bool orientation_sensor::init() +bool orientation_sensor::init(void) { m_rotation_vector_sensor = sensor_loader::get_instance().get_sensor(ROTATION_VECTOR_SENSOR); diff --git a/src/sensor/rotation_vector/rotation_vector_sensor.cpp b/src/sensor/rotation_vector/rotation_vector_sensor.cpp index 17c3655..93c03db 100644 --- a/src/sensor/rotation_vector/rotation_vector_sensor.cpp +++ b/src/sensor/rotation_vector/rotation_vector_sensor.cpp @@ -59,7 +59,7 @@ rotation_vector_sensor::~rotation_vector_sensor() _I("%s is destroyed!", SENSOR_NAME); } -bool rotation_vector_sensor::init() +bool rotation_vector_sensor::init(void) { m_accel_sensor = sensor_loader::get_instance().get_sensor(ACCELEROMETER_SENSOR); m_mag_sensor = sensor_loader::get_instance().get_sensor(GEOMAGNETIC_SENSOR); diff --git a/src/sensor/sensor_fusion/orientation_filter.h b/src/sensor/sensor_fusion/orientation_filter.h index ea6143d..d55b7c1 100644 --- a/src/sensor/sensor_fusion/orientation_filter.h +++ b/src/sensor/sensor_fusion/orientation_filter.h @@ -75,17 +75,17 @@ public: int m_magnetic_alignment_factor; - orientation_filter(); - ~orientation_filter(); + orientation_filter(void); + ~orientation_filter(void); inline void initialize_sensor_data(const sensor_data *accel, const sensor_data *gyro, const sensor_data *magnetic); - inline void orientation_triad_algorithm(); - inline void compute_accel_orientation(); - inline void compute_covariance(); - inline void time_update(); - inline void time_update_gaming_rv(); - inline void measurement_update(); + inline void orientation_triad_algorithm(void); + inline void compute_accel_orientation(void); + inline void compute_covariance(void); + inline void time_update(void); + inline void time_update_gaming_rv(void); + inline void measurement_update(void); void get_device_orientation(const sensor_data *accel, const sensor_data *gyro, const sensor_data *magnetic); diff --git a/src/sensor/sensor_fusion/quaternion.h b/src/sensor/sensor_fusion/quaternion.h index 539a952..cbe9bf4 100644 --- a/src/sensor/sensor_fusion/quaternion.h +++ b/src/sensor/sensor_fusion/quaternion.h @@ -37,7 +37,7 @@ public: ~quaternion(); quaternion operator =(const quaternion& q); - void quat_normalize(); + void quat_normalize(void); template friend quaternion operator *(const quaternion q, const T val); diff --git a/src/server/client_info_manager.cpp b/src/server/client_info_manager.cpp index d065592..efdaec0 100644 --- a/src/server/client_info_manager.cpp +++ b/src/server/client_info_manager.cpp @@ -36,7 +36,7 @@ client_info_manager::~client_info_manager() m_clients.clear(); } -client_info_manager& client_info_manager::get_instance() +client_info_manager& client_info_manager::get_instance(void) { static client_info_manager inst; return inst; diff --git a/src/server/client_info_manager.h b/src/server/client_info_manager.h index bed4471..b65c4bf 100644 --- a/src/server/client_info_manager.h +++ b/src/server/client_info_manager.h @@ -31,7 +31,7 @@ typedef std::vector client_id_vec; class client_info_manager { public: - static client_info_manager& get_instance(); + static client_info_manager& get_instance(void); int create_client_record(void); bool remove_client_record(int client_id); bool has_client_record(int client_id); diff --git a/src/server/permission_checker.cpp b/src/server/permission_checker.cpp index b8ece6e..72fef47 100644 --- a/src/server/permission_checker.cpp +++ b/src/server/permission_checker.cpp @@ -60,24 +60,24 @@ static bool check_privilege_by_sockfd(int sock_fd, const char *priv) return (ret == CYNARA_API_ACCESS_ALLOWED); } -permission_checker::permission_checker() +permission_checker::permission_checker(void) : m_permission_set(0) { init(); } -permission_checker::~permission_checker() +permission_checker::~permission_checker(void) { deinit(); } -permission_checker& permission_checker::get_instance() +permission_checker& permission_checker::get_instance(void) { static permission_checker inst; return inst; } -void permission_checker::init() +void permission_checker::init(void) { AUTOLOCK(m_mutex); @@ -121,7 +121,7 @@ void permission_checker::init_cynara(void) _I("Cynara initialized"); } -void permission_checker::deinit() +void permission_checker::deinit(void) { AUTOLOCK(m_mutex); diff --git a/src/server/permission_checker.h b/src/server/permission_checker.h index c7ccbb0..d47524d 100644 --- a/src/server/permission_checker.h +++ b/src/server/permission_checker.h @@ -27,7 +27,7 @@ class permission_checker { public: - static permission_checker& get_instance(); + static permission_checker& get_instance(void); int get_permission(int sock_fd); diff --git a/src/server/physical_sensor.cpp b/src/server/physical_sensor.cpp index b16561d..9bc53ea 100644 --- a/src/server/physical_sensor.cpp +++ b/src/server/physical_sensor.cpp @@ -68,7 +68,7 @@ uint32_t physical_sensor::get_hal_id(void) return m_info->id; } -int physical_sensor::get_poll_fd() +int physical_sensor::get_poll_fd(void) { AUTOLOCK(m_mutex); @@ -178,7 +178,7 @@ int physical_sensor::set_attribute(int32_t attribute, char *value, int value_len return OP_SUCCESS; } -bool physical_sensor::on_start() +bool physical_sensor::on_start(void) { AUTOLOCK(m_mutex); @@ -188,7 +188,7 @@ bool physical_sensor::on_start() return m_sensor_device->enable(m_info->id); } -bool physical_sensor::on_stop() +bool physical_sensor::on_stop(void) { AUTOLOCK(m_mutex); diff --git a/src/server/physical_sensor.h b/src/server/physical_sensor.h index cbcbc9a..3db1791 100644 --- a/src/server/physical_sensor.h +++ b/src/server/physical_sensor.h @@ -39,7 +39,7 @@ public: virtual const char* get_name(void); virtual uint32_t get_hal_id(void); - int get_poll_fd(); + int get_poll_fd(void); virtual bool on_event(const sensor_data_t *data, int data_len, int remains); diff --git a/src/server/sensor_base.cpp b/src/server/sensor_base.cpp index dcc6623..b06b2f3 100644 --- a/src/server/sensor_base.cpp +++ b/src/server/sensor_base.cpp @@ -66,7 +66,7 @@ unsigned int sensor_base::get_event_type(void) return -1; } -const char* sensor_base::get_name() +const char* sensor_base::get_name(void) { return NULL; } @@ -76,7 +76,7 @@ bool sensor_base::get_sensor_info(sensor_info &info) return false; } -bool sensor_base::is_virtual() +bool sensor_base::is_virtual(void) { return false; } @@ -116,7 +116,7 @@ int sensor_base::set_attribute(int32_t attribute, char *value, int value_size) return OP_SUCCESS; } -bool sensor_base::start() +bool sensor_base::start(void) { AUTOLOCK(m_client_mutex); @@ -344,12 +344,12 @@ bool sensor_base::set_batch_latency(unsigned long latency) return true; } -bool sensor_base::on_start() +bool sensor_base::on_start(void) { return true; } -bool sensor_base::on_stop() +bool sensor_base::on_stop(void) { return true; } diff --git a/src/server/sensor_base.h b/src/server/sensor_base.h index e5e07c7..22f0e66 100644 --- a/src/server/sensor_base.h +++ b/src/server/sensor_base.h @@ -41,7 +41,7 @@ public: sensor_id_t get_id(void); /* sensor info */ - virtual sensor_type_t get_type(); + virtual sensor_type_t get_type(void); virtual unsigned int get_event_type(void); virtual const char* get_name(void); virtual bool is_virtual(void); diff --git a/src/server/sensor_event_dispatcher.cpp b/src/server/sensor_event_dispatcher.cpp index c1fc3cb..03c4798 100644 --- a/src/server/sensor_event_dispatcher.cpp +++ b/src/server/sensor_event_dispatcher.cpp @@ -38,7 +38,7 @@ sensor_event_dispatcher::~sensor_event_dispatcher() { } -sensor_event_dispatcher& sensor_event_dispatcher::get_instance() +sensor_event_dispatcher& sensor_event_dispatcher::get_instance(void) { static sensor_event_dispatcher inst; return inst; diff --git a/src/server/sensor_event_dispatcher.h b/src/server/sensor_event_dispatcher.h index ee7e630..6d79e44 100644 --- a/src/server/sensor_event_dispatcher.h +++ b/src/server/sensor_event_dispatcher.h @@ -34,7 +34,7 @@ typedef std::list virtual_sensors; class sensor_event_dispatcher { public: - static sensor_event_dispatcher& get_instance(); + static sensor_event_dispatcher& get_instance(void); bool run(void); bool stop(void); diff --git a/src/server/sensor_event_poller.cpp b/src/server/sensor_event_poller.cpp index 994c1f0..fa23e6f 100644 --- a/src/server/sensor_event_poller.cpp +++ b/src/server/sensor_event_poller.cpp @@ -40,7 +40,7 @@ sensor_event_poller::~sensor_event_poller() m_poller.del_fd(it->first); } -void sensor_event_poller::init_sensor_map() +void sensor_event_poller::init_sensor_map(void) { int fd; physical_sensor *sensor; @@ -92,7 +92,7 @@ bool sensor_event_poller::add_poll_fd(int fd) return m_poller.add_fd(fd); } -bool sensor_event_poller::poll() +bool sensor_event_poller::poll(void) { std::vector ids; while (true) { diff --git a/src/server/sensor_event_queue.cpp b/src/server/sensor_event_queue.cpp index b49880d..d143d49 100644 --- a/src/server/sensor_event_queue.cpp +++ b/src/server/sensor_event_queue.cpp @@ -20,7 +20,7 @@ #include #include -sensor_event_queue& sensor_event_queue::get_instance() +sensor_event_queue& sensor_event_queue::get_instance(void) { static sensor_event_queue inst; return inst; diff --git a/src/server/sensor_event_queue.h b/src/server/sensor_event_queue.h index f5e31ae..4f776ef 100644 --- a/src/server/sensor_event_queue.h +++ b/src/server/sensor_event_queue.h @@ -27,7 +27,7 @@ class sensor_event_queue { public: - static sensor_event_queue& get_instance(); + static sensor_event_queue& get_instance(void); void push(sensor_event_t *event); void* pop(void); diff --git a/src/server/sensor_loader.cpp b/src/server/sensor_loader.cpp index cf9f6ce..d43ac62 100644 --- a/src/server/sensor_loader.cpp +++ b/src/server/sensor_loader.cpp @@ -71,7 +71,7 @@ sensor_loader::~sensor_loader() m_handles.clear(); } -sensor_loader& sensor_loader::get_instance() +sensor_loader& sensor_loader::get_instance(void) { static sensor_loader inst; return inst; diff --git a/src/server/sensor_loader.h b/src/server/sensor_loader.h index 486effe..3312c1d 100644 --- a/src/server/sensor_loader.h +++ b/src/server/sensor_loader.h @@ -57,7 +57,7 @@ private: sensor_device_map_t m_devices; std::vector m_handles; public: - static sensor_loader& get_instance(); + static sensor_loader& get_instance(void); bool load(void); sensor_base* get_sensor(sensor_type_t type); diff --git a/src/server/server.cpp b/src/server/server.cpp index fb5882d..e3c902b 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -294,7 +294,7 @@ void server::stop(void) } } -server& server::get_instance() +server& server::get_instance(void) { static server inst; return inst; diff --git a/src/server/server.h b/src/server/server.h index 3dbd0d4..e285cde 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -27,7 +27,7 @@ class server { public: - static server& get_instance(); + static server& get_instance(void); public: void run(void); diff --git a/src/shared/cmutex.cpp b/src/shared/cmutex.cpp index 7f46633..6245b6e 100644 --- a/src/shared/cmutex.cpp +++ b/src/shared/cmutex.cpp @@ -34,7 +34,7 @@ cmutex::~cmutex() pthread_mutex_destroy(&m_mutex); } -void cmutex::lock() +void cmutex::lock(void) { #ifdef _LOCK_DEBUG cbase_lock::lock(LOCK_TYPE_MUTEX, "mutex", __MODULE__, __func__, __LINE__); @@ -58,7 +58,7 @@ int cmutex::try_lock_impl(void) return pthread_mutex_trylock(&m_mutex); } -int cmutex::unlock_impl() +int cmutex::unlock_impl(void) { return pthread_mutex_unlock(&m_mutex); } diff --git a/src/shared/cmutex.h b/src/shared/cmutex.h index 868500a..94aa2b6 100644 --- a/src/shared/cmutex.h +++ b/src/shared/cmutex.h @@ -33,7 +33,8 @@ public: protected: int lock_impl(void); int try_lock_impl(void); - int unlock_impl(); + int unlock_impl(void); + private: pthread_mutex_t m_mutex; }; -- 2.7.4 From 1b2ef3c89cd32df2515c27a8cf03709ae97262ed Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Tue, 24 May 2016 14:00:39 +0900 Subject: [PATCH 15/16] sensord: transpose acc/gyro axis w.r.t the display rotation Change-Id: I23f81740000c13d377038b15b1904da642b4060e Signed-off-by: kibak.yoon --- src/client/client.cpp | 2 + src/client/dbus_listener.cpp | 135 +++++++++++++++++++++++++++++++++++ src/client/dbus_listener.h | 46 ++++++++++++ src/client/sensor_event_listener.cpp | 41 +++++++++++ src/client/sensor_event_listener.h | 8 +++ 5 files changed, 232 insertions(+) create mode 100755 src/client/dbus_listener.cpp create mode 100644 src/client/dbus_listener.h diff --git a/src/client/client.cpp b/src/client/client.cpp index ae79346..b9b99c1 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -30,6 +30,7 @@ #include #include #include +#include "dbus_listener.h" using std::vector; @@ -636,6 +637,7 @@ API int sensord_connect(sensor_t sensor) } set_power_save_state_cb(); + dbus_listener::init(); return handle; } diff --git a/src/client/dbus_listener.cpp b/src/client/dbus_listener.cpp new file mode 100755 index 0000000..7f96ef1 --- /dev/null +++ b/src/client/dbus_listener.cpp @@ -0,0 +1,135 @@ +/* + * sensord + * + * Copyright (c) 2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include "sensor_event_listener.h" +#include "dbus_listener.h" + +#define HANDLE_GERROR(Err) \ + do { \ + if ((Err)) { \ + _E("GError: %s", Err->message); \ + g_error_free(Err); \ + Err = NULL; \ + } \ + } while (0) + +#define ROTATION_DBUS_DEST "org.tizen.system.coord" +#define ROTATION_DBUS_OBJ_PATH "/Org/Tizen/System/Coord/Rotation" +#define ROTATION_DBUS_IFACE "org.tizen.system.coord.rotation" +#define ROTATION_DBUS_SIGNAL "Changed" +#define ROTATION_DBUS_METHOD "Degree" + +static void rotation_signal_cb(GDBusConnection *conn, const gchar *sender, + const gchar *obj_path, const gchar *iface, const gchar *signal_name, + GVariant *param, gpointer user_data) +{ + gint state; + g_variant_get(param, "(i)", &state); + sensor_event_listener::get_instance().set_display_rotation(state); +} + +static void rotation_read_cb(GObject *source_object, GAsyncResult *res, gpointer user_data) +{ + GError *error = NULL; + GDBusConnection *conn = G_DBUS_CONNECTION(source_object); + GVariant *result = g_dbus_connection_call_finish(conn, res, &error); + HANDLE_GERROR(error); + ret_if(result == NULL); + + gint state; + g_variant_get(result, "(i)", &state); + g_variant_unref(result); + sensor_event_listener::get_instance().set_display_rotation(state); +} + +dbus_listener::dbus_listener() +: m_connection(NULL) +{ +#ifndef GLIB_VERSION_2_36 + g_type_init(); +#endif +} + +dbus_listener::~dbus_listener() +{ + disconnect(); +} + +void dbus_listener::init(void) +{ + static dbus_listener listener; + static bool done = false; + ret_if(done); + listener.connect(); + done = true; +} + +void dbus_listener::connect(void) +{ + GError *gerr = NULL; + + gchar *addr = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &gerr); + HANDLE_GERROR(gerr); + retm_if(addr == NULL, "Getting address failed"); + + g_dbus_connection_new_for_address(addr, + (GDBusConnectionFlags)(G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION), + NULL, NULL, on_connection_ready, this); + g_free(addr); +} + +void dbus_listener::on_connection_ready(GObject *source_object, GAsyncResult *res, gpointer user_data) +{ + GError *gerr = NULL; + dbus_listener *listener = static_cast(user_data); + + GDBusConnection *conn = g_dbus_connection_new_finish(res, &gerr); + HANDLE_GERROR(gerr); + + retm_if(conn == NULL, "Connection failed"); + _D("Dbus connection established: %s", g_dbus_connection_get_unique_name(conn)); + + listener->m_connection = conn; + listener->get_current_state(); + listener->subscribe(); +} + +void dbus_listener::disconnect(void) +{ + ret_if(!m_connection); + g_dbus_connection_close_sync(m_connection, NULL, NULL); + g_object_unref(m_connection); +} + +void dbus_listener::subscribe(void) +{ + /* Diplay rotation */ + g_dbus_connection_signal_subscribe(m_connection, + ROTATION_DBUS_DEST, ROTATION_DBUS_IFACE, ROTATION_DBUS_SIGNAL, ROTATION_DBUS_OBJ_PATH, + NULL, G_DBUS_SIGNAL_FLAGS_NONE, (GDBusSignalCallback)rotation_signal_cb, NULL, NULL); +} + +void dbus_listener::get_current_state(void) +{ + /* Display rotation */ + g_dbus_connection_call(m_connection, + ROTATION_DBUS_DEST, ROTATION_DBUS_OBJ_PATH, ROTATION_DBUS_IFACE, ROTATION_DBUS_METHOD, + NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, (GAsyncReadyCallback)rotation_read_cb, NULL); +} diff --git a/src/client/dbus_listener.h b/src/client/dbus_listener.h new file mode 100644 index 0000000..3d4a804 --- /dev/null +++ b/src/client/dbus_listener.h @@ -0,0 +1,46 @@ +/* + * sensord + * + * Copyright (c) 2013 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef _DBUS_LISTENER_H_ +#define _DBUS_LISTENER_H_ + +#include +#include +#include + +class dbus_listener { +public: + static void init(void); + +private: + GDBusConnection *m_connection; + + dbus_listener(); + ~dbus_listener(); + + void connect(void); + void disconnect(void); + + void subscribe(void); + void get_current_state(void); + + static void on_connection_ready(GObject *source_object, GAsyncResult *res, gpointer user_data); +}; + +#endif /* _DBUS_LISTENER_H_ */ diff --git a/src/client/sensor_event_listener.cpp b/src/client/sensor_event_listener.cpp index 2dc8cd4..0215b29 100644 --- a/src/client/sensor_event_listener.cpp +++ b/src/client/sensor_event_listener.cpp @@ -45,6 +45,7 @@ sensor_event_listener::sensor_event_listener() , m_thread_state(THREAD_STATE_TERMINATE) , m_hup_observer(NULL) , m_client_info(sensor_client_info::get_instance()) +, m_display_rotation(AUTO_ROTATION_DEGREE_UNKNOWN) { } @@ -237,6 +238,36 @@ bool sensor_event_listener::is_valid_callback(client_callback_info *cb_info) return m_client_info.is_event_active(cb_info->handle, cb_info->event_type, cb_info->event_id); } +void sensor_event_listener::align_sensor_axis(sensor_t sensor, sensor_data_t *data) +{ + sensor_type_t type = sensor_to_sensor_info(sensor)->get_type(); + + if (type != ACCELEROMETER_SENSOR && type != GYROSCOPE_SENSOR && type != GRAVITY_SENSOR) + return; + + float x, y; + + switch (m_display_rotation) { + case AUTO_ROTATION_DEGREE_90: /* Landscape Left */ + x = -data->values[1]; + y = data->values[0]; + break; + case AUTO_ROTATION_DEGREE_180: /* Portrait Bottom */ + x = -data->values[0]; + y = -data->values[1]; + break; + case AUTO_ROTATION_DEGREE_270: /* Landscape Right */ + x = data->values[1]; + y = -data->values[0]; + break; + default: + return; + } + + data->values[0] = x; + data->values[1] = y; +} + gboolean sensor_event_listener::callback_dispatcher(gpointer data) { client_callback_info *cb_info = (client_callback_info*) data; @@ -452,3 +483,13 @@ bool sensor_event_listener::start_event_listener(void) return true; } + +void sensor_event_listener::set_display_rotation(int rt) +{ + _D("New display rotation: %d", rt); + + if (rt < AUTO_ROTATION_DEGREE_0 || rt > AUTO_ROTATION_DEGREE_270) + return; + + m_display_rotation = rt; +} diff --git a/src/client/sensor_event_listener.h b/src/client/sensor_event_listener.h index 1c94475..5bb92ab 100644 --- a/src/client/sensor_event_listener.h +++ b/src/client/sensor_event_listener.h @@ -77,6 +77,8 @@ public: void clear(void); void set_hup_observer(hup_observer_t observer); + void set_display_rotation(int rt); + private: enum thread_state { THREAD_STATE_START, @@ -97,6 +99,9 @@ private: sensor_client_info &m_client_info; + /* WC1's rotation control */ + int m_display_rotation; + sensor_event_listener(); ~sensor_event_listener(); @@ -121,6 +126,9 @@ private: static gboolean callback_dispatcher(gpointer data); void set_thread_state(thread_state state); + + /* WC1's sensor axis alignment */ + void align_sensor_axis(sensor_t sensor, sensor_data_t *data); }; #endif /* _SENSOR_EVENT_LISTENER_H_ */ -- 2.7.4 From b3d0802bd19f3bb6a9c2c5047d247a7a91fe03bc Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Tue, 24 May 2016 16:56:21 +0900 Subject: [PATCH 16/16] sensord: change comment for syncing - comments are different between tizen 2.3 and tizen 3.0. so sync them. Change-Id: I011df5ef30ac5075f2eb36327364fc90bc85e4b1 Signed-off-by: kibak.yoon --- src/shared/csocket.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/shared/csocket.cpp b/src/shared/csocket.cpp index 00697f6..09a7d0e 100644 --- a/src/shared/csocket.cpp +++ b/src/shared/csocket.cpp @@ -250,10 +250,10 @@ ssize_t csocket::send_for_stream(const void *buffer, size_t size) const len, get_client_name()); /* - * If socket is not available to use it temporarily, - * EAGAIN(EWOULDBLOCK) is returned by ::send(). - * so in order to prevent that data are omitted, retry to send it - */ + * If socket is not available to use it temporarily, + * EAGAIN(EWOULDBLOCK) is returned by ::send(). + * so in order to prevent that data are omitted, sleep&retry to send it + */ if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { usleep(1000); continue; @@ -291,10 +291,10 @@ ssize_t csocket::recv_for_stream(void* buffer, size_t size) const len, get_client_name()); /* - * If socket is not available to use during for some time, - * EAGAIN(EWOULDBLOCK) is returned by ::recv(). - * so in order to prevent that data are omitted, retry to receive it - */ + * If socket is not available to use it temporarily, + * EAGAIN(EWOULDBLOCK) is returned by ::recv(). + * so in order to prevent that data are omitted, sleep&retry to receive it + */ if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { usleep(1000); continue; @@ -359,7 +359,7 @@ bool csocket::connect(const char *sock_path) addr_len = strlen(m_addr.sun_path) + sizeof(m_addr.sun_family); - if (::connect(m_sock_fd, (sockaddr *) &m_addr, addr_len) < 0) { + if (::connect(m_sock_fd, (sockaddr *)&m_addr, addr_len) < 0) { _ERRNO(errno, _E, "Failed to connect sock_fd: %d for %s", m_sock_fd, get_client_name()); return false; -- 2.7.4