Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[mms-engine] Housekeeping
  • Loading branch information
monich committed Mar 13, 2016
1 parent 3f72909 commit e63539b
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 88 deletions.
104 changes: 52 additions & 52 deletions mms-engine/mms_engine.c
Expand Up @@ -21,6 +21,8 @@
#include "mms_settings_dconf.h"
#include "mms_log.h"

#include <gutil_misc.h>

#ifdef SAILFISH
# include "mms_connman_nemo.h"
# define mms_connman_new() mms_connman_nemo_new()
Expand All @@ -32,6 +34,21 @@
/* Generated code */
#include "org.nemomobile.MmsEngine.h"

/* Signals D-Bus proxy */
enum mms_engine_dbus_methods {
MMS_ENGINE_METHOD_SEND_MESSAGE,
MMS_ENGINE_METHOD_PUSH,
MMS_ENGINE_METHOD_PUSH_NOTIFY,
MMS_ENGINE_METHOD_CANCEL,
MMS_ENGINE_METHOD_RECEIVE_MESSAGE,
MMS_ENGINE_METHOD_SEND_READ_REPORT,
MMS_ENGINE_METHOD_SET_LOG_LEVEL,
MMS_ENGINE_METHOD_SET_LOG_TYPE,
MMS_ENGINE_METHOD_GET_VERSION,
MMS_ENGINE_METHOD_MIGRATE_SETTINGS,
MMS_ENGINE_METHOD_COUNT
};

struct mms_engine {
GObject parent;
const MMSConfig* config;
Expand All @@ -48,20 +65,11 @@ struct mms_engine {
gboolean stop_requested;
gboolean keep_running;
guint start_timeout_id;
gulong send_message_id;
gulong push_signal_id;
gulong push_notify_signal_id;
gulong receive_signal_id;
gulong read_report_signal_id;
gulong cancel_signal_id;
gulong set_log_level_signal_id;
gulong set_log_type_signal_id;
gulong get_version_signal_id;
gulong migrate_settings_signal_id;
gulong proxy_signal_id[MMS_ENGINE_METHOD_COUNT];
};

typedef GObjectClass MMSEngineClass;
G_DEFINE_TYPE(MMSEngine, mms_engine, G_TYPE_OBJECT);
G_DEFINE_TYPE(MMSEngine, mms_engine, G_TYPE_OBJECT)
#define MMS_TYPE_ENGINE (mms_engine_get_type())
#define MMS_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\
MMS_TYPE_ENGINE, MMSEngine))
Expand Down Expand Up @@ -501,34 +509,34 @@ mms_engine_new(
mms->log_modules = log_modules;
mms->log_count = log_count;
mms->proxy = org_nemomobile_mms_engine_skeleton_new();
mms->send_message_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_SEND_MESSAGE] =
g_signal_connect(mms->proxy, "handle-send-message",
G_CALLBACK(mms_engine_handle_send_message), mms);
mms->push_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_PUSH] =
g_signal_connect(mms->proxy, "handle-push",
G_CALLBACK(mms_engine_handle_push), mms);
mms->push_notify_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_PUSH_NOTIFY] =
g_signal_connect(mms->proxy, "handle-push-notify",
G_CALLBACK(mms_engine_handle_push_notify), mms);
mms->cancel_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_CANCEL] =
g_signal_connect(mms->proxy, "handle-cancel",
G_CALLBACK(mms_engine_handle_cancel), mms);
mms->receive_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_RECEIVE_MESSAGE] =
g_signal_connect(mms->proxy, "handle-receive-message",
G_CALLBACK(mms_engine_handle_receive_message), mms);
mms->read_report_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_SEND_READ_REPORT] =
g_signal_connect(mms->proxy, "handle-send-read-report",
G_CALLBACK(mms_engine_handle_send_read_report), mms);
mms->set_log_level_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_SET_LOG_LEVEL] =
g_signal_connect(mms->proxy, "handle-set-log-level",
G_CALLBACK(mms_engine_handle_set_log_level), mms);
mms->set_log_type_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_SET_LOG_TYPE] =
g_signal_connect(mms->proxy, "handle-set-log-type",
G_CALLBACK(mms_engine_handle_set_log_type), mms);
mms->get_version_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_GET_VERSION] =
g_signal_connect(mms->proxy, "handle-get-version",
G_CALLBACK(mms_engine_handle_get_version), mms);
mms->migrate_settings_signal_id =
mms->proxy_signal_id[MMS_ENGINE_METHOD_MIGRATE_SETTINGS] =
g_signal_connect(mms->proxy, "handle-migrate-settings",
G_CALLBACK(mms_engine_handle_migrate_settings), mms);

