Commit 660af6cc authored by Christian Hergert's avatar Christian Hergert

libide: port remaining objects to IdeTask

Not everything has to be moved to GTask, but most things should so that we
know exactly what is going on thread usage wise.
parent a481f8d8
......@@ -22,6 +22,7 @@
#include "application/ide-application-private.h"
#include "workbench/ide-workbench.h"
#include "vcs/ide-vcs.h"
#include "threading/ide-task.h"
typedef struct
{
......@@ -29,7 +30,7 @@ typedef struct
gchar *hint;
} IdeApplicationOpen;
static void ide_application_open_tick (GTask *task);
static void ide_application_open_tick (IdeTask *task);
static void
ide_application_open_free (gpointer data)
......@@ -104,14 +105,14 @@ ide_application_open_project_cb (GObject *object,
{
IdeWorkbench *workbench = (IdeWorkbench *)object;
IdeApplicationOpen *state;
g_autoptr(GTask) task = user_data;
g_autoptr(IdeTask) task = user_data;
g_autoptr(GError) error = NULL;
g_autoptr(GFile) file = NULL;
g_assert (IDE_IS_WORKBENCH (workbench));
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_TASK (task));
state = g_task_get_task_data (task);
state = ide_task_get_task_data (task);
file = g_object_ref (g_ptr_array_index (state->files, state->files->len - 1));
g_ptr_array_remove_index (state->files, state->files->len - 1);
......@@ -127,7 +128,7 @@ ide_application_open_project_cb (GObject *object,
&file, 1,
state->hint,
0,
g_task_get_cancellable (task),
ide_task_get_cancellable (task),
NULL,
NULL);
gtk_window_present (GTK_WINDOW (workbench));
......@@ -137,7 +138,7 @@ ide_application_open_project_cb (GObject *object,
}
static void
ide_application_open_tick (GTask *task)
ide_application_open_tick (IdeTask *task)
{
IdeApplication *self;
IdeApplicationOpen *state;
......@@ -146,11 +147,11 @@ ide_application_open_tick (GTask *task)
GFile *next;
guint i;
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_TASK (task));
self = g_task_get_source_object (task);
state = g_task_get_task_data (task);
cancellable = g_task_get_cancellable (task);
self = ide_task_get_source_object (task);
state = ide_task_get_task_data (task);
cancellable = ide_task_get_cancellable (task);
g_assert (IDE_IS_APPLICATION (self));
g_assert (state != NULL);
......@@ -182,7 +183,7 @@ ide_application_open_tick (GTask *task)
*/
if (state->files->len == 0)
{
g_task_return_boolean (task, TRUE);
ide_task_return_boolean (task, TRUE);
return;
}
......@@ -215,7 +216,7 @@ ide_application_open_async (IdeApplication *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
g_autoptr(GTask) task = NULL;
g_autoptr(IdeTask) task = NULL;
g_autoptr(GPtrArray) ar = NULL;
IdeApplicationOpen *state;
guint i;
......@@ -224,9 +225,9 @@ ide_application_open_async (IdeApplication *self,
g_return_if_fail (!n_files || files != NULL);
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_source_tag (task, ide_application_open_async);
g_task_set_check_cancellable (task, FALSE);
task = ide_task_new (self, cancellable, callback, user_data);
ide_task_set_source_tag (task, ide_application_open_async);
ide_task_set_check_cancellable (task, FALSE);
/*
* We have to open each file one at a time so that we don't race to
......@@ -247,7 +248,7 @@ ide_application_open_async (IdeApplication *self,
state->hint = g_strdup (hint);
state->files = g_steal_pointer (&ar);
g_task_set_task_data (task, state, ide_application_open_free);
ide_task_set_task_data (task, state, ide_application_open_free);
ide_application_open_tick (task);
}
......@@ -258,5 +259,5 @@ ide_application_open_finish (IdeApplication *self,
{
g_return_val_if_fail (IDE_IS_APPLICATION (self), FALSE);
return g_task_propagate_boolean (G_TASK (result), error);
return ide_task_propagate_boolean (IDE_TASK (result), error);
}
......@@ -45,6 +45,7 @@
#include "util/ide-posix.h"
#include "workbench/ide-workbench.h"
#include "workers/ide-worker.h"
#include "threading/ide-task.h"
/**
* SECTION:ide-application
......@@ -731,7 +732,7 @@ ide_application_get_worker_cb (GObject *object,
gpointer user_data)
{
IdeWorkerManager *worker_manager = (IdeWorkerManager *)object;
g_autoptr(GTask) task = user_data;
g_autoptr(IdeTask) task = user_data;
g_autoptr(GError) error = NULL;
GDBusProxy *proxy;
......@@ -740,9 +741,9 @@ ide_application_get_worker_cb (GObject *object,
proxy = ide_worker_manager_get_worker_finish (worker_manager, result, &error);
if (proxy == NULL)
g_task_return_error (task, g_steal_pointer (&error));
ide_task_return_error (task, g_steal_pointer (&error));
else
g_task_return_pointer (task, proxy, g_object_unref);
ide_task_return_pointer (task, proxy, g_object_unref);
}
/**
......@@ -770,7 +771,7 @@ ide_application_get_worker_async (IdeApplication *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
g_autoptr(GTask) task = NULL;
g_autoptr(IdeTask) task = NULL;
g_return_if_fail (IDE_IS_APPLICATION (self));
g_return_if_fail (plugin_name != NULL);
......@@ -782,7 +783,7 @@ ide_application_get_worker_async (IdeApplication *self,
if (self->worker_manager == NULL)
self->worker_manager = ide_worker_manager_new ();
task = g_task_new (self, cancellable, callback, user_data);
task = ide_task_new (self, cancellable, callback, user_data);
ide_worker_manager_get_worker_async (self->worker_manager,
plugin_name,
......@@ -806,13 +807,13 @@ ide_application_get_worker_finish (IdeApplication *self,
GAsyncResult *result,
GError **error)
{
GTask *task = (GTask *)result;
IdeTask *task = (IdeTask *)result;
g_return_val_if_fail (IDE_IS_APPLICATION (self), NULL);
g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL);
g_return_val_if_fail (G_IS_TASK (task), NULL);
g_return_val_if_fail (IDE_IS_TASK (task), NULL);
return g_task_propagate_pointer (task, error);
return ide_task_propagate_pointer (task, error);
}
/**
......
This diff is collapsed.
......@@ -50,6 +50,7 @@
#include "util/ide-battery-monitor.h"
#include "util/ide-gtk.h"
#include "vcs/ide-vcs.h"
#include "threading/ide-task.h"
#define DEFAULT_DIAGNOSE_TIMEOUT_MSEC 333
#define SETTLING_DELAY_MSEC 333
......@@ -2731,18 +2732,18 @@ ide_buffer_get_symbol_at_location_cb (GObject *object,
{
IdeSymbolResolver *symbol_resolver = (IdeSymbolResolver *)object;
g_autoptr(IdeSymbol) symbol = NULL;
g_autoptr(GTask) task = user_data;
g_autoptr(IdeTask) task = user_data;
g_autoptr(GError) error = NULL;
LookUpSymbolData *data;
g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_SYMBOL_RESOLVER (symbol_resolver));
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_TASK (task));
symbol = ide_symbol_resolver_lookup_symbol_finish (symbol_resolver, result, &error);
data = g_task_get_task_data (task);
data = ide_task_get_task_data (task);
g_assert (data->resolvers != NULL);
g_assert (data->resolvers->len > 0);
......@@ -2770,7 +2771,7 @@ ide_buffer_get_symbol_at_location_cb (GObject *object,
GCancellable *cancellable;
resolver = g_ptr_array_index (data->resolvers, data->resolvers->len - 1);
cancellable = g_task_get_cancellable (task);
cancellable = ide_task_get_cancellable (task);
ide_symbol_resolver_lookup_symbol_async (resolver,
data->location,
......@@ -2780,16 +2781,16 @@ ide_buffer_get_symbol_at_location_cb (GObject *object,
}
else if (data->symbol == NULL)
{
g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"Symbol not found");
ide_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"Symbol not found");
}
else
{
g_task_return_pointer (task,
g_steal_pointer (&data->symbol),
(GDestroyNotify)ide_symbol_unref);
ide_task_return_pointer (task,
g_steal_pointer (&data->symbol),
(GDestroyNotify)ide_symbol_unref);
}
}
......@@ -2813,7 +2814,7 @@ ide_buffer_get_symbol_at_location_async (IdeBuffer *self,
{
IdeBufferPrivate *priv = ide_buffer_get_instance_private (self);
g_autoptr(IdeSourceLocation) srcloc = NULL;
g_autoptr(GTask) task = NULL;
g_autoptr(IdeTask) task = NULL;
IdeExtensionSetAdapter *adapter;
IdeSymbolResolver *resolver;
LookUpSymbolData *data;
......@@ -2830,16 +2831,16 @@ ide_buffer_get_symbol_at_location_async (IdeBuffer *self,
adapter = ide_buffer_get_symbol_resolvers (self);
n_extensions = ide_extension_set_adapter_get_n_extensions (adapter);
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_priority (task, G_PRIORITY_LOW);
g_task_set_source_tag (task, ide_buffer_get_symbol_at_location_async);
task = ide_task_new (self, cancellable, callback, user_data);
ide_task_set_priority (task, G_PRIORITY_LOW);
ide_task_set_source_tag (task, ide_buffer_get_symbol_at_location_async);
if (n_extensions == 0)
{
g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_NOT_SUPPORTED,
_("The current language lacks a symbol resolver."));
ide_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_NOT_SUPPORTED,
_("The current language lacks a symbol resolver."));
return;
}
......@@ -2855,7 +2856,7 @@ ide_buffer_get_symbol_at_location_async (IdeBuffer *self,
ide_extension_set_adapter_foreach (adapter, lookup_symbol_get_extension, data);
g_assert (data->resolvers->len > 0);
g_task_set_task_data (task, data, (GDestroyNotify)lookup_symbol_task_data_free);
ide_task_set_task_data (task, data, (GDestroyNotify)lookup_symbol_task_data_free);
resolver = g_ptr_array_index (data->resolvers, data->resolvers->len - 1);
......@@ -2884,9 +2885,9 @@ ide_buffer_get_symbol_at_location_finish (IdeBuffer *self,
{
g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER (self), NULL);
g_return_val_if_fail (G_IS_TASK (result), NULL);
g_return_val_if_fail (IDE_IS_TASK (result), NULL);
return g_task_propagate_pointer (G_TASK (result), error);
return ide_task_propagate_pointer (IDE_TASK (result), error);
}
/**
......@@ -2903,9 +2904,9 @@ ide_buffer_get_symbols_finish (IdeBuffer *self,
{
g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_BUFFER (self), NULL);
g_return_val_if_fail (G_IS_TASK (result), NULL);
g_return_val_if_fail (IDE_IS_TASK (result), NULL);
return g_task_propagate_pointer (G_TASK (result), error);
return ide_task_propagate_pointer (IDE_TASK (result), error);
}
static gboolean
......@@ -3170,9 +3171,9 @@ ide_buffer_format_selection_cb (GObject *object,
g_autoptr(GError) error = NULL;
if (!ide_formatter_format_finish (IDE_FORMATTER (object), result, &error))
g_task_return_error (user_data, g_steal_pointer (&error));
ide_task_return_error (user_data, g_steal_pointer (&error));
else
g_task_return_boolean (user_data, TRUE);
ide_task_return_boolean (user_data, TRUE);
}
static void
......@@ -3183,9 +3184,9 @@ ide_buffer_format_selection_range_cb (GObject *object,
g_autoptr(GError) error = NULL;
if (!ide_formatter_format_range_finish (IDE_FORMATTER (object), result, &error))
g_task_return_error (user_data, g_steal_pointer (&error));
ide_task_return_error (user_data, g_steal_pointer (&error));
else
g_task_return_boolean (user_data, TRUE);
ide_task_return_boolean (user_data, TRUE);
}
void
......@@ -3196,7 +3197,7 @@ ide_buffer_format_selection_async (IdeBuffer *self,
gpointer user_data)
{
IdeBufferPrivate *priv = ide_buffer_get_instance_private (self);
g_autoptr(GTask) task = NULL;
g_autoptr(IdeTask) task = NULL;
IdeFormatter *formatter;
GtkTextIter begin;
GtkTextIter end;
......@@ -3208,8 +3209,8 @@ ide_buffer_format_selection_async (IdeBuffer *self,
g_return_if_fail (IDE_IS_FORMATTER_OPTIONS (options));
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_source_tag (task, ide_buffer_format_selection_async);
task = ide_task_new (self, cancellable, callback, user_data);
ide_task_set_source_tag (task, ide_buffer_format_selection_async);
formatter = ide_extension_adapter_get_extension (priv->formatter_adapter);
......@@ -3221,11 +3222,11 @@ ide_buffer_format_selection_async (IdeBuffer *self,
if (language != NULL)
language_id = gtk_source_language_get_id (language);
g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_NOT_SUPPORTED,
"No formatter registered for language %s",
language_id);
ide_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_NOT_SUPPORTED,
"No formatter registered for language %s",
language_id);
IDE_EXIT;
}
......@@ -3266,9 +3267,9 @@ ide_buffer_format_selection_finish (IdeBuffer *self,
g_return_val_if_fail (IDE_IS_MAIN_THREAD (), FALSE);
g_return_val_if_fail (IDE_IS_BUFFER (self), FALSE);
g_return_val_if_fail (G_IS_TASK (result), FALSE);
g_return_val_if_fail (IDE_IS_TASK (result), FALSE);
ret = g_task_propagate_boolean (G_TASK (result), error);
ret = ide_task_propagate_boolean (IDE_TASK (result), error);
IDE_RETURN (ret);
}
......
......@@ -33,6 +33,7 @@
#include "config/ide-configuration.h"
#include "buildsystem/ide-environment.h"
#include "vcs/ide-vcs.h"
#include "threading/ide-task.h"
#define DOT_BUILDCONFIG ".buildconfig"
......@@ -225,7 +226,7 @@ ide_buildconfig_configuration_provider_load_async (IdeConfigurationProvider *pro
{
IdeBuildconfigConfigurationProvider *self = (IdeBuildconfigConfigurationProvider *)provider;
g_autoptr(IdeConfiguration) fallback = NULL;
g_autoptr(GTask) task = NULL;
g_autoptr(IdeTask) task = NULL;
g_autoptr(GError) error = NULL;
g_autofree gchar *path = NULL;
g_auto(GStrv) groups = NULL;
......@@ -236,9 +237,9 @@ ide_buildconfig_configuration_provider_load_async (IdeConfigurationProvider *pro
g_assert (self->key_file == NULL);
g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_source_tag (task, ide_buildconfig_configuration_provider_load_async);
g_task_set_priority (task, G_PRIORITY_LOW);
task = ide_task_new (self, cancellable, callback, user_data);
ide_task_set_source_tag (task, ide_buildconfig_configuration_provider_load_async);
ide_task_set_priority (task, G_PRIORITY_LOW);
self->key_file = g_key_file_new ();
......@@ -289,7 +290,7 @@ add_default:
ide_configuration_provider_emit_added (provider, fallback);
complete:
g_task_return_boolean (task, TRUE);
ide_task_return_boolean (task, TRUE);
}
static gboolean
......@@ -298,10 +299,10 @@ ide_buildconfig_configuration_provider_load_finish (IdeConfigurationProvider *p
GError **error)
{
g_assert (IDE_IS_BUILDCONFIG_CONFIGURATION_PROVIDER (provider));
g_assert (G_IS_TASK (result));
g_assert (g_task_is_valid (G_TASK (result), provider));
g_assert (IDE_IS_TASK (result));
g_assert (ide_task_is_valid (IDE_TASK (result), provider));
return g_task_propagate_boolean (G_TASK (result), error);
return ide_task_propagate_boolean (IDE_TASK (result), error);
}
static void
......@@ -310,17 +311,17 @@ ide_buildconfig_configuration_provider_save_cb (GObject *object,
gpointer user_data)
{
GFile *file = (GFile *)object;
g_autoptr(GTask) task = user_data;
g_autoptr(IdeTask) task = user_data;
g_autoptr(GError) error = NULL;
g_assert (G_IS_FILE (file));
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_TASK (task));
if (!g_file_replace_contents_finish (file, result, NULL, &error))
g_task_return_error (task, g_steal_pointer (&error));
ide_task_return_error (task, g_steal_pointer (&error));
else
g_task_return_boolean (task, TRUE);
ide_task_return_boolean (task, TRUE);
}
static void
......@@ -331,7 +332,7 @@ ide_buildconfig_configuration_provider_save_async (IdeConfigurationProvider *pro
{
IdeBuildconfigConfigurationProvider *self = (IdeBuildconfigConfigurationProvider *)provider;
g_autoptr(GHashTable) group_names = NULL;
g_autoptr(GTask) task = NULL;
g_autoptr(IdeTask) task = NULL;
g_autoptr(GFile) file = NULL;
g_autoptr(GBytes) bytes = NULL;
g_autoptr(GError) error = NULL;
......@@ -347,9 +348,9 @@ ide_buildconfig_configuration_provider_save_async (IdeConfigurationProvider *pro
g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
g_assert (self->key_file != NULL);
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_source_tag (task, ide_buildconfig_configuration_provider_save_async);
g_task_set_priority (task, G_PRIORITY_LOW);
task = ide_task_new (self, cancellable, callback, user_data);
ide_task_set_source_tag (task, ide_buildconfig_configuration_provider_save_async);
ide_task_set_priority (task, G_PRIORITY_LOW);
dirty = self->key_file_dirty;
......@@ -362,7 +363,7 @@ ide_buildconfig_configuration_provider_save_async (IdeConfigurationProvider *pro
if (!dirty)
{
g_task_return_boolean (task, TRUE);
ide_task_return_boolean (task, TRUE);
return;
}
......@@ -481,7 +482,7 @@ ide_buildconfig_configuration_provider_save_async (IdeConfigurationProvider *pro
if (!(data = g_key_file_to_data (self->key_file, &length, &error)))
{
g_task_return_error (task, g_steal_pointer (&error));
ide_task_return_error (task, g_steal_pointer (&error));
return;
}
......@@ -491,7 +492,7 @@ ide_buildconfig_configuration_provider_save_async (IdeConfigurationProvider *pro
{
/* Remove the file if it exists, since it would be empty */
g_file_delete (file, cancellable, NULL);
g_task_return_boolean (task, TRUE);
ide_task_return_boolean (task, TRUE);
return;
}
......@@ -513,10 +514,10 @@ ide_buildconfig_configuration_provider_save_finish (IdeConfigurationProvider *p
GError **error)
{
g_assert (IDE_IS_BUILDCONFIG_CONFIGURATION_PROVIDER (provider));
g_assert (G_IS_TASK (result));
g_assert (g_task_is_valid (G_TASK (result), provider));
g_assert (IDE_IS_TASK (result));
g_assert (ide_task_is_valid (IDE_TASK (result), provider));
return g_task_propagate_boolean (G_TASK (result), error);
return ide_task_propagate_boolean (IDE_TASK (result), error);
}
static void
......
......@@ -38,6 +38,7 @@
#include "runtimes/ide-runtime.h"
#include "runtimes/ide-runtime-manager.h"
#include "runtimes/ide-runtime-private.h"
#include "threading/ide-task.h"
/**
* SECTION:ide-build-manager
......@@ -327,7 +328,7 @@ ide_build_manager_ensure_runtime_cb (GObject *object,
{
IdeRuntimeManager *runtime_manager = (IdeRuntimeManager *)object;
g_autoptr(GError) error = NULL;
g_autoptr(GTask) task = user_data;
g_autoptr(IdeTask) task = user_data;
IdeBuildPipeline *pipeline;
IdeBuildManager *self;
GCancellable *cancellable;
......@@ -336,10 +337,10 @@ ide_build_manager_ensure_runtime_cb (GObject *object,
g_assert (IDE_IS_RUNTIME_MANAGER (runtime_manager));
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_TASK (task));
self = g_task_get_source_object (task);
pipeline = g_task_get_task_data (task);
self = ide_task_get_source_object (task);
pipeline = ide_task_get_task_data (task);
g_assert (IDE_IS_BUILD_MANAGER (self));
g_assert (IDE_IS_BUILD_PIPELINE (pipeline));
......@@ -356,10 +357,10 @@ ide_build_manager_ensure_runtime_cb (GObject *object,
IDE_GOTO (failure);
}
if (g_task_return_error_if_cancelled (task))
if (ide_task_return_error_if_cancelled (task))
IDE_GOTO (failure);
cancellable = g_task_get_cancellable (task);
cancellable = ide_task_get_cancellable (task);
/* This will cause plugins to load on the pipeline. */
if (!g_initable_init (G_INITABLE (pipeline), cancellable, &error))
......@@ -375,19 +376,19 @@ ide_build_manager_ensure_runtime_cb (GObject *object,
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_PIPELINE]);
g_task_return_boolean (task, TRUE);
ide_task_return_boolean (task, TRUE);
IDE_EXIT;
failure:
if (error != NULL)
g_task_return_error (task, g_steal_pointer (&error));
ide_task_return_error (task, g_steal_pointer (&error));
else
g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_FAILED,
"Failed to setup build pipeline");
ide_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_FAILED,
"Failed to setup build pipeline");
IDE_EXIT;
}
......@@ -400,7 +401,7 @@ ide_build_manager_device_get_info_cb (GObject *object,
IdeDevice *device = (IdeDevice *)object;
g_autoptr(IdeDeviceInfo) info = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(GTask) task = user_data;
g_autoptr(IdeTask) task = user_data;
IdeRuntimeManager *runtime_manager;
IdeBuildPipeline *pipeline;
IdeContext *context;
......@@ -409,9 +410,9 @@ ide_build_manager_device_get_info_cb (GObject *object,
g_assert (IDE_IS_DEVICE (device));
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_TASK (task));
pipeline = g_task_get_task_data (task);
pipeline = ide_task_get_task_data (task);
g_assert (IDE_IS_BUILD_PIPELINE (pipeline));
context = ide_object_get_context (IDE_OBJECT (pipeline));
......@@ -425,7 +426,7 @@ ide_build_manager_device_get_info_cb (GObject *object,
ide_context_warning (context,
_("Failed to get device information: %s"),
error->message);
g_task_return_error (task, g_steal_pointer (&error));
ide_task_return_error (task, g_steal_pointer (&error));
IDE_EXIT;
}