summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/service/logic.cpp31
-rw-r--r--src/service/logic.h17
-rw-r--r--src/service/ocsp-service.cpp2
-rw-r--r--src/service/ocsp-service.h2
4 files changed, 38 insertions, 14 deletions
diff --git a/src/service/logic.cpp b/src/service/logic.cpp
index 086dbf5..aed5006 100644
--- a/src/service/logic.cpp
+++ b/src/service/logic.cpp
@@ -233,14 +233,19 @@ error_t Logic::setup()
return REGISTER_CALLBACK_ERROR;
}
+ // Init for gio timeout.
+ m_is_first_run = false;
+
LogDebug("Register package event handler success");
return NO_ERROR;
}
-void Logic::run()
+void Logic::run(guint timeout)
{
LogDebug("Running the main loop");
+
+ g_timeout_add_seconds(timeout, timeout_cb, m_loop);
g_main_loop_run(m_loop);
}
@@ -552,12 +557,14 @@ void Logic::process_all()
for(;;) {
std::unique_lock<std::mutex> lock(m_mutex_cv);
- // TODO(sangwan.kwon) Should wake up about OCSP_CHECK_AGAIN case
- if(m_queue.empty() && !m_is_online_enabled) { // Wait condition.
+ // Wait condition.
+ if(m_queue.empty() && !m_is_online_enabled) {
LogDebug("[thread] wait condition <queue, Network> : "
<< !m_queue.empty() << ", " << get_online());
m_to_process.wait(lock); // spurious wakeups do not concern us
+
LogDebug("[thread] wake up! running stage");
+ m_is_first_run = true;
}
// Value for prevent infinite loop.
@@ -579,7 +586,7 @@ void Logic::process_all()
} else {
LogDebug("[thread] Check again : " << m_buffer.size());
// Timer running periodically
- timerStart(3600);
+ timerStart(TIMEOUT_TIMER);
}
} else if (!get_online()) {
LogDebug("[thread] No network. Buffer won't be processed.");
@@ -673,7 +680,23 @@ bool Logic::get_should_exit(void) const
void Logic::set_should_exit(void)
{
m_should_exit = true;
+}
+
+std::atomic<bool> Logic::m_is_first_run(false);
+
+bool Logic::is_gmain_loop_running()
+{
+ return g_main_loop_is_running(m_loop);
+}
+
+gboolean Logic::timeout_cb(gpointer data)
+{
+ if (!m_is_first_run) {
+ LogDebug("No event Since cchecker launched. timeout.");
+ g_main_loop_quit(static_cast<GMainLoop *>(data));
+ }
+ return FALSE;
}
} // namespace CCHECKER
diff --git a/src/service/logic.h b/src/service/logic.h
index f54dddc..a7d9ff9 100644
--- a/src/service/logic.h
+++ b/src/service/logic.h
@@ -44,6 +44,8 @@
namespace CCHECKER {
+const int TIMEOUT_TIMER = 3600;
+
namespace DB {
class SqlQuery;
} // namespace DB
@@ -67,7 +69,8 @@ class Logic : public Timer {
Logic(void);
virtual ~Logic(void);
error_t setup(void);
- void run(void);
+ void run(guint timeout);
+ bool is_gmain_loop_running();
virtual void clean(void);
static void connman_callback(GDBusProxy *proxy,
@@ -94,7 +97,6 @@ class Logic : public Timer {
private:
error_t setup_db();
void load_database_to_buffer();
-
void add_app_to_buffer_and_database(const app_t &app);
void remove_app_from_buffer_and_database(const app_t &app);
@@ -109,6 +111,7 @@ class Logic : public Timer {
GVariant *parameters,
void *logic_ptr)
);
+ bool get_online(void) const;
static int pkgmgrinfo_event_handler_static(
uid_t uid,
@@ -119,7 +122,6 @@ class Logic : public Timer {
const char *val,
const void *pmsg,
void *data);
-
int pkgmgrinfo_event_handler(
uid_t uid,
int reqid,
@@ -129,22 +131,18 @@ class Logic : public Timer {
const char *val,
const void *pmsg,
void *data);
-
int push_pkgmgrinfo_event(uid_t uid, const char *pkgid);
-
void process_all(void);
void process_queue(void);
-
bool process_app(app_t& app);
void process_buffer(void);
-
- bool get_online(void) const;
-
bool get_should_exit(void) const;
bool call_ui(const app_t &app);
+ static gboolean timeout_cb(gpointer data);
+
// main event loop data type
GMainLoop *m_loop;
@@ -157,6 +155,7 @@ class Logic : public Timer {
// TODO: use m_queue for online events
bool m_is_online_enabled;
bool m_should_exit;
+ static std::atomic<bool> m_is_first_run;
GDBusProxy *m_proxy_connman;
diff --git a/src/service/ocsp-service.cpp b/src/service/ocsp-service.cpp
index a028048..3f99da1 100644
--- a/src/service/ocsp-service.cpp
+++ b/src/service/ocsp-service.cpp
@@ -43,7 +43,7 @@ void OcspService::onMessageProcess(const ConnShPtr &connection)
connection->send(this->process(connection, in));
// Run gmainloop for event listening.
- m_logic.run();
+ m_logic.run(TIMEOUT_G_SERVICE);
LogDebug("Finish processing message on ocsp service.");
}
diff --git a/src/service/ocsp-service.h b/src/service/ocsp-service.h
index 1f497cc..3016967 100644
--- a/src/service/ocsp-service.h
+++ b/src/service/ocsp-service.h
@@ -28,6 +28,8 @@
namespace CCHECKER {
+const int TIMEOUT_G_SERVICE = 600; // 10 minutes
+
class OcspService : public Service {
public:
OcspService(const std::string &address);