diff options
-rw-r--r-- | src/pop-transaction.c | 394 |
1 files changed, 197 insertions, 197 deletions
diff --git a/src/pop-transaction.c b/src/pop-transaction.c index 0c7bebe..5938fcd 100644 --- a/src/pop-transaction.c +++ b/src/pop-transaction.c @@ -389,25 +389,6 @@ pop_transaction_get_property (GObject *object, } } -PopTransaction * -pop_transaction_new (void) -{ - PopTransaction *transaction; - - transaction = g_object_new (POP_TYPE_TRANSACTION, NULL); - - return transaction; -} - -PopTransactionStatus -pop_transaction_get_status (PopTransaction *transaction) -{ - g_return_val_if_fail (POP_IS_TRANSACTION (transaction), - POP_TRANSACTION_STATUS_FAILED); - - return transaction->priv->status; -} - static void pop_transaction_set_status (PopTransaction *transaction, PopTransactionStatus status) @@ -454,48 +435,6 @@ pop_action_free (PopAction *action) g_slice_free (PopAction, action); } -void -pop_transaction_add_action_full (PopTransaction *transaction, - PopActionProcessFunc action_process_func, - PopActionRollbackFunc action_rollback_func, - gpointer user_data, - GDestroyNotify free_func) -{ - PopAction *action; - - g_return_if_fail (POP_IS_TRANSACTION (transaction)); - - action = pop_action_new (action_process_func, action_rollback_func, user_data, - free_func); - - if (transaction->priv->current_action_node == NULL) - { - g_queue_push_tail (transaction->priv->actions, action); - } - else - { - gboolean can_rewind; - - g_queue_insert_before (transaction->priv->actions, - transaction->priv->current_action_node, - action); - can_rewind = pop_transaction_rewind (transaction); - - g_assert (can_rewind); - } -} - -void -pop_transaction_add_action (PopTransaction *transaction, - PopActionProcessFunc action_process_func, - PopActionRollbackFunc action_rollback_func, - gpointer user_data) -{ - pop_transaction_add_action_full (transaction, action_process_func, - action_rollback_func, - user_data, NULL); -} - static PopActionProcessStatus pop_transaction_process_subtransaction (PopTransaction *transaction, PopTransaction *subtransaction) @@ -570,80 +509,6 @@ pop_transaction_rollback_subtransaction (PopTransaction *transaction, return POP_ACTION_ROLLBACK_STATUS_FINISHED; } -void -pop_transaction_add_subtransaction (PopTransaction *transaction, - PopTransaction *subtransaction) -{ - g_return_if_fail (POP_IS_TRANSACTION (transaction)); - g_return_if_fail (POP_IS_TRANSACTION (subtransaction)); - g_return_if_fail (!pop_transaction_is_committed (subtransaction)); - - pop_transaction_add_action_full (transaction, - (PopActionProcessFunc) - pop_transaction_process_subtransaction, - (PopActionRollbackFunc) - pop_transaction_rollback_subtransaction, - g_object_ref (subtransaction), - (GDestroyNotify) g_object_unref); -} - -void -pop_transaction_resume (PopTransaction *transaction) -{ - g_assert (POP_IS_TRANSACTION (transaction)); - - switch (transaction->priv->state) - { - case POP_TRANSACTION_STATE_PROCESSING: - pop_transaction_process_on_idle (transaction); - break; - - case POP_TRANSACTION_STATE_ROLLING_BACK: - pop_transaction_rollback_on_idle (transaction); - break; - - default: - break; - } - - if (transaction->priv->wait_id != 0) - { - g_source_remove (transaction->priv->wait_id); - transaction->priv->wait_id = 0; - } - - g_signal_emit (transaction, pop_transaction_signals[RESUME], 0); -} - -void -pop_transaction_wait (PopTransaction *transaction) -{ - g_return_if_fail (POP_IS_TRANSACTION (transaction)); - g_return_if_fail (pop_transaction_is_running_action (transaction)); - - switch (transaction->priv->state) - { - case POP_TRANSACTION_STATE_PROCESSING: - g_assert (transaction->priv->process_idle_id != 0); - g_assert (transaction->priv->rollback_idle_id == 0); - g_source_remove (transaction->priv->process_idle_id); - transaction->priv->process_idle_id = 0; - break; - - case POP_TRANSACTION_STATE_ROLLING_BACK: - g_assert (transaction->priv->rollback_idle_id != 0); - g_assert (transaction->priv->process_idle_id == 0); - g_source_remove (transaction->priv->rollback_idle_id); - transaction->priv->rollback_idle_id = 0; - break; - - default: - break; - } - - g_signal_emit (transaction, pop_transaction_signals[WAIT], 0); -} - static gboolean pop_transaction_on_fd_ready_resume (GIOChannel *channel, GIOCondition condition, @@ -659,32 +524,6 @@ pop_transaction_on_fd_ready_resume (GIOChannel *channel, return FALSE; } -void -pop_transaction_wait_for_fd (PopTransaction *transaction, - int fd, - GIOCondition condition, - GDestroyNotify destroy_notify) -{ - GIOChannel *channel; - GSource *source; - - g_return_if_fail (POP_IS_TRANSACTION (transaction)); - g_return_if_fail (pop_transaction_is_running_action (transaction)); - - pop_transaction_wait (transaction); - - channel = g_io_channel_unix_new (fd); - g_io_channel_set_buffered (channel, FALSE); - source = g_io_create_watch (channel, condition); - g_source_set_callback (source, - (GSourceFunc) pop_transaction_on_fd_ready_resume, - transaction, NULL); - transaction->priv->wait_id = g_source_attach (source, - transaction->priv->context); - g_source_unref (source); - g_io_channel_unref (channel); -} - static gboolean pop_transaction_on_timeout_resume (gpointer data) { @@ -699,26 +538,6 @@ pop_transaction_on_timeout_resume (gpointer data) return FALSE; } -void -pop_transaction_wait_a_while (PopTransaction *transaction, - int milliseconds) -{ - GSource *source; - - g_return_if_fail (POP_IS_TRANSACTION (transaction)); - g_return_if_fail (pop_transaction_is_running_action (transaction)); - - pop_transaction_wait (transaction); - - source = g_timeout_source_new (milliseconds); - g_source_set_callback (source, - (GSourceFunc) pop_transaction_on_timeout_resume, - transaction, NULL); - transaction->priv->wait_id = g_source_attach (source, - transaction->priv->context); - g_source_unref (source); -} - static guint pop_transaction_call_on_idle (PopTransaction *transaction, PopTransactionIdleFunc callback) @@ -1000,16 +819,6 @@ pop_transaction_is_attached (PopTransaction *transaction) return transaction->priv->context != NULL; } -void -pop_transaction_attach (PopTransaction *transaction, - GMainContext *context) -{ - g_return_if_fail (POP_IS_TRANSACTION (transaction)); - g_return_if_fail (!pop_transaction_is_attached (transaction)); - - transaction->priv->context = g_main_context_ref (context); -} - static gboolean pop_transaction_is_empty (PopTransaction *transaction) { @@ -1026,6 +835,203 @@ pop_transaction_is_committed (PopTransaction *transaction) return transaction->priv->state >= POP_TRANSACTION_STATE_COMMITED; } +static gboolean +pop_transaction_is_finished (PopTransaction *transaction) +{ + return transaction->priv->state == POP_TRANSACTION_STATE_FINISHED; +} + +PopTransaction * +pop_transaction_new (void) +{ + PopTransaction *transaction; + + transaction = g_object_new (POP_TYPE_TRANSACTION, NULL); + + return transaction; +} + +PopTransactionStatus +pop_transaction_get_status (PopTransaction *transaction) +{ + g_return_val_if_fail (POP_IS_TRANSACTION (transaction), + POP_TRANSACTION_STATUS_FAILED); + + return transaction->priv->status; +} + +void +pop_transaction_add_action_full (PopTransaction *transaction, + PopActionProcessFunc action_process_func, + PopActionRollbackFunc action_rollback_func, + gpointer user_data, + GDestroyNotify free_func) +{ + PopAction *action; + + g_return_if_fail (POP_IS_TRANSACTION (transaction)); + + action = pop_action_new (action_process_func, action_rollback_func, user_data, + free_func); + + if (transaction->priv->current_action_node == NULL) + { + g_queue_push_tail (transaction->priv->actions, action); + } + else + { + gboolean can_rewind; + + g_queue_insert_before (transaction->priv->actions, + transaction->priv->current_action_node, + action); + can_rewind = pop_transaction_rewind (transaction); + + g_assert (can_rewind); + } +} + +void +pop_transaction_add_action (PopTransaction *transaction, + PopActionProcessFunc action_process_func, + PopActionRollbackFunc action_rollback_func, + gpointer user_data) +{ + pop_transaction_add_action_full (transaction, action_process_func, + action_rollback_func, + user_data, NULL); +} + +void +pop_transaction_add_subtransaction (PopTransaction *transaction, + PopTransaction *subtransaction) +{ + g_return_if_fail (POP_IS_TRANSACTION (transaction)); + g_return_if_fail (POP_IS_TRANSACTION (subtransaction)); + g_return_if_fail (!pop_transaction_is_committed (subtransaction)); + + pop_transaction_add_action_full (transaction, + (PopActionProcessFunc) + pop_transaction_process_subtransaction, + (PopActionRollbackFunc) + pop_transaction_rollback_subtransaction, + g_object_ref (subtransaction), + (GDestroyNotify) g_object_unref); +} + +void +pop_transaction_resume (PopTransaction *transaction) +{ + g_assert (POP_IS_TRANSACTION (transaction)); + + switch (transaction->priv->state) + { + case POP_TRANSACTION_STATE_PROCESSING: + pop_transaction_process_on_idle (transaction); + break; + + case POP_TRANSACTION_STATE_ROLLING_BACK: + pop_transaction_rollback_on_idle (transaction); + break; + + default: + break; + } + + if (transaction->priv->wait_id != 0) + { + g_source_remove (transaction->priv->wait_id); + transaction->priv->wait_id = 0; + } + + g_signal_emit (transaction, pop_transaction_signals[RESUME], 0); +} + +void +pop_transaction_wait (PopTransaction *transaction) +{ + g_return_if_fail (POP_IS_TRANSACTION (transaction)); + g_return_if_fail (pop_transaction_is_running_action (transaction)); + + switch (transaction->priv->state) + { + case POP_TRANSACTION_STATE_PROCESSING: + g_assert (transaction->priv->process_idle_id != 0); + g_assert (transaction->priv->rollback_idle_id == 0); + g_source_remove (transaction->priv->process_idle_id); + transaction->priv->process_idle_id = 0; + break; + + case POP_TRANSACTION_STATE_ROLLING_BACK: + g_assert (transaction->priv->rollback_idle_id != 0); + g_assert (transaction->priv->process_idle_id == 0); + g_source_remove (transaction->priv->rollback_idle_id); + transaction->priv->rollback_idle_id = 0; + break; + + default: + break; + } + + g_signal_emit (transaction, pop_transaction_signals[WAIT], 0); +} + +void +pop_transaction_wait_for_fd (PopTransaction *transaction, + int fd, + GIOCondition condition, + GDestroyNotify destroy_notify) +{ + GIOChannel *channel; + GSource *source; + + g_return_if_fail (POP_IS_TRANSACTION (transaction)); + g_return_if_fail (pop_transaction_is_running_action (transaction)); + + pop_transaction_wait (transaction); + + channel = g_io_channel_unix_new (fd); + g_io_channel_set_buffered (channel, FALSE); + source = g_io_create_watch (channel, condition); + g_source_set_callback (source, + (GSourceFunc) pop_transaction_on_fd_ready_resume, + transaction, NULL); + transaction->priv->wait_id = g_source_attach (source, + transaction->priv->context); + g_source_unref (source); + g_io_channel_unref (channel); +} + +void +pop_transaction_wait_a_while (PopTransaction *transaction, + int milliseconds) +{ + GSource *source; + + g_return_if_fail (POP_IS_TRANSACTION (transaction)); + g_return_if_fail (pop_transaction_is_running_action (transaction)); + + pop_transaction_wait (transaction); + + source = g_timeout_source_new (milliseconds); + g_source_set_callback (source, + (GSourceFunc) pop_transaction_on_timeout_resume, + transaction, NULL); + transaction->priv->wait_id = g_source_attach (source, + transaction->priv->context); + g_source_unref (source); +} + +void +pop_transaction_attach (PopTransaction *transaction, + GMainContext *context) +{ + g_return_if_fail (POP_IS_TRANSACTION (transaction)); + g_return_if_fail (!pop_transaction_is_attached (transaction)); + + transaction->priv->context = g_main_context_ref (context); +} + void pop_transaction_commit (PopTransaction *transaction) { @@ -1038,12 +1044,6 @@ pop_transaction_commit (PopTransaction *transaction) transaction->priv->state = POP_TRANSACTION_STATE_COMMITED; } -static gboolean -pop_transaction_is_finished (PopTransaction *transaction) -{ - return transaction->priv->state == POP_TRANSACTION_STATE_FINISHED; -} - void pop_transaction_cancel (PopTransaction *transaction) { |