Expand Down Expand Up @@ -645,37 +653,29 @@ void
mms_engine_dispose(
GObject* object)
{
MMSEngine* e = MMS_ENGINE(object);
MMS_VERBOSE_("%p", e);
MMS_ASSERT(!e->loop);
mms_engine_unregister(e);
mms_engine_start_timeout_cancel(e);
if (e->proxy) {
g_signal_handler_disconnect(e->proxy, e->send_message_id);
g_signal_handler_disconnect(e->proxy, e->push_signal_id);
g_signal_handler_disconnect(e->proxy, e->push_notify_signal_id);
g_signal_handler_disconnect(e->proxy, e->receive_signal_id);
g_signal_handler_disconnect(e->proxy, e->read_report_signal_id);
g_signal_handler_disconnect(e->proxy, e->cancel_signal_id);
g_signal_handler_disconnect(e->proxy, e->set_log_level_signal_id);
g_signal_handler_disconnect(e->proxy, e->set_log_type_signal_id);
g_signal_handler_disconnect(e->proxy, e->get_version_signal_id);
g_signal_handler_disconnect(e->proxy, e->migrate_settings_signal_id);
g_object_unref(e->proxy);
e->proxy = NULL;
}
if (e->dispatcher) {
mms_dispatcher_set_delegate(e->dispatcher, NULL);
mms_dispatcher_unref(e->dispatcher);
e->dispatcher = NULL;
}
if (e->settings) {
mms_settings_unref(e->settings);
e->settings = NULL;
}
if (e->cm) {
mms_connman_unref(e->cm);
e->cm = NULL;
MMSEngine* mms = MMS_ENGINE(object);
MMS_VERBOSE_("%p", mms);
MMS_ASSERT(!mms->loop);
mms_engine_unregister(mms);
mms_engine_start_timeout_cancel(mms);
if (mms->proxy) {
gutil_disconnect_handlers(mms->proxy, mms->proxy_signal_id,
G_N_ELEMENTS(mms->proxy_signal_id));
g_object_unref(mms->proxy);
mms->proxy = NULL;
}
if (mms->dispatcher) {
mms_dispatcher_set_delegate(mms->dispatcher, NULL);
mms_dispatcher_unref(mms->dispatcher);
mms->dispatcher = NULL;
}
if (mms->settings) {
mms_settings_unref(mms->settings);
mms->settings = NULL;
}
if (mms->cm) {
mms_connman_unref(mms->cm);
mms->cm = NULL;
}
G_OBJECT_CLASS(mms_engine_parent_class)->dispose(object);
}
Expand Down
44 changes: 26 additions & 18 deletions mms-lib/src/mms_task.c
Expand Up @@ -28,7 +28,12 @@ MMS_LOG_MODULE_DEFINE("mms-task");

#define MMS_TASK_DEFAULT_LIFETIME (600)

G_DEFINE_TYPE(MMSTask, mms_task, G_TYPE_OBJECT);
struct mms_task_priv {
guint wakeup_id; /* ID of the wakeup source */
time_t wakeup_time; /* Wake up time (if sleeping) */
};

G_DEFINE_TYPE(MMSTask, mms_task, G_TYPE_OBJECT)

#define MMS_TASK(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), MMS_TYPE_TASK, MMSTask))
Expand Down Expand Up @@ -56,8 +61,9 @@ gboolean
mms_task_wakeup_callback(
gpointer data)
{
MMSTask* task = data;
task->wakeup_id = 0;
MMSTask* task = MMS_TASK(data);
MMSTaskPriv* priv = task->priv;
priv->wakeup_id = 0;
MMS_ASSERT(task->state == MMS_TASK_STATE_SLEEP);
mms_task_set_state(task, MMS_TASK_STATE_READY);
return FALSE;
Expand All @@ -68,30 +74,31 @@ mms_task_schedule_wakeup(
MMSTask* task,
unsigned int secs)
{
MMSTaskPriv* priv = task->priv;
const time_t now = time(NULL);
if (!secs) secs = task->settings->config->retry_secs;

/* Cancel the previous sleep */
if (task->wakeup_id) {
if (priv->wakeup_id) {
MMS_ASSERT(task->state == MMS_TASK_STATE_SLEEP);
g_source_remove(task->wakeup_id);
task->wakeup_id = 0;
g_source_remove(priv->wakeup_id);
priv->wakeup_id = 0;
}

if (now < task->deadline) {
/* Don't sleep past deadline */
const unsigned int max_secs = task->deadline - now;
if (secs > max_secs) secs = max_secs;
/* Schedule wakeup */
task->wakeup_time = now + secs;
task->wakeup_id = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT,
priv->wakeup_time = now + secs;
priv->wakeup_id = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT,
secs, mms_task_wakeup_callback, mms_task_ref(task),
mms_task_wakeup_free);
MMS_ASSERT(task->wakeup_id);
MMS_ASSERT(priv->wakeup_id);
MMS_VERBOSE("%s sleeping for %u sec", task->name, secs);
}

return (task->wakeup_id > 0);
return (priv->wakeup_id > 0);
}

gboolean
Expand All @@ -109,10 +116,11 @@ void
mms_task_cancel_cb(
MMSTask* task)
{
if (task->wakeup_id) {
MMSTaskPriv* priv = task->priv;
if (priv->wakeup_id) {
MMS_ASSERT(task->state == MMS_TASK_STATE_SLEEP);
g_source_remove(task->wakeup_id);
task->wakeup_id = 0;
g_source_remove(priv->wakeup_id);
priv->wakeup_id = 0;
}
task->flags |= MMS_TASK_FLAG_CANCELLED;
mms_task_set_state(task, MMS_TASK_STATE_DONE);
Expand All @@ -126,7 +134,7 @@ mms_task_finalize(
MMSTask* task = MMS_TASK(object);
MMS_VERBOSE_("%p", task);
MMS_ASSERT(!task->delegate);
MMS_ASSERT(!task->wakeup_id);
MMS_ASSERT(!task->priv->wakeup_id);
MMS_ASSERT(mms_task_count > 0);
if (!(--mms_task_count)) {
MMS_VERBOSE("Last task is gone");
Expand Down Expand Up @@ -155,6 +163,7 @@ mms_task_class_init(
MMSTaskClass* klass)
{
klass->fn_cancel = mms_task_cancel_cb;
g_type_class_add_private(klass, sizeof(MMSTaskPriv));
G_OBJECT_CLASS(klass)->finalize = mms_task_finalize;
}

Expand All @@ -166,6 +175,7 @@ mms_task_init(
MMS_VERBOSE_("%p", task);
mms_task_count++;
task->order = mms_task_order++;
task->priv = G_TYPE_INSTANCE_GET_PRIVATE(task, MMS_TYPE_TASK, MMSTaskPriv);
}

void*
Expand Down Expand Up @@ -215,7 +225,6 @@ mms_task_run(
{
MMS_ASSERT(task->state == MMS_TASK_STATE_READY);
MMS_TASK_GET_CLASS(task)->fn_run(task);
time(&task->last_run_time);
MMS_ASSERT(task->state != MMS_TASK_STATE_READY);
}

Expand All @@ -227,7 +236,6 @@ mms_task_transmit(
MMS_ASSERT(task->state == MMS_TASK_STATE_NEED_CONNECTION ||
task->state == MMS_TASK_STATE_NEED_USER_CONNECTION);
MMS_TASK_GET_CLASS(task)->fn_transmit(task, connection);
time(&task->last_run_time);
MMS_ASSERT(task->state != MMS_TASK_STATE_NEED_CONNECTION &&
task->state != MMS_TASK_STATE_NEED_USER_CONNECTION);
}
Expand All @@ -245,7 +253,6 @@ mms_task_network_unavailable(
MMS_ASSERT(task->state != MMS_TASK_STATE_NEED_CONNECTION &&
task->state != MMS_TASK_STATE_NEED_USER_CONNECTION &&
task->state != MMS_TASK_STATE_TRANSMITTING);
time(&task->last_run_time);
}
}

Expand All @@ -262,11 +269,12 @@ mms_task_set_state(
MMSTask* task,
MMS_TASK_STATE state)
{
MMSTaskPriv* priv = task->priv;
if (task->state != state) {
MMS_DEBUG("%s %s -> %s", task->name,
mms_task_state_name(task->state),
mms_task_state_name(state));
if (state == MMS_TASK_STATE_SLEEP && !task->wakeup_id) {
if (state == MMS_TASK_STATE_SLEEP && !priv->wakeup_id) {
const unsigned int secs = task_config(task)->retry_secs;
if (!mms_task_schedule_wakeup(task, secs)) {
MMS_DEBUG("%s SLEEP -> DONE (no time left)", task->name);
Expand Down
5 changes: 2 additions & 3 deletions mms-lib/src/mms_task.h
Expand Up @@ -45,6 +45,7 @@ typedef enum _MMS_TASK_PRIORITY {

/* Delegate (one per task) */
typedef struct mms_task MMSTask;
typedef struct mms_task_priv MMSTaskPriv;
typedef struct mms_task_delegate MMSTaskDelegate;
struct mms_task_delegate {
/* Submits new task to the queue */
Expand All @@ -60,6 +61,7 @@ struct mms_task_delegate {
/* Task object */
struct mms_task {
GObject parent; /* Parent object */
MMSTaskPriv* priv; /* Private data */
MMS_TASK_PRIORITY priority; /* Task priority */
int order; /* Task creation order */
char* name; /* Task name for debug purposes */
Expand All @@ -69,10 +71,7 @@ struct mms_task {
MMSHandler* handler; /* Message database interface */
MMSTaskDelegate* delegate; /* Observer */
MMS_TASK_STATE state; /* Task state */
time_t last_run_time; /* Last run time */
time_t deadline; /* Task deadline */
time_t wakeup_time; /* Wake up time (if sleeping) */
guint wakeup_id; /* ID of the wakeup source */
int flags; /* Flags: */

#define MMS_TASK_FLAG_CANCELLED (0x01) /* Task has been cancelled */
Expand Down

0 comments on commit e63539b

Please sign in to comment.