diff options
Diffstat (limited to 'src/threads')
-rw-r--r-- | src/threads/BackgroundJob.c | 1911 | ||||
-rw-r--r-- | src/threads/Semaphore.c | 1159 | ||||
-rw-r--r-- | src/threads/Threads.c | 28 | ||||
-rw-r--r-- | src/threads/Workers.c | 1074 | ||||
-rw-r--r-- | src/threads/mk/threads.mk | 30 |
5 files changed, 4172 insertions, 30 deletions
diff --git a/src/threads/BackgroundJob.c b/src/threads/BackgroundJob.c new file mode 100644 index 0000000..94c8745 --- /dev/null +++ b/src/threads/BackgroundJob.c @@ -0,0 +1,1911 @@ +/* BackgroundJob.c generated by valac 0.32.1, the Vala compiler + * generated from BackgroundJob.vala, do not modify */ + +/* Copyright 2016 Software Freedom Conservancy Inc. + * + * This software is licensed under the GNU LGPL (version 2.1 or later). + * See the COPYING file in this distribution. + */ +/* This callback is executed when an associated BackgroundJob completes. It is called from within*/ +/* the Gtk event loop, *not* the background thread's context.*/ + +#include <glib.h> +#include <glib-object.h> +#include <gio/gio.h> +#include <gee.h> +#include <gobject/gvaluecollector.h> + + +#define TYPE_BACKGROUND_JOB (background_job_get_type ()) +#define BACKGROUND_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BACKGROUND_JOB, BackgroundJob)) +#define BACKGROUND_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BACKGROUND_JOB, BackgroundJobClass)) +#define IS_BACKGROUND_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BACKGROUND_JOB)) +#define IS_BACKGROUND_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BACKGROUND_JOB)) +#define BACKGROUND_JOB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BACKGROUND_JOB, BackgroundJobClass)) + +typedef struct _BackgroundJob BackgroundJob; +typedef struct _BackgroundJobClass BackgroundJobClass; + +#define TYPE_NOTIFICATION_OBJECT (notification_object_get_type ()) +#define NOTIFICATION_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_NOTIFICATION_OBJECT, NotificationObject)) +#define NOTIFICATION_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_NOTIFICATION_OBJECT, NotificationObjectClass)) +#define IS_NOTIFICATION_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_NOTIFICATION_OBJECT)) +#define IS_NOTIFICATION_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_NOTIFICATION_OBJECT)) +#define NOTIFICATION_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_NOTIFICATION_OBJECT, NotificationObjectClass)) + +typedef struct _NotificationObject NotificationObject; +typedef struct _NotificationObjectClass NotificationObjectClass; +typedef struct _NotificationObjectPrivate NotificationObjectPrivate; +typedef struct _ParamSpecNotificationObject ParamSpecNotificationObject; + +#define TYPE_INTERLOCKED_NOTIFICATION_OBJECT (interlocked_notification_object_get_type ()) +#define INTERLOCKED_NOTIFICATION_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_INTERLOCKED_NOTIFICATION_OBJECT, InterlockedNotificationObject)) +#define INTERLOCKED_NOTIFICATION_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_INTERLOCKED_NOTIFICATION_OBJECT, InterlockedNotificationObjectClass)) +#define IS_INTERLOCKED_NOTIFICATION_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_INTERLOCKED_NOTIFICATION_OBJECT)) +#define IS_INTERLOCKED_NOTIFICATION_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_INTERLOCKED_NOTIFICATION_OBJECT)) +#define INTERLOCKED_NOTIFICATION_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_INTERLOCKED_NOTIFICATION_OBJECT, InterlockedNotificationObjectClass)) + +typedef struct _InterlockedNotificationObject InterlockedNotificationObject; +typedef struct _InterlockedNotificationObjectClass InterlockedNotificationObjectClass; +typedef struct _InterlockedNotificationObjectPrivate InterlockedNotificationObjectPrivate; + +#define TYPE_ABSTRACT_SEMAPHORE (abstract_semaphore_get_type ()) +#define ABSTRACT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)) +#define ABSTRACT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphoreClass)) +#define IS_ABSTRACT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_ABSTRACT_SEMAPHORE)) +#define IS_ABSTRACT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_ABSTRACT_SEMAPHORE)) +#define ABSTRACT_SEMAPHORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphoreClass)) + +typedef struct _AbstractSemaphore AbstractSemaphore; +typedef struct _AbstractSemaphoreClass AbstractSemaphoreClass; + +#define TYPE_SEMAPHORE (semaphore_get_type ()) +#define SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SEMAPHORE, Semaphore)) +#define SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SEMAPHORE, SemaphoreClass)) +#define IS_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SEMAPHORE)) +#define IS_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SEMAPHORE)) +#define SEMAPHORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SEMAPHORE, SemaphoreClass)) + +typedef struct _Semaphore Semaphore; +typedef struct _SemaphoreClass SemaphoreClass; +#define _abstract_semaphore_unref0(var) ((var == NULL) ? NULL : (var = (abstract_semaphore_unref (var), NULL))) +typedef struct _BackgroundJobPrivate BackgroundJobPrivate; + +#define BACKGROUND_JOB_TYPE_JOB_PRIORITY (background_job_job_priority_get_type ()) + +#define BACKGROUND_JOB_TYPE_NOTIFICATION_JOB (background_job_notification_job_get_type ()) +#define BACKGROUND_JOB_NOTIFICATION_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BACKGROUND_JOB_TYPE_NOTIFICATION_JOB, BackgroundJobNotificationJob)) +#define BACKGROUND_JOB_NOTIFICATION_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BACKGROUND_JOB_TYPE_NOTIFICATION_JOB, BackgroundJobNotificationJobClass)) +#define BACKGROUND_JOB_IS_NOTIFICATION_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BACKGROUND_JOB_TYPE_NOTIFICATION_JOB)) +#define BACKGROUND_JOB_IS_NOTIFICATION_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BACKGROUND_JOB_TYPE_NOTIFICATION_JOB)) +#define BACKGROUND_JOB_NOTIFICATION_JOB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BACKGROUND_JOB_TYPE_NOTIFICATION_JOB, BackgroundJobNotificationJobClass)) + +typedef struct _BackgroundJobNotificationJob BackgroundJobNotificationJob; +typedef struct _BackgroundJobNotificationJobClass BackgroundJobNotificationJobClass; +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) +#define _background_job_unref0(var) ((var == NULL) ? NULL : (var = (background_job_unref (var), NULL))) +#define _background_job_notification_job_unref0(var) ((var == NULL) ? NULL : (var = (background_job_notification_job_unref (var), NULL))) +#define _notification_object_unref0(var) ((var == NULL) ? NULL : (var = (notification_object_unref (var), NULL))) +typedef struct _BackgroundJobNotificationJobPrivate BackgroundJobNotificationJobPrivate; +typedef struct _BackgroundJobParamSpecNotificationJob BackgroundJobParamSpecNotificationJob; +typedef struct _ParamSpecBackgroundJob ParamSpecBackgroundJob; +#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); +#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; } +#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; } +#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + +typedef void (*CompletionCallback) (BackgroundJob* job, void* user_data); +typedef void (*CancellationCallback) (BackgroundJob* job, void* user_data); +struct _NotificationObject { + GTypeInstance parent_instance; + volatile int ref_count; + NotificationObjectPrivate * priv; +}; + +struct _NotificationObjectClass { + GTypeClass parent_class; + void (*finalize) (NotificationObject *self); +}; + +struct _ParamSpecNotificationObject { + GParamSpec parent_instance; +}; + +struct _InterlockedNotificationObject { + NotificationObject parent_instance; + InterlockedNotificationObjectPrivate * priv; +}; + +struct _InterlockedNotificationObjectClass { + NotificationObjectClass parent_class; +}; + +struct _InterlockedNotificationObjectPrivate { + Semaphore* semaphore; +}; + +typedef void (*NotificationCallback) (BackgroundJob* job, NotificationObject* user, void* user_data); +typedef enum { + BACKGROUND_JOB_JOB_PRIORITY_HIGHEST = 100, + BACKGROUND_JOB_JOB_PRIORITY_HIGH = 75, + BACKGROUND_JOB_JOB_PRIORITY_NORMAL = 50, + BACKGROUND_JOB_JOB_PRIORITY_LOW = 25, + BACKGROUND_JOB_JOB_PRIORITY_LOWEST = 0 +} BackgroundJobJobPriority; + +struct _BackgroundJob { + GTypeInstance parent_instance; + volatile int ref_count; + BackgroundJobPrivate * priv; +}; + +struct _BackgroundJobClass { + GTypeClass parent_class; + void (*finalize) (BackgroundJob *self); + void (*execute) (BackgroundJob* self); + BackgroundJobJobPriority (*get_priority) (BackgroundJob* self); +}; + +struct _BackgroundJobPrivate { + GObject* owner; + CompletionCallback callback; + gpointer callback_target; + GCancellable* cancellable; + CancellationCallback cancellation; + gpointer cancellation_target; + BackgroundJob* self; + AbstractSemaphore* semaphore; + gint completion_priority; + gint notification_priority; +}; + +struct _BackgroundJobNotificationJob { + GTypeInstance parent_instance; + volatile int ref_count; + BackgroundJobNotificationJobPrivate * priv; + NotificationCallback callback; + gpointer callback_target; + BackgroundJob* background_job; + NotificationObject* user; +}; + +struct _BackgroundJobNotificationJobClass { + GTypeClass parent_class; + void (*finalize) (BackgroundJobNotificationJob *self); +}; + +struct _BackgroundJobParamSpecNotificationJob { + GParamSpec parent_instance; +}; + +struct _ParamSpecBackgroundJob { + GParamSpec parent_instance; +}; + + +static gpointer notification_object_parent_class = NULL; +static gpointer interlocked_notification_object_parent_class = NULL; +static gpointer background_job_parent_class = NULL; +static GeeArrayList* background_job_notify_queue; +static GRecMutex __lock_background_job_notify_queue = {0}; +static GeeArrayList* background_job_notify_queue = NULL; +static gpointer background_job_notification_job_parent_class = NULL; + +gpointer background_job_ref (gpointer instance); +void background_job_unref (gpointer instance); +GParamSpec* param_spec_background_job (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void value_set_background_job (GValue* value, gpointer v_object); +void value_take_background_job (GValue* value, gpointer v_object); +gpointer value_get_background_job (const GValue* value); +GType background_job_get_type (void) G_GNUC_CONST; +gpointer notification_object_ref (gpointer instance); +void notification_object_unref (gpointer instance); +GParamSpec* param_spec_notification_object (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void value_set_notification_object (GValue* value, gpointer v_object); +void value_take_notification_object (GValue* value, gpointer v_object); +gpointer value_get_notification_object (const GValue* value); +GType notification_object_get_type (void) G_GNUC_CONST; +enum { + NOTIFICATION_OBJECT_DUMMY_PROPERTY +}; +NotificationObject* notification_object_construct (GType object_type); +static void notification_object_finalize (NotificationObject* obj); +GType interlocked_notification_object_get_type (void) G_GNUC_CONST; +gpointer abstract_semaphore_ref (gpointer instance); +void abstract_semaphore_unref (gpointer instance); +GParamSpec* param_spec_abstract_semaphore (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void value_set_abstract_semaphore (GValue* value, gpointer v_object); +void value_take_abstract_semaphore (GValue* value, gpointer v_object); +gpointer value_get_abstract_semaphore (const GValue* value); +GType abstract_semaphore_get_type (void) G_GNUC_CONST; +GType semaphore_get_type (void) G_GNUC_CONST; +#define INTERLOCKED_NOTIFICATION_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_INTERLOCKED_NOTIFICATION_OBJECT, InterlockedNotificationObjectPrivate)) +enum { + INTERLOCKED_NOTIFICATION_OBJECT_DUMMY_PROPERTY +}; +Semaphore* semaphore_new (void); +Semaphore* semaphore_construct (GType object_type); +void interlocked_notification_object_internal_wait_for_completion (InterlockedNotificationObject* self); +void abstract_semaphore_wait (AbstractSemaphore* self); +void interlocked_notification_object_internal_completed (InterlockedNotificationObject* self); +void abstract_semaphore_notify (AbstractSemaphore* self); +InterlockedNotificationObject* interlocked_notification_object_construct (GType object_type); +static void interlocked_notification_object_finalize (NotificationObject* obj); +GType background_job_job_priority_get_type (void) G_GNUC_CONST; +#define BACKGROUND_JOB_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_BACKGROUND_JOB, BackgroundJobPrivate)) +enum { + BACKGROUND_JOB_DUMMY_PROPERTY +}; +gint background_job_job_priority_compare (BackgroundJobJobPriority self, BackgroundJobJobPriority other); +gint background_job_job_priority_compare_func (void* a, void* b); +static gpointer background_job_notification_job_ref (gpointer instance); +static void background_job_notification_job_unref (gpointer instance); +static GParamSpec* background_job_param_spec_notification_job (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) G_GNUC_UNUSED; +static void background_job_value_set_notification_job (GValue* value, gpointer v_object) G_GNUC_UNUSED; +static void background_job_value_take_notification_job (GValue* value, gpointer v_object) G_GNUC_UNUSED; +static gpointer background_job_value_get_notification_job (const GValue* value) G_GNUC_UNUSED; +static GType background_job_notification_job_get_type (void) G_GNUC_CONST G_GNUC_UNUSED; +BackgroundJob* background_job_construct (GType object_type, GObject* owner, CompletionCallback callback, void* callback_target, GCancellable* cancellable, CancellationCallback cancellation, void* cancellation_target, AbstractSemaphore* completion_semaphore); +void background_job_execute (BackgroundJob* self); +static void background_job_real_execute (BackgroundJob* self); +BackgroundJobJobPriority background_job_get_priority (BackgroundJob* self); +static BackgroundJobJobPriority background_job_real_get_priority (BackgroundJob* self); +gint background_job_priority_compare_func (BackgroundJob* a, BackgroundJob* b); +gint64 background_job_priority_comparator (void* a, void* b); +void background_job_set_completion_priority (BackgroundJob* self, gint priority); +void background_job_set_notification_priority (BackgroundJob* self, gint priority); +void background_job_wait_for_completion (BackgroundJob* self); +GCancellable* background_job_get_cancellable (BackgroundJob* self); +gboolean background_job_is_cancelled (BackgroundJob* self); +void background_job_cancel (BackgroundJob* self); +void background_job_internal_notify_completion (BackgroundJob* self); +static gboolean background_job_on_notify_completion (BackgroundJob* self); +static gboolean _background_job_on_notify_completion_gsource_func (gpointer self); +void background_job_notify (BackgroundJob* self, NotificationCallback callback, void* callback_target, NotificationObject* user); +static BackgroundJobNotificationJob* background_job_notification_job_new (NotificationCallback callback, void* callback_target, BackgroundJob* background_job, NotificationObject* user); +static BackgroundJobNotificationJob* background_job_notification_job_construct (GType object_type, NotificationCallback callback, void* callback_target, BackgroundJob* background_job, NotificationObject* user); +static gboolean background_job_on_notification_ready (BackgroundJob* self); +static gboolean _background_job_on_notification_ready_gsource_func (gpointer self); +enum { + BACKGROUND_JOB_NOTIFICATION_JOB_DUMMY_PROPERTY +}; +static void background_job_notification_job_finalize (BackgroundJobNotificationJob* obj); +static void background_job_finalize (BackgroundJob* obj); + + +NotificationObject* notification_object_construct (GType object_type) { + NotificationObject* self = NULL; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self = (NotificationObject*) g_type_create_instance (object_type); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return self; +#line 283 "BackgroundJob.c" +} + + +static void value_notification_object_init (GValue* value) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 290 "BackgroundJob.c" +} + + +static void value_notification_object_free_value (GValue* value) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (value->data[0].v_pointer) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + notification_object_unref (value->data[0].v_pointer); +#line 299 "BackgroundJob.c" + } +} + + +static void value_notification_object_copy_value (const GValue* src_value, GValue* dest_value) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (src_value->data[0].v_pointer) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + dest_value->data[0].v_pointer = notification_object_ref (src_value->data[0].v_pointer); +#line 309 "BackgroundJob.c" + } else { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + dest_value->data[0].v_pointer = NULL; +#line 313 "BackgroundJob.c" + } +} + + +static gpointer value_notification_object_peek_pointer (const GValue* value) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return value->data[0].v_pointer; +#line 321 "BackgroundJob.c" +} + + +static gchar* value_notification_object_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (collect_values[0].v_pointer) { +#line 328 "BackgroundJob.c" + NotificationObject* object; + object = collect_values[0].v_pointer; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (object->parent_instance.g_class == NULL) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 335 "BackgroundJob.c" + } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 339 "BackgroundJob.c" + } +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = notification_object_ref (object); +#line 343 "BackgroundJob.c" + } else { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 347 "BackgroundJob.c" + } +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return NULL; +#line 351 "BackgroundJob.c" +} + + +static gchar* value_notification_object_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + NotificationObject** object_p; + object_p = collect_values[0].v_pointer; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (!object_p) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); +#line 362 "BackgroundJob.c" + } +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (!value->data[0].v_pointer) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = NULL; +#line 368 "BackgroundJob.c" + } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = value->data[0].v_pointer; +#line 372 "BackgroundJob.c" + } else { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = notification_object_ref (value->data[0].v_pointer); +#line 376 "BackgroundJob.c" + } +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return NULL; +#line 380 "BackgroundJob.c" +} + + +GParamSpec* param_spec_notification_object (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) { + ParamSpecNotificationObject* spec; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (g_type_is_a (object_type, TYPE_NOTIFICATION_OBJECT), NULL); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + G_PARAM_SPEC (spec)->value_type = object_type; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return G_PARAM_SPEC (spec); +#line 394 "BackgroundJob.c" +} + + +gpointer value_get_notification_object (const GValue* value) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_NOTIFICATION_OBJECT), NULL); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return value->data[0].v_pointer; +#line 403 "BackgroundJob.c" +} + + +void value_set_notification_object (GValue* value, gpointer v_object) { + NotificationObject* old; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_NOTIFICATION_OBJECT)); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + old = value->data[0].v_pointer; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (v_object) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_NOTIFICATION_OBJECT)); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = v_object; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + notification_object_ref (value->data[0].v_pointer); +#line 423 "BackgroundJob.c" + } else { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 427 "BackgroundJob.c" + } +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (old) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + notification_object_unref (old); +#line 433 "BackgroundJob.c" + } +} + + +void value_take_notification_object (GValue* value, gpointer v_object) { + NotificationObject* old; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_NOTIFICATION_OBJECT)); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + old = value->data[0].v_pointer; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (v_object) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_NOTIFICATION_OBJECT)); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = v_object; +#line 452 "BackgroundJob.c" + } else { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 456 "BackgroundJob.c" + } +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (old) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + notification_object_unref (old); +#line 462 "BackgroundJob.c" + } +} + + +static void notification_object_class_init (NotificationObjectClass * klass) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + notification_object_parent_class = g_type_class_peek_parent (klass); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + ((NotificationObjectClass *) klass)->finalize = notification_object_finalize; +#line 472 "BackgroundJob.c" +} + + +static void notification_object_instance_init (NotificationObject * self) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->ref_count = 1; +#line 479 "BackgroundJob.c" +} + + +static void notification_object_finalize (NotificationObject* obj) { + NotificationObject * self; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_NOTIFICATION_OBJECT, NotificationObject); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_signal_handlers_destroy (self); +#line 489 "BackgroundJob.c" +} + + +GType notification_object_get_type (void) { + static volatile gsize notification_object_type_id__volatile = 0; + if (g_once_init_enter (¬ification_object_type_id__volatile)) { + static const GTypeValueTable g_define_type_value_table = { value_notification_object_init, value_notification_object_free_value, value_notification_object_copy_value, value_notification_object_peek_pointer, "p", value_notification_object_collect_value, "p", value_notification_object_lcopy_value }; + static const GTypeInfo g_define_type_info = { sizeof (NotificationObjectClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) notification_object_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (NotificationObject), 0, (GInstanceInitFunc) notification_object_instance_init, &g_define_type_value_table }; + static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) }; + GType notification_object_type_id; + notification_object_type_id = g_type_register_fundamental (g_type_fundamental_next (), "NotificationObject", &g_define_type_info, &g_define_type_fundamental_info, G_TYPE_FLAG_ABSTRACT); + g_once_init_leave (¬ification_object_type_id__volatile, notification_object_type_id); + } + return notification_object_type_id__volatile; +} + + +gpointer notification_object_ref (gpointer instance) { + NotificationObject* self; + self = instance; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_atomic_int_inc (&self->ref_count); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return instance; +#line 514 "BackgroundJob.c" +} + + +void notification_object_unref (gpointer instance) { + NotificationObject* self; + self = instance; +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (g_atomic_int_dec_and_test (&self->ref_count)) { +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + NOTIFICATION_OBJECT_GET_CLASS (self)->finalize (self); +#line 34 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_type_free_instance ((GTypeInstance *) self); +#line 527 "BackgroundJob.c" + } +} + + +void interlocked_notification_object_internal_wait_for_completion (InterlockedNotificationObject* self) { + Semaphore* _tmp0_ = NULL; +#line 41 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_INTERLOCKED_NOTIFICATION_OBJECT (self)); +#line 42 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = self->priv->semaphore; +#line 42 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + abstract_semaphore_wait (G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)); +#line 540 "BackgroundJob.c" +} + + +void interlocked_notification_object_internal_completed (InterlockedNotificationObject* self) { + Semaphore* _tmp0_ = NULL; +#line 46 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_INTERLOCKED_NOTIFICATION_OBJECT (self)); +#line 47 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = self->priv->semaphore; +#line 47 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + abstract_semaphore_notify (G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)); +#line 552 "BackgroundJob.c" +} + + +InterlockedNotificationObject* interlocked_notification_object_construct (GType object_type) { + InterlockedNotificationObject* self = NULL; +#line 37 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self = (InterlockedNotificationObject*) notification_object_construct (object_type); +#line 37 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return self; +#line 562 "BackgroundJob.c" +} + + +static void interlocked_notification_object_class_init (InterlockedNotificationObjectClass * klass) { +#line 37 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + interlocked_notification_object_parent_class = g_type_class_peek_parent (klass); +#line 37 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + ((NotificationObjectClass *) klass)->finalize = interlocked_notification_object_finalize; +#line 37 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_type_class_add_private (klass, sizeof (InterlockedNotificationObjectPrivate)); +#line 573 "BackgroundJob.c" +} + + +static void interlocked_notification_object_instance_init (InterlockedNotificationObject * self) { + Semaphore* _tmp0_ = NULL; +#line 37 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv = INTERLOCKED_NOTIFICATION_OBJECT_GET_PRIVATE (self); +#line 38 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = semaphore_new (); +#line 38 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->semaphore = _tmp0_; +#line 585 "BackgroundJob.c" +} + + +static void interlocked_notification_object_finalize (NotificationObject* obj) { + InterlockedNotificationObject * self; +#line 37 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_INTERLOCKED_NOTIFICATION_OBJECT, InterlockedNotificationObject); +#line 38 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _abstract_semaphore_unref0 (self->priv->semaphore); +#line 37 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + NOTIFICATION_OBJECT_CLASS (interlocked_notification_object_parent_class)->finalize (obj); +#line 597 "BackgroundJob.c" +} + + +GType interlocked_notification_object_get_type (void) { + static volatile gsize interlocked_notification_object_type_id__volatile = 0; + if (g_once_init_enter (&interlocked_notification_object_type_id__volatile)) { + static const GTypeInfo g_define_type_info = { sizeof (InterlockedNotificationObjectClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) interlocked_notification_object_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (InterlockedNotificationObject), 0, (GInstanceInitFunc) interlocked_notification_object_instance_init, NULL }; + GType interlocked_notification_object_type_id; + interlocked_notification_object_type_id = g_type_register_static (TYPE_NOTIFICATION_OBJECT, "InterlockedNotificationObject", &g_define_type_info, G_TYPE_FLAG_ABSTRACT); + g_once_init_leave (&interlocked_notification_object_type_id__volatile, interlocked_notification_object_type_id); + } + return interlocked_notification_object_type_id__volatile; +} + + +gint background_job_job_priority_compare (BackgroundJobJobPriority self, BackgroundJobJobPriority other) { + gint result = 0; + BackgroundJobJobPriority _tmp0_ = 0; +#line 75 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = other; +#line 75 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = ((gint) _tmp0_) - ((gint) self); +#line 75 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 622 "BackgroundJob.c" +} + + +gint background_job_job_priority_compare_func (void* a, void* b) { + gint result = 0; + void* _tmp0_ = NULL; + void* _tmp1_ = NULL; +#line 79 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = b; +#line 79 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = a; +#line 79 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = ((gint) _tmp0_) - ((gint) _tmp1_); +#line 79 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 638 "BackgroundJob.c" +} + + +GType background_job_job_priority_get_type (void) { + static volatile gsize background_job_job_priority_type_id__volatile = 0; + if (g_once_init_enter (&background_job_job_priority_type_id__volatile)) { + static const GEnumValue values[] = {{BACKGROUND_JOB_JOB_PRIORITY_HIGHEST, "BACKGROUND_JOB_JOB_PRIORITY_HIGHEST", "highest"}, {BACKGROUND_JOB_JOB_PRIORITY_HIGH, "BACKGROUND_JOB_JOB_PRIORITY_HIGH", "high"}, {BACKGROUND_JOB_JOB_PRIORITY_NORMAL, "BACKGROUND_JOB_JOB_PRIORITY_NORMAL", "normal"}, {BACKGROUND_JOB_JOB_PRIORITY_LOW, "BACKGROUND_JOB_JOB_PRIORITY_LOW", "low"}, {BACKGROUND_JOB_JOB_PRIORITY_LOWEST, "BACKGROUND_JOB_JOB_PRIORITY_LOWEST", "lowest"}, {0, NULL, NULL}}; + GType background_job_job_priority_type_id; + background_job_job_priority_type_id = g_enum_register_static ("BackgroundJobJobPriority", values); + g_once_init_leave (&background_job_job_priority_type_id__volatile, background_job_job_priority_type_id); + } + return background_job_job_priority_type_id__volatile; +} + + +static gpointer _g_object_ref0 (gpointer self) { +#line 116 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return self ? g_object_ref (self) : NULL; +#line 657 "BackgroundJob.c" +} + + +static gpointer _abstract_semaphore_ref0 (gpointer self) { +#line 120 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return self ? abstract_semaphore_ref (self) : NULL; +#line 664 "BackgroundJob.c" +} + + +BackgroundJob* background_job_construct (GType object_type, GObject* owner, CompletionCallback callback, void* callback_target, GCancellable* cancellable, CancellationCallback cancellation, void* cancellation_target, AbstractSemaphore* completion_semaphore) { + BackgroundJob* self = NULL; + GObject* _tmp0_ = NULL; + GObject* _tmp1_ = NULL; + CompletionCallback _tmp2_ = NULL; + void* _tmp2__target = NULL; + GCancellable* _tmp3_ = NULL; + GCancellable* _tmp4_ = NULL; + CancellationCallback _tmp5_ = NULL; + void* _tmp5__target = NULL; + AbstractSemaphore* _tmp6_ = NULL; + AbstractSemaphore* _tmp7_ = NULL; +#line 113 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail ((owner == NULL) || G_IS_OBJECT (owner), NULL); +#line 113 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail ((cancellable == NULL) || G_IS_CANCELLABLE (cancellable), NULL); +#line 113 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail ((completion_semaphore == NULL) || IS_ABSTRACT_SEMAPHORE (completion_semaphore), NULL); +#line 113 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self = (BackgroundJob*) g_type_create_instance (object_type); +#line 116 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = owner; +#line 116 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = _g_object_ref0 (_tmp0_); +#line 116 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _g_object_unref0 (self->priv->owner); +#line 116 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->owner = _tmp1_; +#line 117 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = callback; +#line 117 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2__target = callback_target; +#line 117 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->callback = _tmp2_; +#line 117 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->callback_target = _tmp2__target; +#line 118 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3_ = cancellable; +#line 118 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4_ = _g_object_ref0 (_tmp3_); +#line 118 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _g_object_unref0 (self->priv->cancellable); +#line 118 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->cancellable = _tmp4_; +#line 119 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp5_ = cancellation; +#line 119 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp5__target = cancellation_target; +#line 119 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->cancellation = _tmp5_; +#line 119 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->cancellation_target = _tmp5__target; +#line 120 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp6_ = completion_semaphore; +#line 120 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp7_ = _abstract_semaphore_ref0 (_tmp6_); +#line 120 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _abstract_semaphore_unref0 (self->priv->semaphore); +#line 120 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->semaphore = _tmp7_; +#line 113 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return self; +#line 730 "BackgroundJob.c" +} + + +static void background_job_real_execute (BackgroundJob* self) { +#line 123 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_critical ("Type `%s' does not implement abstract method `background_job_execute'", g_type_name (G_TYPE_FROM_INSTANCE (self))); +#line 123 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return; +#line 739 "BackgroundJob.c" +} + + +void background_job_execute (BackgroundJob* self) { +#line 123 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_BACKGROUND_JOB (self)); +#line 123 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + BACKGROUND_JOB_GET_CLASS (self)->execute (self); +#line 748 "BackgroundJob.c" +} + + +static BackgroundJobJobPriority background_job_real_get_priority (BackgroundJob* self) { + BackgroundJobJobPriority result = 0; +#line 126 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = BACKGROUND_JOB_JOB_PRIORITY_NORMAL; +#line 126 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 758 "BackgroundJob.c" +} + + +BackgroundJobJobPriority background_job_get_priority (BackgroundJob* self) { +#line 125 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (IS_BACKGROUND_JOB (self), 0); +#line 125 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return BACKGROUND_JOB_GET_CLASS (self)->get_priority (self); +#line 767 "BackgroundJob.c" +} + + +gint background_job_priority_compare_func (BackgroundJob* a, BackgroundJob* b) { + gint result = 0; + BackgroundJob* _tmp0_ = NULL; + BackgroundJobJobPriority _tmp1_ = 0; + BackgroundJob* _tmp2_ = NULL; + BackgroundJobJobPriority _tmp3_ = 0; + gint _tmp4_ = 0; +#line 130 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (IS_BACKGROUND_JOB (a), 0); +#line 130 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (IS_BACKGROUND_JOB (b), 0); +#line 131 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = a; +#line 131 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = background_job_get_priority (_tmp0_); +#line 131 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = b; +#line 131 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3_ = background_job_get_priority (_tmp2_); +#line 131 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4_ = background_job_job_priority_compare (_tmp1_, _tmp3_); +#line 131 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = _tmp4_; +#line 131 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 796 "BackgroundJob.c" +} + + +gint64 background_job_priority_comparator (void* a, void* b) { + gint64 result = 0LL; + void* _tmp0_ = NULL; + void* _tmp1_ = NULL; + gint _tmp2_ = 0; +#line 136 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = a; +#line 136 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = b; +#line 136 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = background_job_priority_compare_func (G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, TYPE_BACKGROUND_JOB, BackgroundJob), G_TYPE_CHECK_INSTANCE_CAST (_tmp1_, TYPE_BACKGROUND_JOB, BackgroundJob)); +#line 136 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = (gint64) _tmp2_; +#line 136 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 815 "BackgroundJob.c" +} + + +void background_job_set_completion_priority (BackgroundJob* self, gint priority) { + gint _tmp0_ = 0; +#line 140 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_BACKGROUND_JOB (self)); +#line 141 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = priority; +#line 141 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->completion_priority = _tmp0_; +#line 827 "BackgroundJob.c" +} + + +void background_job_set_notification_priority (BackgroundJob* self, gint priority) { + gint _tmp0_ = 0; +#line 145 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_BACKGROUND_JOB (self)); +#line 146 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = priority; +#line 146 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->notification_priority = _tmp0_; +#line 839 "BackgroundJob.c" +} + + +void background_job_wait_for_completion (BackgroundJob* self) { + AbstractSemaphore* _tmp0_ = NULL; +#line 152 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_BACKGROUND_JOB (self)); +#line 153 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = self->priv->semaphore; +#line 153 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp0_ != NULL) { +#line 851 "BackgroundJob.c" + AbstractSemaphore* _tmp1_ = NULL; +#line 154 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = self->priv->semaphore; +#line 154 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + abstract_semaphore_wait (_tmp1_); +#line 857 "BackgroundJob.c" + } +} + + +GCancellable* background_job_get_cancellable (BackgroundJob* self) { + GCancellable* result = NULL; + GCancellable* _tmp0_ = NULL; + GCancellable* _tmp1_ = NULL; +#line 157 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (IS_BACKGROUND_JOB (self), NULL); +#line 158 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = self->priv->cancellable; +#line 158 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = _g_object_ref0 (_tmp0_); +#line 158 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = _tmp1_; +#line 158 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 876 "BackgroundJob.c" +} + + +gboolean background_job_is_cancelled (BackgroundJob* self) { + gboolean result = FALSE; + gboolean _tmp0_ = FALSE; + GCancellable* _tmp1_ = NULL; +#line 161 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (IS_BACKGROUND_JOB (self), FALSE); +#line 162 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = self->priv->cancellable; +#line 162 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp1_ != NULL) { +#line 890 "BackgroundJob.c" + GCancellable* _tmp2_ = NULL; + gboolean _tmp3_ = FALSE; +#line 162 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = self->priv->cancellable; +#line 162 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3_ = g_cancellable_is_cancelled (_tmp2_); +#line 162 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = _tmp3_; +#line 899 "BackgroundJob.c" + } else { +#line 162 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = FALSE; +#line 903 "BackgroundJob.c" + } +#line 162 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = _tmp0_; +#line 162 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 909 "BackgroundJob.c" +} + + +void background_job_cancel (BackgroundJob* self) { + GCancellable* _tmp0_ = NULL; +#line 165 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_BACKGROUND_JOB (self)); +#line 166 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = self->priv->cancellable; +#line 166 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp0_ != NULL) { +#line 921 "BackgroundJob.c" + GCancellable* _tmp1_ = NULL; +#line 167 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = self->priv->cancellable; +#line 167 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_cancellable_cancel (_tmp1_); +#line 927 "BackgroundJob.c" + } +} + + +static gpointer _background_job_ref0 (gpointer self) { +#line 183 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return self ? background_job_ref (self) : NULL; +#line 935 "BackgroundJob.c" +} + + +static gboolean _background_job_on_notify_completion_gsource_func (gpointer self) { + gboolean result; + result = background_job_on_notify_completion ((BackgroundJob*) self); +#line 185 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 944 "BackgroundJob.c" +} + + +void background_job_internal_notify_completion (BackgroundJob* self) { + AbstractSemaphore* _tmp0_ = NULL; + gboolean _tmp2_ = FALSE; + CompletionCallback _tmp3_ = NULL; + void* _tmp3__target = NULL; + gboolean _tmp5_ = FALSE; + gboolean _tmp6_ = FALSE; + BackgroundJob* _tmp8_ = NULL; + gint _tmp9_ = 0; +#line 171 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_BACKGROUND_JOB (self)); +#line 172 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = self->priv->semaphore; +#line 172 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp0_ != NULL) { +#line 963 "BackgroundJob.c" + AbstractSemaphore* _tmp1_ = NULL; +#line 173 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = self->priv->semaphore; +#line 173 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + abstract_semaphore_notify (_tmp1_); +#line 969 "BackgroundJob.c" + } +#line 175 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3_ = self->priv->callback; +#line 175 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3__target = self->priv->callback_target; +#line 175 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp3_ == NULL) { +#line 977 "BackgroundJob.c" + CancellationCallback _tmp4_ = NULL; + void* _tmp4__target = NULL; +#line 175 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4_ = self->priv->cancellation; +#line 175 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4__target = self->priv->cancellation_target; +#line 175 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = _tmp4_ == NULL; +#line 986 "BackgroundJob.c" + } else { +#line 175 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = FALSE; +#line 990 "BackgroundJob.c" + } +#line 175 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp2_) { +#line 176 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return; +#line 996 "BackgroundJob.c" + } +#line 178 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp6_ = background_job_is_cancelled (self); +#line 178 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp6_) { +#line 1002 "BackgroundJob.c" + CancellationCallback _tmp7_ = NULL; + void* _tmp7__target = NULL; +#line 178 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp7_ = self->priv->cancellation; +#line 178 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp7__target = self->priv->cancellation_target; +#line 178 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp5_ = _tmp7_ == NULL; +#line 1011 "BackgroundJob.c" + } else { +#line 178 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp5_ = FALSE; +#line 1015 "BackgroundJob.c" + } +#line 178 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp5_) { +#line 179 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return; +#line 1021 "BackgroundJob.c" + } +#line 183 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp8_ = _background_job_ref0 (self); +#line 183 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_unref0 (self->priv->self); +#line 183 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->self = _tmp8_; +#line 185 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp9_ = self->priv->completion_priority; +#line 185 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_idle_add_full (_tmp9_, _background_job_on_notify_completion_gsource_func, background_job_ref (self), background_job_unref); +#line 1033 "BackgroundJob.c" +} + + +static gboolean background_job_on_notify_completion (BackgroundJob* self) { + gboolean result = FALSE; + gboolean _tmp0_ = FALSE; +#line 188 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (IS_BACKGROUND_JOB (self), FALSE); +#line 193 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = background_job_is_cancelled (self); +#line 193 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp0_) { +#line 1046 "BackgroundJob.c" + CancellationCallback _tmp1_ = NULL; + void* _tmp1__target = NULL; +#line 194 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = self->priv->cancellation; +#line 194 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1__target = self->priv->cancellation_target; +#line 194 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp1_ != NULL) { +#line 1055 "BackgroundJob.c" + CancellationCallback _tmp2_ = NULL; + void* _tmp2__target = NULL; +#line 195 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = self->priv->cancellation; +#line 195 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2__target = self->priv->cancellation_target; +#line 195 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ (self, _tmp2__target); +#line 1064 "BackgroundJob.c" + } + } else { + CompletionCallback _tmp3_ = NULL; + void* _tmp3__target = NULL; +#line 197 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3_ = self->priv->callback; +#line 197 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3__target = self->priv->callback_target; +#line 197 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp3_ != NULL) { +#line 1075 "BackgroundJob.c" + CompletionCallback _tmp4_ = NULL; + void* _tmp4__target = NULL; +#line 198 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4_ = self->priv->callback; +#line 198 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4__target = self->priv->callback_target; +#line 198 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4_ (self, _tmp4__target); +#line 1084 "BackgroundJob.c" + } + } +#line 202 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_unref0 (self->priv->self); +#line 202 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->self = NULL; +#line 204 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = FALSE; +#line 204 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 1095 "BackgroundJob.c" +} + + +static gboolean _background_job_on_notification_ready_gsource_func (gpointer self) { + gboolean result; + result = background_job_on_notification_ready ((BackgroundJob*) self); +#line 214 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 1104 "BackgroundJob.c" +} + + +static gpointer _notification_object_ref0 (gpointer self) { +#line 218 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return self ? notification_object_ref (self) : NULL; +#line 1111 "BackgroundJob.c" +} + + +void background_job_notify (BackgroundJob* self, NotificationCallback callback, void* callback_target, NotificationObject* user) { + gint _tmp7_ = 0; + InterlockedNotificationObject* interlocked = NULL; + NotificationObject* _tmp8_ = NULL; + InterlockedNotificationObject* _tmp9_ = NULL; + InterlockedNotificationObject* _tmp10_ = NULL; + GError * _inner_error_ = NULL; +#line 209 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (IS_BACKGROUND_JOB (self)); +#line 209 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail ((user == NULL) || IS_NOTIFICATION_OBJECT (user)); +#line 1126 "BackgroundJob.c" + { + GeeArrayList* _tmp0_ = NULL; +#line 210 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = background_job_notify_queue; +#line 210 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_rec_mutex_lock (&__lock_background_job_notify_queue); +#line 1133 "BackgroundJob.c" + { + GeeArrayList* _tmp1_ = NULL; + NotificationCallback _tmp2_ = NULL; + void* _tmp2__target = NULL; + NotificationObject* _tmp3_ = NULL; + BackgroundJobNotificationJob* _tmp4_ = NULL; + BackgroundJobNotificationJob* _tmp5_ = NULL; +#line 211 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = background_job_notify_queue; +#line 211 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = callback; +#line 211 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2__target = callback_target; +#line 211 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3_ = user; +#line 211 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4_ = background_job_notification_job_new (_tmp2_, _tmp2__target, self, _tmp3_); +#line 211 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp5_ = _tmp4_; +#line 211 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + gee_abstract_collection_add (G_TYPE_CHECK_INSTANCE_CAST (_tmp1_, GEE_TYPE_ABSTRACT_COLLECTION, GeeAbstractCollection), _tmp5_); +#line 211 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_notification_job_unref0 (_tmp5_); +#line 1157 "BackgroundJob.c" + } + __finally11: + { + GeeArrayList* _tmp6_ = NULL; +#line 210 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp6_ = background_job_notify_queue; +#line 210 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_rec_mutex_unlock (&__lock_background_job_notify_queue); +#line 1166 "BackgroundJob.c" + } +#line 210 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (G_UNLIKELY (_inner_error_ != NULL)) { +#line 210 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 210 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_clear_error (&_inner_error_); +#line 210 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return; +#line 1176 "BackgroundJob.c" + } + } +#line 214 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp7_ = self->priv->notification_priority; +#line 214 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_idle_add_full (_tmp7_, _background_job_on_notification_ready_gsource_func, background_job_ref (self), background_job_unref); +#line 218 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp8_ = user; +#line 218 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp9_ = _notification_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp8_, TYPE_INTERLOCKED_NOTIFICATION_OBJECT) ? ((InterlockedNotificationObject*) _tmp8_) : NULL); +#line 218 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + interlocked = _tmp9_; +#line 219 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp10_ = interlocked; +#line 219 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp10_ != NULL) { +#line 1193 "BackgroundJob.c" + InterlockedNotificationObject* _tmp11_ = NULL; +#line 220 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp11_ = interlocked; +#line 220 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + interlocked_notification_object_internal_wait_for_completion (_tmp11_); +#line 1199 "BackgroundJob.c" + } +#line 209 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _notification_object_unref0 (interlocked); +#line 1203 "BackgroundJob.c" +} + + +static gboolean background_job_on_notification_ready (BackgroundJob* self) { + gboolean result = FALSE; + BackgroundJobNotificationJob* notification_job = NULL; + BackgroundJobNotificationJob* _tmp7_ = NULL; + BackgroundJobNotificationJob* _tmp8_ = NULL; + NotificationCallback _tmp9_ = NULL; + void* _tmp9__target = NULL; + BackgroundJobNotificationJob* _tmp10_ = NULL; + BackgroundJob* _tmp11_ = NULL; + BackgroundJobNotificationJob* _tmp12_ = NULL; + NotificationObject* _tmp13_ = NULL; + InterlockedNotificationObject* interlocked = NULL; + BackgroundJobNotificationJob* _tmp14_ = NULL; + NotificationObject* _tmp15_ = NULL; + InterlockedNotificationObject* _tmp16_ = NULL; + InterlockedNotificationObject* _tmp17_ = NULL; + GError * _inner_error_ = NULL; +#line 223 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (IS_BACKGROUND_JOB (self), FALSE); +#line 226 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + notification_job = NULL; +#line 1228 "BackgroundJob.c" + { + GeeArrayList* _tmp0_ = NULL; +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = background_job_notify_queue; +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_rec_mutex_lock (&__lock_background_job_notify_queue); +#line 1235 "BackgroundJob.c" + { + GeeArrayList* _tmp1_ = NULL; + gint _tmp2_ = 0; + gint _tmp3_ = 0; +#line 228 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = background_job_notify_queue; +#line 228 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = gee_abstract_collection_get_size (G_TYPE_CHECK_INSTANCE_CAST (_tmp1_, GEE_TYPE_COLLECTION, GeeCollection)); +#line 228 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3_ = _tmp2_; +#line 228 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp3_ > 0) { +#line 1248 "BackgroundJob.c" + GeeArrayList* _tmp4_ = NULL; + gpointer _tmp5_ = NULL; +#line 229 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4_ = background_job_notify_queue; +#line 229 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp5_ = gee_abstract_list_remove_at (G_TYPE_CHECK_INSTANCE_CAST (_tmp4_, GEE_TYPE_ABSTRACT_LIST, GeeAbstractList), 0); +#line 229 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_notification_job_unref0 (notification_job); +#line 229 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + notification_job = (BackgroundJobNotificationJob*) _tmp5_; +#line 1259 "BackgroundJob.c" + } + } + __finally12: + { + GeeArrayList* _tmp6_ = NULL; +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp6_ = background_job_notify_queue; +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_rec_mutex_unlock (&__lock_background_job_notify_queue); +#line 1269 "BackgroundJob.c" + } +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (G_UNLIKELY (_inner_error_ != NULL)) { +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_notification_job_unref0 (notification_job); +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_clear_error (&_inner_error_); +#line 227 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return FALSE; +#line 1281 "BackgroundJob.c" + } + } +#line 231 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp7_ = notification_job; +#line 231 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _vala_assert (_tmp7_ != NULL, "notification_job != null"); +#line 233 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp8_ = notification_job; +#line 233 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp9_ = _tmp8_->callback; +#line 233 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp9__target = _tmp8_->callback_target; +#line 233 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp10_ = notification_job; +#line 233 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp11_ = _tmp10_->background_job; +#line 233 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp12_ = notification_job; +#line 233 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp13_ = _tmp12_->user; +#line 233 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp9_ (_tmp11_, _tmp13_, _tmp9__target); +#line 236 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp14_ = notification_job; +#line 236 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp15_ = _tmp14_->user; +#line 236 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp16_ = _notification_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp15_, TYPE_INTERLOCKED_NOTIFICATION_OBJECT) ? ((InterlockedNotificationObject*) _tmp15_) : NULL); +#line 236 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + interlocked = _tmp16_; +#line 237 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp17_ = interlocked; +#line 237 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (_tmp17_ != NULL) { +#line 1316 "BackgroundJob.c" + InterlockedNotificationObject* _tmp18_ = NULL; +#line 238 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp18_ = interlocked; +#line 238 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + interlocked_notification_object_internal_completed (_tmp18_); +#line 1322 "BackgroundJob.c" + } +#line 240 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + result = FALSE; +#line 240 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _notification_object_unref0 (interlocked); +#line 240 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_notification_job_unref0 (notification_job); +#line 240 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return result; +#line 1332 "BackgroundJob.c" +} + + +static BackgroundJobNotificationJob* background_job_notification_job_construct (GType object_type, NotificationCallback callback, void* callback_target, BackgroundJob* background_job, NotificationObject* user) { + BackgroundJobNotificationJob* self = NULL; + NotificationCallback _tmp0_ = NULL; + void* _tmp0__target = NULL; + BackgroundJob* _tmp1_ = NULL; + BackgroundJob* _tmp2_ = NULL; + NotificationObject* _tmp3_ = NULL; + NotificationObject* _tmp4_ = NULL; +#line 88 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (IS_BACKGROUND_JOB (background_job), NULL); +#line 88 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail ((user == NULL) || IS_NOTIFICATION_OBJECT (user), NULL); +#line 88 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self = (BackgroundJobNotificationJob*) g_type_create_instance (object_type); +#line 90 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = callback; +#line 90 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0__target = callback_target; +#line 90 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->callback = _tmp0_; +#line 90 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->callback_target = _tmp0__target; +#line 91 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp1_ = background_job; +#line 91 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp2_ = _background_job_ref0 (_tmp1_); +#line 91 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_unref0 (self->background_job); +#line 91 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->background_job = _tmp2_; +#line 92 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp3_ = user; +#line 92 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp4_ = _notification_object_ref0 (_tmp3_); +#line 92 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _notification_object_unref0 (self->user); +#line 92 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->user = _tmp4_; +#line 88 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return self; +#line 1376 "BackgroundJob.c" +} + + +static BackgroundJobNotificationJob* background_job_notification_job_new (NotificationCallback callback, void* callback_target, BackgroundJob* background_job, NotificationObject* user) { +#line 88 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return background_job_notification_job_construct (BACKGROUND_JOB_TYPE_NOTIFICATION_JOB, callback, callback_target, background_job, user); +#line 1383 "BackgroundJob.c" +} + + +static void background_job_value_notification_job_init (GValue* value) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 1390 "BackgroundJob.c" +} + + +static void background_job_value_notification_job_free_value (GValue* value) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (value->data[0].v_pointer) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_notification_job_unref (value->data[0].v_pointer); +#line 1399 "BackgroundJob.c" + } +} + + +static void background_job_value_notification_job_copy_value (const GValue* src_value, GValue* dest_value) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (src_value->data[0].v_pointer) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + dest_value->data[0].v_pointer = background_job_notification_job_ref (src_value->data[0].v_pointer); +#line 1409 "BackgroundJob.c" + } else { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + dest_value->data[0].v_pointer = NULL; +#line 1413 "BackgroundJob.c" + } +} + + +static gpointer background_job_value_notification_job_peek_pointer (const GValue* value) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return value->data[0].v_pointer; +#line 1421 "BackgroundJob.c" +} + + +static gchar* background_job_value_notification_job_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (collect_values[0].v_pointer) { +#line 1428 "BackgroundJob.c" + BackgroundJobNotificationJob* object; + object = collect_values[0].v_pointer; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (object->parent_instance.g_class == NULL) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 1435 "BackgroundJob.c" + } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 1439 "BackgroundJob.c" + } +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = background_job_notification_job_ref (object); +#line 1443 "BackgroundJob.c" + } else { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 1447 "BackgroundJob.c" + } +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return NULL; +#line 1451 "BackgroundJob.c" +} + + +static gchar* background_job_value_notification_job_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + BackgroundJobNotificationJob** object_p; + object_p = collect_values[0].v_pointer; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (!object_p) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); +#line 1462 "BackgroundJob.c" + } +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (!value->data[0].v_pointer) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = NULL; +#line 1468 "BackgroundJob.c" + } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = value->data[0].v_pointer; +#line 1472 "BackgroundJob.c" + } else { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = background_job_notification_job_ref (value->data[0].v_pointer); +#line 1476 "BackgroundJob.c" + } +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return NULL; +#line 1480 "BackgroundJob.c" +} + + +static GParamSpec* background_job_param_spec_notification_job (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) { + BackgroundJobParamSpecNotificationJob* spec; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (g_type_is_a (object_type, BACKGROUND_JOB_TYPE_NOTIFICATION_JOB), NULL); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + G_PARAM_SPEC (spec)->value_type = object_type; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return G_PARAM_SPEC (spec); +#line 1494 "BackgroundJob.c" +} + + +static gpointer background_job_value_get_notification_job (const GValue* value) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, BACKGROUND_JOB_TYPE_NOTIFICATION_JOB), NULL); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return value->data[0].v_pointer; +#line 1503 "BackgroundJob.c" +} + + +static void background_job_value_set_notification_job (GValue* value, gpointer v_object) { + BackgroundJobNotificationJob* old; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, BACKGROUND_JOB_TYPE_NOTIFICATION_JOB)); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + old = value->data[0].v_pointer; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (v_object) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, BACKGROUND_JOB_TYPE_NOTIFICATION_JOB)); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = v_object; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_notification_job_ref (value->data[0].v_pointer); +#line 1523 "BackgroundJob.c" + } else { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 1527 "BackgroundJob.c" + } +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (old) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_notification_job_unref (old); +#line 1533 "BackgroundJob.c" + } +} + + +static void background_job_value_take_notification_job (GValue* value, gpointer v_object) { + BackgroundJobNotificationJob* old; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, BACKGROUND_JOB_TYPE_NOTIFICATION_JOB)); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + old = value->data[0].v_pointer; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (v_object) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, BACKGROUND_JOB_TYPE_NOTIFICATION_JOB)); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = v_object; +#line 1552 "BackgroundJob.c" + } else { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 1556 "BackgroundJob.c" + } +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (old) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_notification_job_unref (old); +#line 1562 "BackgroundJob.c" + } +} + + +static void background_job_notification_job_class_init (BackgroundJobNotificationJobClass * klass) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_notification_job_parent_class = g_type_class_peek_parent (klass); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + ((BackgroundJobNotificationJobClass *) klass)->finalize = background_job_notification_job_finalize; +#line 1572 "BackgroundJob.c" +} + + +static void background_job_notification_job_instance_init (BackgroundJobNotificationJob * self) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->ref_count = 1; +#line 1579 "BackgroundJob.c" +} + + +static void background_job_notification_job_finalize (BackgroundJobNotificationJob* obj) { + BackgroundJobNotificationJob * self; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, BACKGROUND_JOB_TYPE_NOTIFICATION_JOB, BackgroundJobNotificationJob); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_signal_handlers_destroy (self); +#line 85 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_unref0 (self->background_job); +#line 86 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _notification_object_unref0 (self->user); +#line 1593 "BackgroundJob.c" +} + + +static GType background_job_notification_job_get_type (void) { + static volatile gsize background_job_notification_job_type_id__volatile = 0; + if (g_once_init_enter (&background_job_notification_job_type_id__volatile)) { + static const GTypeValueTable g_define_type_value_table = { background_job_value_notification_job_init, background_job_value_notification_job_free_value, background_job_value_notification_job_copy_value, background_job_value_notification_job_peek_pointer, "p", background_job_value_notification_job_collect_value, "p", background_job_value_notification_job_lcopy_value }; + static const GTypeInfo g_define_type_info = { sizeof (BackgroundJobNotificationJobClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) background_job_notification_job_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (BackgroundJobNotificationJob), 0, (GInstanceInitFunc) background_job_notification_job_instance_init, &g_define_type_value_table }; + static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) }; + GType background_job_notification_job_type_id; + background_job_notification_job_type_id = g_type_register_fundamental (g_type_fundamental_next (), "BackgroundJobNotificationJob", &g_define_type_info, &g_define_type_fundamental_info, 0); + g_once_init_leave (&background_job_notification_job_type_id__volatile, background_job_notification_job_type_id); + } + return background_job_notification_job_type_id__volatile; +} + + +static gpointer background_job_notification_job_ref (gpointer instance) { + BackgroundJobNotificationJob* self; + self = instance; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_atomic_int_inc (&self->ref_count); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return instance; +#line 1618 "BackgroundJob.c" +} + + +static void background_job_notification_job_unref (gpointer instance) { + BackgroundJobNotificationJob* self; + self = instance; +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (g_atomic_int_dec_and_test (&self->ref_count)) { +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + BACKGROUND_JOB_NOTIFICATION_JOB_GET_CLASS (self)->finalize (self); +#line 83 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_type_free_instance ((GTypeInstance *) self); +#line 1631 "BackgroundJob.c" + } +} + + +static void value_background_job_init (GValue* value) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 1639 "BackgroundJob.c" +} + + +static void value_background_job_free_value (GValue* value) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (value->data[0].v_pointer) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_unref (value->data[0].v_pointer); +#line 1648 "BackgroundJob.c" + } +} + + +static void value_background_job_copy_value (const GValue* src_value, GValue* dest_value) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (src_value->data[0].v_pointer) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + dest_value->data[0].v_pointer = background_job_ref (src_value->data[0].v_pointer); +#line 1658 "BackgroundJob.c" + } else { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + dest_value->data[0].v_pointer = NULL; +#line 1662 "BackgroundJob.c" + } +} + + +static gpointer value_background_job_peek_pointer (const GValue* value) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return value->data[0].v_pointer; +#line 1670 "BackgroundJob.c" +} + + +static gchar* value_background_job_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (collect_values[0].v_pointer) { +#line 1677 "BackgroundJob.c" + BackgroundJob* object; + object = collect_values[0].v_pointer; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (object->parent_instance.g_class == NULL) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 1684 "BackgroundJob.c" + } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 1688 "BackgroundJob.c" + } +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = background_job_ref (object); +#line 1692 "BackgroundJob.c" + } else { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 1696 "BackgroundJob.c" + } +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return NULL; +#line 1700 "BackgroundJob.c" +} + + +static gchar* value_background_job_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + BackgroundJob** object_p; + object_p = collect_values[0].v_pointer; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (!object_p) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); +#line 1711 "BackgroundJob.c" + } +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (!value->data[0].v_pointer) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = NULL; +#line 1717 "BackgroundJob.c" + } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = value->data[0].v_pointer; +#line 1721 "BackgroundJob.c" + } else { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + *object_p = background_job_ref (value->data[0].v_pointer); +#line 1725 "BackgroundJob.c" + } +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return NULL; +#line 1729 "BackgroundJob.c" +} + + +GParamSpec* param_spec_background_job (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) { + ParamSpecBackgroundJob* spec; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (g_type_is_a (object_type, TYPE_BACKGROUND_JOB), NULL); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + G_PARAM_SPEC (spec)->value_type = object_type; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return G_PARAM_SPEC (spec); +#line 1743 "BackgroundJob.c" +} + + +gpointer value_get_background_job (const GValue* value) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_BACKGROUND_JOB), NULL); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return value->data[0].v_pointer; +#line 1752 "BackgroundJob.c" +} + + +void value_set_background_job (GValue* value, gpointer v_object) { + BackgroundJob* old; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_BACKGROUND_JOB)); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + old = value->data[0].v_pointer; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (v_object) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_BACKGROUND_JOB)); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = v_object; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_ref (value->data[0].v_pointer); +#line 1772 "BackgroundJob.c" + } else { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 1776 "BackgroundJob.c" + } +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (old) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_unref (old); +#line 1782 "BackgroundJob.c" + } +} + + +void value_take_background_job (GValue* value, gpointer v_object) { + BackgroundJob* old; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_BACKGROUND_JOB)); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + old = value->data[0].v_pointer; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (v_object) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_BACKGROUND_JOB)); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = v_object; +#line 1801 "BackgroundJob.c" + } else { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + value->data[0].v_pointer = NULL; +#line 1805 "BackgroundJob.c" + } +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (old) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_unref (old); +#line 1811 "BackgroundJob.c" + } +} + + +static void background_job_class_init (BackgroundJobClass * klass) { + GeeArrayList* _tmp0_ = NULL; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_parent_class = g_type_class_peek_parent (klass); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + ((BackgroundJobClass *) klass)->finalize = background_job_finalize; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_type_class_add_private (klass, sizeof (BackgroundJobPrivate)); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + ((BackgroundJobClass *) klass)->execute = background_job_real_execute; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + ((BackgroundJobClass *) klass)->get_priority = background_job_real_get_priority; +#line 96 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_rec_mutex_init (&__lock_background_job_notify_queue); +#line 96 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _tmp0_ = gee_array_list_new (BACKGROUND_JOB_TYPE_NOTIFICATION_JOB, (GBoxedCopyFunc) background_job_notification_job_ref, background_job_notification_job_unref, NULL, NULL, NULL); +#line 96 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + background_job_notify_queue = _tmp0_; +#line 1834 "BackgroundJob.c" +} + + +static void background_job_instance_init (BackgroundJob * self) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv = BACKGROUND_JOB_GET_PRIVATE (self); +#line 102 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->self = NULL; +#line 103 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->semaphore = NULL; +#line 110 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->completion_priority = G_PRIORITY_HIGH; +#line 111 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->priv->notification_priority = G_PRIORITY_DEFAULT_IDLE; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self->ref_count = 1; +#line 1851 "BackgroundJob.c" +} + + +static void background_job_finalize (BackgroundJob* obj) { + BackgroundJob * self; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_BACKGROUND_JOB, BackgroundJob); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_signal_handlers_destroy (self); +#line 98 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _g_object_unref0 (self->priv->owner); +#line 100 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _g_object_unref0 (self->priv->cancellable); +#line 102 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _background_job_unref0 (self->priv->self); +#line 103 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + _abstract_semaphore_unref0 (self->priv->semaphore); +#line 1869 "BackgroundJob.c" +} + + +GType background_job_get_type (void) { + static volatile gsize background_job_type_id__volatile = 0; + if (g_once_init_enter (&background_job_type_id__volatile)) { + static const GTypeValueTable g_define_type_value_table = { value_background_job_init, value_background_job_free_value, value_background_job_copy_value, value_background_job_peek_pointer, "p", value_background_job_collect_value, "p", value_background_job_lcopy_value }; + static const GTypeInfo g_define_type_info = { sizeof (BackgroundJobClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) background_job_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (BackgroundJob), 0, (GInstanceInitFunc) background_job_instance_init, &g_define_type_value_table }; + static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) }; + GType background_job_type_id; + background_job_type_id = g_type_register_fundamental (g_type_fundamental_next (), "BackgroundJob", &g_define_type_info, &g_define_type_fundamental_info, G_TYPE_FLAG_ABSTRACT); + g_once_init_leave (&background_job_type_id__volatile, background_job_type_id); + } + return background_job_type_id__volatile; +} + + +gpointer background_job_ref (gpointer instance) { + BackgroundJob* self; + self = instance; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_atomic_int_inc (&self->ref_count); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + return instance; +#line 1894 "BackgroundJob.c" +} + + +void background_job_unref (gpointer instance) { + BackgroundJob* self; + self = instance; +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + if (g_atomic_int_dec_and_test (&self->ref_count)) { +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + BACKGROUND_JOB_GET_CLASS (self)->finalize (self); +#line 65 "/home/jens/Source/shotwell/src/threads/BackgroundJob.vala" + g_type_free_instance ((GTypeInstance *) self); +#line 1907 "BackgroundJob.c" + } +} + + + diff --git a/src/threads/Semaphore.c b/src/threads/Semaphore.c new file mode 100644 index 0000000..9874b65 --- /dev/null +++ b/src/threads/Semaphore.c @@ -0,0 +1,1159 @@ +/* Semaphore.c generated by valac 0.32.1, the Vala compiler + * generated from Semaphore.vala, do not modify */ + +/* Copyright 2016 Software Freedom Conservancy Inc. + * + * This software is licensed under the GNU LGPL (version 2.1 or later). + * See the COPYING file in this distribution. + */ +/* Semaphores may be used to be notified when a job is completed. This provides an alternate*/ +/* mechanism (essentially, a blocking mechanism) to the system of callbacks that BackgroundJob*/ +/* offers. They can also be used for other job-dependent notification mechanisms.*/ + +#include <glib.h> +#include <glib-object.h> +#include <stdlib.h> +#include <string.h> +#include <gobject/gvaluecollector.h> + + +#define TYPE_ABSTRACT_SEMAPHORE (abstract_semaphore_get_type ()) +#define ABSTRACT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)) +#define ABSTRACT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphoreClass)) +#define IS_ABSTRACT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_ABSTRACT_SEMAPHORE)) +#define IS_ABSTRACT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_ABSTRACT_SEMAPHORE)) +#define ABSTRACT_SEMAPHORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphoreClass)) + +typedef struct _AbstractSemaphore AbstractSemaphore; +typedef struct _AbstractSemaphoreClass AbstractSemaphoreClass; +typedef struct _AbstractSemaphorePrivate AbstractSemaphorePrivate; + +#define ABSTRACT_SEMAPHORE_TYPE_NOTIFY_ACTION (abstract_semaphore_notify_action_get_type ()) + +#define ABSTRACT_SEMAPHORE_TYPE_WAIT_ACTION (abstract_semaphore_wait_action_get_type ()) + +#define ABSTRACT_SEMAPHORE_TYPE_TYPE (abstract_semaphore_type_get_type ()) +typedef struct _ParamSpecAbstractSemaphore ParamSpecAbstractSemaphore; + +#define TYPE_SEMAPHORE (semaphore_get_type ()) +#define SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SEMAPHORE, Semaphore)) +#define SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SEMAPHORE, SemaphoreClass)) +#define IS_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SEMAPHORE)) +#define IS_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SEMAPHORE)) +#define SEMAPHORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SEMAPHORE, SemaphoreClass)) + +typedef struct _Semaphore Semaphore; +typedef struct _SemaphoreClass SemaphoreClass; +typedef struct _SemaphorePrivate SemaphorePrivate; + +#define TYPE_COUNTDOWN_SEMAPHORE (countdown_semaphore_get_type ()) +#define COUNTDOWN_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_COUNTDOWN_SEMAPHORE, CountdownSemaphore)) +#define COUNTDOWN_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_COUNTDOWN_SEMAPHORE, CountdownSemaphoreClass)) +#define IS_COUNTDOWN_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_COUNTDOWN_SEMAPHORE)) +#define IS_COUNTDOWN_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_COUNTDOWN_SEMAPHORE)) +#define COUNTDOWN_SEMAPHORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_COUNTDOWN_SEMAPHORE, CountdownSemaphoreClass)) + +typedef struct _CountdownSemaphore CountdownSemaphore; +typedef struct _CountdownSemaphoreClass CountdownSemaphoreClass; +typedef struct _CountdownSemaphorePrivate CountdownSemaphorePrivate; + +#define TYPE_EVENT_SEMAPHORE (event_semaphore_get_type ()) +#define EVENT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_EVENT_SEMAPHORE, EventSemaphore)) +#define EVENT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_EVENT_SEMAPHORE, EventSemaphoreClass)) +#define IS_EVENT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_EVENT_SEMAPHORE)) +#define IS_EVENT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_EVENT_SEMAPHORE)) +#define EVENT_SEMAPHORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_EVENT_SEMAPHORE, EventSemaphoreClass)) + +typedef struct _EventSemaphore EventSemaphore; +typedef struct _EventSemaphoreClass EventSemaphoreClass; +typedef struct _EventSemaphorePrivate EventSemaphorePrivate; +#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); +#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; } +#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; } +#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + +typedef enum { + ABSTRACT_SEMAPHORE_NOTIFY_ACTION_NONE, + ABSTRACT_SEMAPHORE_NOTIFY_ACTION_SIGNAL +} AbstractSemaphoreNotifyAction; + +typedef enum { + ABSTRACT_SEMAPHORE_WAIT_ACTION_SLEEP, + ABSTRACT_SEMAPHORE_WAIT_ACTION_READY +} AbstractSemaphoreWaitAction; + +struct _AbstractSemaphore { + GTypeInstance parent_instance; + volatile int ref_count; + AbstractSemaphorePrivate * priv; +}; + +struct _AbstractSemaphoreClass { + GTypeClass parent_class; + void (*finalize) (AbstractSemaphore *self); + AbstractSemaphoreNotifyAction (*do_notify) (AbstractSemaphore* self); + AbstractSemaphoreWaitAction (*do_wait) (AbstractSemaphore* self); + gboolean (*do_reset) (AbstractSemaphore* self); +}; + +typedef enum { + ABSTRACT_SEMAPHORE_TYPE_SERIAL, + ABSTRACT_SEMAPHORE_TYPE_BROADCAST +} AbstractSemaphoreType; + +struct _AbstractSemaphorePrivate { + AbstractSemaphoreType type; + GMutex mutex; + GCond monitor; +}; + +struct _ParamSpecAbstractSemaphore { + GParamSpec parent_instance; +}; + +struct _Semaphore { + AbstractSemaphore parent_instance; + SemaphorePrivate * priv; +}; + +struct _SemaphoreClass { + AbstractSemaphoreClass parent_class; +}; + +struct _SemaphorePrivate { + gboolean passed; +}; + +struct _CountdownSemaphore { + AbstractSemaphore parent_instance; + CountdownSemaphorePrivate * priv; +}; + +struct _CountdownSemaphoreClass { + AbstractSemaphoreClass parent_class; +}; + +struct _CountdownSemaphorePrivate { + gint total; + gint passed; +}; + +struct _EventSemaphore { + AbstractSemaphore parent_instance; + EventSemaphorePrivate * priv; +}; + +struct _EventSemaphoreClass { + AbstractSemaphoreClass parent_class; +}; + +struct _EventSemaphorePrivate { + gboolean fired; +}; + + +static gpointer abstract_semaphore_parent_class = NULL; +static gpointer semaphore_parent_class = NULL; +static gpointer countdown_semaphore_parent_class = NULL; +static gpointer event_semaphore_parent_class = NULL; + +gpointer abstract_semaphore_ref (gpointer instance); +void abstract_semaphore_unref (gpointer instance); +GParamSpec* param_spec_abstract_semaphore (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void value_set_abstract_semaphore (GValue* value, gpointer v_object); +void value_take_abstract_semaphore (GValue* value, gpointer v_object); +gpointer value_get_abstract_semaphore (const GValue* value); +GType abstract_semaphore_get_type (void) G_GNUC_CONST; +GType abstract_semaphore_notify_action_get_type (void) G_GNUC_CONST; +GType abstract_semaphore_wait_action_get_type (void) G_GNUC_CONST; +GType abstract_semaphore_type_get_type (void) G_GNUC_CONST; +#define ABSTRACT_SEMAPHORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphorePrivate)) +enum { + ABSTRACT_SEMAPHORE_DUMMY_PROPERTY +}; +AbstractSemaphore* abstract_semaphore_construct (GType object_type, AbstractSemaphoreType type); +static void abstract_semaphore_trigger (AbstractSemaphore* self); +void abstract_semaphore_notify (AbstractSemaphore* self); +AbstractSemaphoreNotifyAction abstract_semaphore_do_notify (AbstractSemaphore* self); +const gchar* abstract_semaphore_notify_action_to_string (AbstractSemaphoreNotifyAction self); +static AbstractSemaphoreNotifyAction abstract_semaphore_real_do_notify (AbstractSemaphore* self); +void abstract_semaphore_wait (AbstractSemaphore* self); +AbstractSemaphoreWaitAction abstract_semaphore_do_wait (AbstractSemaphore* self); +static AbstractSemaphoreWaitAction abstract_semaphore_real_do_wait (AbstractSemaphore* self); +gboolean abstract_semaphore_reset (AbstractSemaphore* self); +gboolean abstract_semaphore_do_reset (AbstractSemaphore* self); +static gboolean abstract_semaphore_real_do_reset (AbstractSemaphore* self); +static void abstract_semaphore_finalize (AbstractSemaphore* obj); +GType semaphore_get_type (void) G_GNUC_CONST; +#define SEMAPHORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_SEMAPHORE, SemaphorePrivate)) +enum { + SEMAPHORE_DUMMY_PROPERTY +}; +Semaphore* semaphore_new (void); +Semaphore* semaphore_construct (GType object_type); +static AbstractSemaphoreNotifyAction semaphore_real_do_notify (AbstractSemaphore* base); +static AbstractSemaphoreWaitAction semaphore_real_do_wait (AbstractSemaphore* base); +static void semaphore_finalize (AbstractSemaphore* obj); +GType countdown_semaphore_get_type (void) G_GNUC_CONST; +#define COUNTDOWN_SEMAPHORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_COUNTDOWN_SEMAPHORE, CountdownSemaphorePrivate)) +enum { + COUNTDOWN_SEMAPHORE_DUMMY_PROPERTY +}; +CountdownSemaphore* countdown_semaphore_new (gint total); +CountdownSemaphore* countdown_semaphore_construct (GType object_type, gint total); +static AbstractSemaphoreNotifyAction countdown_semaphore_real_do_notify (AbstractSemaphore* base); +static AbstractSemaphoreWaitAction countdown_semaphore_real_do_wait (AbstractSemaphore* base); +static void countdown_semaphore_finalize (AbstractSemaphore* obj); +GType event_semaphore_get_type (void) G_GNUC_CONST; +#define EVENT_SEMAPHORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_EVENT_SEMAPHORE, EventSemaphorePrivate)) +enum { + EVENT_SEMAPHORE_DUMMY_PROPERTY +}; +EventSemaphore* event_semaphore_new (void); +EventSemaphore* event_semaphore_construct (GType object_type); +static AbstractSemaphoreNotifyAction event_semaphore_real_do_notify (AbstractSemaphore* base); +static AbstractSemaphoreWaitAction event_semaphore_real_do_wait (AbstractSemaphore* base); +static gboolean event_semaphore_real_do_reset (AbstractSemaphore* base); +static void event_semaphore_finalize (AbstractSemaphore* obj); +static void _vala_clear_GMutex (GMutex * mutex); +static void _vala_clear_GRecMutex (GRecMutex * mutex); +static void _vala_clear_GRWLock (GRWLock * mutex); +static void _vala_clear_GCond (GCond * mutex); + + +GType abstract_semaphore_type_get_type (void) { + static volatile gsize abstract_semaphore_type_type_id__volatile = 0; + if (g_once_init_enter (&abstract_semaphore_type_type_id__volatile)) { + static const GEnumValue values[] = {{ABSTRACT_SEMAPHORE_TYPE_SERIAL, "ABSTRACT_SEMAPHORE_TYPE_SERIAL", "serial"}, {ABSTRACT_SEMAPHORE_TYPE_BROADCAST, "ABSTRACT_SEMAPHORE_TYPE_BROADCAST", "broadcast"}, {0, NULL, NULL}}; + GType abstract_semaphore_type_type_id; + abstract_semaphore_type_type_id = g_enum_register_static ("AbstractSemaphoreType", values); + g_once_init_leave (&abstract_semaphore_type_type_id__volatile, abstract_semaphore_type_type_id); + } + return abstract_semaphore_type_type_id__volatile; +} + + +GType abstract_semaphore_notify_action_get_type (void) { + static volatile gsize abstract_semaphore_notify_action_type_id__volatile = 0; + if (g_once_init_enter (&abstract_semaphore_notify_action_type_id__volatile)) { + static const GEnumValue values[] = {{ABSTRACT_SEMAPHORE_NOTIFY_ACTION_NONE, "ABSTRACT_SEMAPHORE_NOTIFY_ACTION_NONE", "none"}, {ABSTRACT_SEMAPHORE_NOTIFY_ACTION_SIGNAL, "ABSTRACT_SEMAPHORE_NOTIFY_ACTION_SIGNAL", "signal"}, {0, NULL, NULL}}; + GType abstract_semaphore_notify_action_type_id; + abstract_semaphore_notify_action_type_id = g_enum_register_static ("AbstractSemaphoreNotifyAction", values); + g_once_init_leave (&abstract_semaphore_notify_action_type_id__volatile, abstract_semaphore_notify_action_type_id); + } + return abstract_semaphore_notify_action_type_id__volatile; +} + + +GType abstract_semaphore_wait_action_get_type (void) { + static volatile gsize abstract_semaphore_wait_action_type_id__volatile = 0; + if (g_once_init_enter (&abstract_semaphore_wait_action_type_id__volatile)) { + static const GEnumValue values[] = {{ABSTRACT_SEMAPHORE_WAIT_ACTION_SLEEP, "ABSTRACT_SEMAPHORE_WAIT_ACTION_SLEEP", "sleep"}, {ABSTRACT_SEMAPHORE_WAIT_ACTION_READY, "ABSTRACT_SEMAPHORE_WAIT_ACTION_READY", "ready"}, {0, NULL, NULL}}; + GType abstract_semaphore_wait_action_type_id; + abstract_semaphore_wait_action_type_id = g_enum_register_static ("AbstractSemaphoreWaitAction", values); + g_once_init_leave (&abstract_semaphore_wait_action_type_id__volatile, abstract_semaphore_wait_action_type_id); + } + return abstract_semaphore_wait_action_type_id__volatile; +} + + +AbstractSemaphore* abstract_semaphore_construct (GType object_type, AbstractSemaphoreType type) { + AbstractSemaphore* self = NULL; + gboolean _tmp0_ = FALSE; + AbstractSemaphoreType _tmp1_ = 0; + AbstractSemaphoreType _tmp3_ = 0; +#line 30 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = (AbstractSemaphore*) g_type_create_instance (object_type); +#line 31 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp1_ = type; +#line 31 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (_tmp1_ == ABSTRACT_SEMAPHORE_TYPE_SERIAL) { +#line 31 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = TRUE; +#line 274 "Semaphore.c" + } else { + AbstractSemaphoreType _tmp2_ = 0; +#line 31 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp2_ = type; +#line 31 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = _tmp2_ == ABSTRACT_SEMAPHORE_TYPE_BROADCAST; +#line 281 "Semaphore.c" + } +#line 31 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _vala_assert (_tmp0_, "type == Type.SERIAL || type == Type.BROADCAST"); +#line 33 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp3_ = type; +#line 33 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->type = _tmp3_; +#line 30 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return self; +#line 291 "Semaphore.c" +} + + +static void abstract_semaphore_trigger (AbstractSemaphore* self) { + AbstractSemaphoreType _tmp0_ = 0; +#line 36 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (IS_ABSTRACT_SEMAPHORE (self)); +#line 37 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = self->priv->type; +#line 37 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (_tmp0_ == ABSTRACT_SEMAPHORE_TYPE_SERIAL) { +#line 38 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_cond_signal (&self->priv->monitor); +#line 305 "Semaphore.c" + } else { +#line 40 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_cond_broadcast (&self->priv->monitor); +#line 309 "Semaphore.c" + } +} + + +void abstract_semaphore_notify (AbstractSemaphore* self) { + AbstractSemaphoreNotifyAction action = 0; + AbstractSemaphoreNotifyAction _tmp0_ = 0; + AbstractSemaphoreNotifyAction _tmp1_ = 0; +#line 43 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (IS_ABSTRACT_SEMAPHORE (self)); +#line 44 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_mutex_lock (&self->priv->mutex); +#line 46 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = abstract_semaphore_do_notify (self); +#line 46 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + action = _tmp0_; +#line 47 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp1_ = action; +#line 47 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + switch (_tmp1_) { +#line 47 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + case ABSTRACT_SEMAPHORE_NOTIFY_ACTION_NONE: +#line 332 "Semaphore.c" + { +#line 50 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + break; +#line 336 "Semaphore.c" + } +#line 47 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + case ABSTRACT_SEMAPHORE_NOTIFY_ACTION_SIGNAL: +#line 340 "Semaphore.c" + { +#line 53 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + abstract_semaphore_trigger (self); +#line 54 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + break; +#line 346 "Semaphore.c" + } + default: + { + AbstractSemaphoreNotifyAction _tmp2_ = 0; + GEnumValue* _tmp3_; +#line 57 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp2_ = action; +#line 57 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp3_ = g_enum_get_value (g_type_class_ref (ABSTRACT_SEMAPHORE_TYPE_NOTIFY_ACTION), _tmp2_); +#line 57 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_error ("Semaphore.vala:57: Unknown semaphore action: %s", (_tmp3_ != NULL) ? _tmp3_->value_name : NULL); +#line 358 "Semaphore.c" + } + } +#line 60 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_mutex_unlock (&self->priv->mutex); +#line 363 "Semaphore.c" +} + + +static AbstractSemaphoreNotifyAction abstract_semaphore_real_do_notify (AbstractSemaphore* self) { +#line 64 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_critical ("Type `%s' does not implement abstract method `abstract_semaphore_do_notify'", g_type_name (G_TYPE_FROM_INSTANCE (self))); +#line 64 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return 0; +#line 372 "Semaphore.c" +} + + +AbstractSemaphoreNotifyAction abstract_semaphore_do_notify (AbstractSemaphore* self) { +#line 64 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_val_if_fail (IS_ABSTRACT_SEMAPHORE (self), 0); +#line 64 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return ABSTRACT_SEMAPHORE_GET_CLASS (self)->do_notify (self); +#line 381 "Semaphore.c" +} + + +void abstract_semaphore_wait (AbstractSemaphore* self) { +#line 66 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (IS_ABSTRACT_SEMAPHORE (self)); +#line 67 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_mutex_lock (&self->priv->mutex); +#line 69 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + while (TRUE) { +#line 392 "Semaphore.c" + AbstractSemaphoreWaitAction _tmp0_ = 0; +#line 69 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = abstract_semaphore_do_wait (self); +#line 69 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (!(_tmp0_ == ABSTRACT_SEMAPHORE_WAIT_ACTION_SLEEP)) { +#line 69 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + break; +#line 400 "Semaphore.c" + } +#line 70 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_cond_wait (&self->priv->monitor, &self->priv->mutex); +#line 404 "Semaphore.c" + } +#line 72 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_mutex_unlock (&self->priv->mutex); +#line 408 "Semaphore.c" +} + + +static AbstractSemaphoreWaitAction abstract_semaphore_real_do_wait (AbstractSemaphore* self) { +#line 76 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_critical ("Type `%s' does not implement abstract method `abstract_semaphore_do_wait'", g_type_name (G_TYPE_FROM_INSTANCE (self))); +#line 76 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return 0; +#line 417 "Semaphore.c" +} + + +AbstractSemaphoreWaitAction abstract_semaphore_do_wait (AbstractSemaphore* self) { +#line 76 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_val_if_fail (IS_ABSTRACT_SEMAPHORE (self), 0); +#line 76 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return ABSTRACT_SEMAPHORE_GET_CLASS (self)->do_wait (self); +#line 426 "Semaphore.c" +} + + +gboolean abstract_semaphore_reset (AbstractSemaphore* self) { + gboolean result = FALSE; + gboolean is_reset = FALSE; + gboolean _tmp0_ = FALSE; +#line 79 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_val_if_fail (IS_ABSTRACT_SEMAPHORE (self), FALSE); +#line 80 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_mutex_lock (&self->priv->mutex); +#line 81 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = abstract_semaphore_do_reset (self); +#line 81 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + is_reset = _tmp0_; +#line 82 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_mutex_unlock (&self->priv->mutex); +#line 84 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = is_reset; +#line 84 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 448 "Semaphore.c" +} + + +static gboolean abstract_semaphore_real_do_reset (AbstractSemaphore* self) { + gboolean result = FALSE; +#line 90 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = FALSE; +#line 90 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 458 "Semaphore.c" +} + + +gboolean abstract_semaphore_do_reset (AbstractSemaphore* self) { +#line 89 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_val_if_fail (IS_ABSTRACT_SEMAPHORE (self), FALSE); +#line 89 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return ABSTRACT_SEMAPHORE_GET_CLASS (self)->do_reset (self); +#line 467 "Semaphore.c" +} + + +static void value_abstract_semaphore_init (GValue* value) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + value->data[0].v_pointer = NULL; +#line 474 "Semaphore.c" +} + + +static void value_abstract_semaphore_free_value (GValue* value) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (value->data[0].v_pointer) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + abstract_semaphore_unref (value->data[0].v_pointer); +#line 483 "Semaphore.c" + } +} + + +static void value_abstract_semaphore_copy_value (const GValue* src_value, GValue* dest_value) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (src_value->data[0].v_pointer) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + dest_value->data[0].v_pointer = abstract_semaphore_ref (src_value->data[0].v_pointer); +#line 493 "Semaphore.c" + } else { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + dest_value->data[0].v_pointer = NULL; +#line 497 "Semaphore.c" + } +} + + +static gpointer value_abstract_semaphore_peek_pointer (const GValue* value) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return value->data[0].v_pointer; +#line 505 "Semaphore.c" +} + + +static gchar* value_abstract_semaphore_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (collect_values[0].v_pointer) { +#line 512 "Semaphore.c" + AbstractSemaphore* object; + object = collect_values[0].v_pointer; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (object->parent_instance.g_class == NULL) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 519 "Semaphore.c" + } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 523 "Semaphore.c" + } +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + value->data[0].v_pointer = abstract_semaphore_ref (object); +#line 527 "Semaphore.c" + } else { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + value->data[0].v_pointer = NULL; +#line 531 "Semaphore.c" + } +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return NULL; +#line 535 "Semaphore.c" +} + + +static gchar* value_abstract_semaphore_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + AbstractSemaphore** object_p; + object_p = collect_values[0].v_pointer; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (!object_p) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); +#line 546 "Semaphore.c" + } +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (!value->data[0].v_pointer) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + *object_p = NULL; +#line 552 "Semaphore.c" + } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + *object_p = value->data[0].v_pointer; +#line 556 "Semaphore.c" + } else { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + *object_p = abstract_semaphore_ref (value->data[0].v_pointer); +#line 560 "Semaphore.c" + } +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return NULL; +#line 564 "Semaphore.c" +} + + +GParamSpec* param_spec_abstract_semaphore (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) { + ParamSpecAbstractSemaphore* spec; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_val_if_fail (g_type_is_a (object_type, TYPE_ABSTRACT_SEMAPHORE), NULL); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + G_PARAM_SPEC (spec)->value_type = object_type; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return G_PARAM_SPEC (spec); +#line 578 "Semaphore.c" +} + + +gpointer value_get_abstract_semaphore (const GValue* value) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_ABSTRACT_SEMAPHORE), NULL); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return value->data[0].v_pointer; +#line 587 "Semaphore.c" +} + + +void value_set_abstract_semaphore (GValue* value, gpointer v_object) { + AbstractSemaphore* old; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_ABSTRACT_SEMAPHORE)); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + old = value->data[0].v_pointer; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (v_object) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_ABSTRACT_SEMAPHORE)); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + value->data[0].v_pointer = v_object; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + abstract_semaphore_ref (value->data[0].v_pointer); +#line 607 "Semaphore.c" + } else { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + value->data[0].v_pointer = NULL; +#line 611 "Semaphore.c" + } +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (old) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + abstract_semaphore_unref (old); +#line 617 "Semaphore.c" + } +} + + +void value_take_abstract_semaphore (GValue* value, gpointer v_object) { + AbstractSemaphore* old; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_ABSTRACT_SEMAPHORE)); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + old = value->data[0].v_pointer; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (v_object) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_ABSTRACT_SEMAPHORE)); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + value->data[0].v_pointer = v_object; +#line 636 "Semaphore.c" + } else { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + value->data[0].v_pointer = NULL; +#line 640 "Semaphore.c" + } +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (old) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + abstract_semaphore_unref (old); +#line 646 "Semaphore.c" + } +} + + +static void abstract_semaphore_class_init (AbstractSemaphoreClass * klass) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + abstract_semaphore_parent_class = g_type_class_peek_parent (klass); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->finalize = abstract_semaphore_finalize; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_type_class_add_private (klass, sizeof (AbstractSemaphorePrivate)); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_notify = abstract_semaphore_real_do_notify; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_wait = abstract_semaphore_real_do_wait; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_reset = abstract_semaphore_real_do_reset; +#line 664 "Semaphore.c" +} + + +static void abstract_semaphore_instance_init (AbstractSemaphore * self) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv = ABSTRACT_SEMAPHORE_GET_PRIVATE (self); +#line 27 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_mutex_init (&self->priv->mutex); +#line 28 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_cond_init (&self->priv->monitor); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->ref_count = 1; +#line 677 "Semaphore.c" +} + + +static void abstract_semaphore_finalize (AbstractSemaphore* obj) { + AbstractSemaphore * self; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_signal_handlers_destroy (self); +#line 27 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _vala_clear_GMutex (&self->priv->mutex); +#line 28 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _vala_clear_GCond (&self->priv->monitor); +#line 691 "Semaphore.c" +} + + +GType abstract_semaphore_get_type (void) { + static volatile gsize abstract_semaphore_type_id__volatile = 0; + if (g_once_init_enter (&abstract_semaphore_type_id__volatile)) { + static const GTypeValueTable g_define_type_value_table = { value_abstract_semaphore_init, value_abstract_semaphore_free_value, value_abstract_semaphore_copy_value, value_abstract_semaphore_peek_pointer, "p", value_abstract_semaphore_collect_value, "p", value_abstract_semaphore_lcopy_value }; + static const GTypeInfo g_define_type_info = { sizeof (AbstractSemaphoreClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) abstract_semaphore_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (AbstractSemaphore), 0, (GInstanceInitFunc) abstract_semaphore_instance_init, &g_define_type_value_table }; + static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) }; + GType abstract_semaphore_type_id; + abstract_semaphore_type_id = g_type_register_fundamental (g_type_fundamental_next (), "AbstractSemaphore", &g_define_type_info, &g_define_type_fundamental_info, G_TYPE_FLAG_ABSTRACT); + g_once_init_leave (&abstract_semaphore_type_id__volatile, abstract_semaphore_type_id); + } + return abstract_semaphore_type_id__volatile; +} + + +gpointer abstract_semaphore_ref (gpointer instance) { + AbstractSemaphore* self; + self = instance; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_atomic_int_inc (&self->ref_count); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return instance; +#line 716 "Semaphore.c" +} + + +void abstract_semaphore_unref (gpointer instance) { + AbstractSemaphore* self; + self = instance; +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (g_atomic_int_dec_and_test (&self->ref_count)) { +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ABSTRACT_SEMAPHORE_GET_CLASS (self)->finalize (self); +#line 10 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_type_free_instance ((GTypeInstance *) self); +#line 729 "Semaphore.c" + } +} + + +Semaphore* semaphore_construct (GType object_type) { + Semaphore* self = NULL; +#line 98 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = (Semaphore*) abstract_semaphore_construct (object_type, ABSTRACT_SEMAPHORE_TYPE_BROADCAST); +#line 97 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return self; +#line 740 "Semaphore.c" +} + + +Semaphore* semaphore_new (void) { +#line 97 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return semaphore_construct (TYPE_SEMAPHORE); +#line 747 "Semaphore.c" +} + + +static AbstractSemaphoreNotifyAction semaphore_real_do_notify (AbstractSemaphore* base) { + Semaphore * self; + AbstractSemaphoreNotifyAction result = 0; + gboolean _tmp0_ = FALSE; +#line 101 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_SEMAPHORE, Semaphore); +#line 102 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = self->priv->passed; +#line 102 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (_tmp0_) { +#line 103 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = ABSTRACT_SEMAPHORE_NOTIFY_ACTION_NONE; +#line 103 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 765 "Semaphore.c" + } +#line 105 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->passed = TRUE; +#line 107 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = ABSTRACT_SEMAPHORE_NOTIFY_ACTION_SIGNAL; +#line 107 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 773 "Semaphore.c" +} + + +static AbstractSemaphoreWaitAction semaphore_real_do_wait (AbstractSemaphore* base) { + Semaphore * self; + AbstractSemaphoreWaitAction result = 0; + AbstractSemaphoreWaitAction _tmp0_ = 0; + gboolean _tmp1_ = FALSE; +#line 110 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_SEMAPHORE, Semaphore); +#line 111 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp1_ = self->priv->passed; +#line 111 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (_tmp1_) { +#line 111 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = ABSTRACT_SEMAPHORE_WAIT_ACTION_READY; +#line 790 "Semaphore.c" + } else { +#line 111 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = ABSTRACT_SEMAPHORE_WAIT_ACTION_SLEEP; +#line 794 "Semaphore.c" + } +#line 111 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = _tmp0_; +#line 111 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 800 "Semaphore.c" +} + + +static void semaphore_class_init (SemaphoreClass * klass) { +#line 94 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + semaphore_parent_class = g_type_class_peek_parent (klass); +#line 94 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->finalize = semaphore_finalize; +#line 94 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_type_class_add_private (klass, sizeof (SemaphorePrivate)); +#line 94 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_notify = semaphore_real_do_notify; +#line 94 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_wait = semaphore_real_do_wait; +#line 815 "Semaphore.c" +} + + +static void semaphore_instance_init (Semaphore * self) { +#line 94 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv = SEMAPHORE_GET_PRIVATE (self); +#line 95 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->passed = FALSE; +#line 824 "Semaphore.c" +} + + +static void semaphore_finalize (AbstractSemaphore* obj) { + Semaphore * self; +#line 94 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_SEMAPHORE, Semaphore); +#line 94 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ABSTRACT_SEMAPHORE_CLASS (semaphore_parent_class)->finalize (obj); +#line 834 "Semaphore.c" +} + + +GType semaphore_get_type (void) { + static volatile gsize semaphore_type_id__volatile = 0; + if (g_once_init_enter (&semaphore_type_id__volatile)) { + static const GTypeInfo g_define_type_info = { sizeof (SemaphoreClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) semaphore_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Semaphore), 0, (GInstanceInitFunc) semaphore_instance_init, NULL }; + GType semaphore_type_id; + semaphore_type_id = g_type_register_static (TYPE_ABSTRACT_SEMAPHORE, "Semaphore", &g_define_type_info, 0); + g_once_init_leave (&semaphore_type_id__volatile, semaphore_type_id); + } + return semaphore_type_id__volatile; +} + + +CountdownSemaphore* countdown_semaphore_construct (GType object_type, gint total) { + CountdownSemaphore* self = NULL; + gint _tmp0_ = 0; +#line 120 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = (CountdownSemaphore*) abstract_semaphore_construct (object_type, ABSTRACT_SEMAPHORE_TYPE_BROADCAST); +#line 122 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = total; +#line 122 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->total = _tmp0_; +#line 119 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return self; +#line 861 "Semaphore.c" +} + + +CountdownSemaphore* countdown_semaphore_new (gint total) { +#line 119 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return countdown_semaphore_construct (TYPE_COUNTDOWN_SEMAPHORE, total); +#line 868 "Semaphore.c" +} + + +static AbstractSemaphoreNotifyAction countdown_semaphore_real_do_notify (AbstractSemaphore* base) { + CountdownSemaphore * self; + AbstractSemaphoreNotifyAction result = 0; + gint _tmp0_ = 0; + gint _tmp1_ = 0; + AbstractSemaphoreNotifyAction _tmp4_ = 0; + gint _tmp5_ = 0; + gint _tmp6_ = 0; + gint _tmp7_ = 0; +#line 125 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_COUNTDOWN_SEMAPHORE, CountdownSemaphore); +#line 126 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = self->priv->passed; +#line 126 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp1_ = self->priv->total; +#line 126 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (_tmp0_ >= _tmp1_) { +#line 889 "Semaphore.c" + gint _tmp2_ = 0; + gint _tmp3_ = 0; +#line 127 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp2_ = self->priv->passed; +#line 127 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp3_ = self->priv->total; +#line 127 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_critical ("Semaphore.vala:127: CountdownSemaphore overrun: %d/%d", _tmp2_ + 1, _tmp3_); +#line 898 "Semaphore.c" + } +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp5_ = self->priv->passed; +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->passed = _tmp5_ + 1; +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp6_ = self->priv->passed; +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp7_ = self->priv->total; +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (_tmp6_ >= _tmp7_) { +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp4_ = ABSTRACT_SEMAPHORE_NOTIFY_ACTION_SIGNAL; +#line 912 "Semaphore.c" + } else { +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp4_ = ABSTRACT_SEMAPHORE_NOTIFY_ACTION_NONE; +#line 916 "Semaphore.c" + } +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = _tmp4_; +#line 129 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 922 "Semaphore.c" +} + + +static AbstractSemaphoreWaitAction countdown_semaphore_real_do_wait (AbstractSemaphore* base) { + CountdownSemaphore * self; + AbstractSemaphoreWaitAction result = 0; + AbstractSemaphoreWaitAction _tmp0_ = 0; + gint _tmp1_ = 0; + gint _tmp2_ = 0; +#line 132 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_COUNTDOWN_SEMAPHORE, CountdownSemaphore); +#line 133 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp1_ = self->priv->passed; +#line 133 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp2_ = self->priv->total; +#line 133 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (_tmp1_ < _tmp2_) { +#line 133 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = ABSTRACT_SEMAPHORE_WAIT_ACTION_SLEEP; +#line 942 "Semaphore.c" + } else { +#line 133 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = ABSTRACT_SEMAPHORE_WAIT_ACTION_READY; +#line 946 "Semaphore.c" + } +#line 133 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = _tmp0_; +#line 133 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 952 "Semaphore.c" +} + + +static void countdown_semaphore_class_init (CountdownSemaphoreClass * klass) { +#line 115 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + countdown_semaphore_parent_class = g_type_class_peek_parent (klass); +#line 115 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->finalize = countdown_semaphore_finalize; +#line 115 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_type_class_add_private (klass, sizeof (CountdownSemaphorePrivate)); +#line 115 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_notify = countdown_semaphore_real_do_notify; +#line 115 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_wait = countdown_semaphore_real_do_wait; +#line 967 "Semaphore.c" +} + + +static void countdown_semaphore_instance_init (CountdownSemaphore * self) { +#line 115 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv = COUNTDOWN_SEMAPHORE_GET_PRIVATE (self); +#line 117 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->passed = 0; +#line 976 "Semaphore.c" +} + + +static void countdown_semaphore_finalize (AbstractSemaphore* obj) { + CountdownSemaphore * self; +#line 115 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_COUNTDOWN_SEMAPHORE, CountdownSemaphore); +#line 115 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ABSTRACT_SEMAPHORE_CLASS (countdown_semaphore_parent_class)->finalize (obj); +#line 986 "Semaphore.c" +} + + +GType countdown_semaphore_get_type (void) { + static volatile gsize countdown_semaphore_type_id__volatile = 0; + if (g_once_init_enter (&countdown_semaphore_type_id__volatile)) { + static const GTypeInfo g_define_type_info = { sizeof (CountdownSemaphoreClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) countdown_semaphore_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (CountdownSemaphore), 0, (GInstanceInitFunc) countdown_semaphore_instance_init, NULL }; + GType countdown_semaphore_type_id; + countdown_semaphore_type_id = g_type_register_static (TYPE_ABSTRACT_SEMAPHORE, "CountdownSemaphore", &g_define_type_info, 0); + g_once_init_leave (&countdown_semaphore_type_id__volatile, countdown_semaphore_type_id); + } + return countdown_semaphore_type_id__volatile; +} + + +EventSemaphore* event_semaphore_construct (GType object_type) { + EventSemaphore* self = NULL; +#line 141 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = (EventSemaphore*) abstract_semaphore_construct (object_type, ABSTRACT_SEMAPHORE_TYPE_BROADCAST); +#line 140 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return self; +#line 1008 "Semaphore.c" +} + + +EventSemaphore* event_semaphore_new (void) { +#line 140 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return event_semaphore_construct (TYPE_EVENT_SEMAPHORE); +#line 1015 "Semaphore.c" +} + + +static AbstractSemaphoreNotifyAction event_semaphore_real_do_notify (AbstractSemaphore* base) { + EventSemaphore * self; + AbstractSemaphoreNotifyAction result = 0; +#line 144 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_EVENT_SEMAPHORE, EventSemaphore); +#line 145 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->fired = TRUE; +#line 147 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = ABSTRACT_SEMAPHORE_NOTIFY_ACTION_SIGNAL; +#line 147 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 1030 "Semaphore.c" +} + + +static AbstractSemaphoreWaitAction event_semaphore_real_do_wait (AbstractSemaphore* base) { + EventSemaphore * self; + AbstractSemaphoreWaitAction result = 0; + AbstractSemaphoreWaitAction _tmp0_ = 0; + gboolean _tmp1_ = FALSE; +#line 150 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_EVENT_SEMAPHORE, EventSemaphore); +#line 151 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp1_ = self->priv->fired; +#line 151 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + if (_tmp1_) { +#line 151 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = ABSTRACT_SEMAPHORE_WAIT_ACTION_READY; +#line 1047 "Semaphore.c" + } else { +#line 151 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + _tmp0_ = ABSTRACT_SEMAPHORE_WAIT_ACTION_SLEEP; +#line 1051 "Semaphore.c" + } +#line 151 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = _tmp0_; +#line 151 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 1057 "Semaphore.c" +} + + +static gboolean event_semaphore_real_do_reset (AbstractSemaphore* base) { + EventSemaphore * self; + gboolean result = FALSE; +#line 154 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_EVENT_SEMAPHORE, EventSemaphore); +#line 155 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->fired = FALSE; +#line 157 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + result = TRUE; +#line 157 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + return result; +#line 1072 "Semaphore.c" +} + + +static void event_semaphore_class_init (EventSemaphoreClass * klass) { +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + event_semaphore_parent_class = g_type_class_peek_parent (klass); +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->finalize = event_semaphore_finalize; +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + g_type_class_add_private (klass, sizeof (EventSemaphorePrivate)); +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_notify = event_semaphore_real_do_notify; +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_wait = event_semaphore_real_do_wait; +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ((AbstractSemaphoreClass *) klass)->do_reset = event_semaphore_real_do_reset; +#line 1089 "Semaphore.c" +} + + +static void event_semaphore_instance_init (EventSemaphore * self) { +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv = EVENT_SEMAPHORE_GET_PRIVATE (self); +#line 138 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self->priv->fired = FALSE; +#line 1098 "Semaphore.c" +} + + +static void event_semaphore_finalize (AbstractSemaphore* obj) { + EventSemaphore * self; +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_EVENT_SEMAPHORE, EventSemaphore); +#line 137 "/home/jens/Source/shotwell/src/threads/Semaphore.vala" + ABSTRACT_SEMAPHORE_CLASS (event_semaphore_parent_class)->finalize (obj); +#line 1108 "Semaphore.c" +} + + +GType event_semaphore_get_type (void) { + static volatile gsize event_semaphore_type_id__volatile = 0; + if (g_once_init_enter (&event_semaphore_type_id__volatile)) { + static const GTypeInfo g_define_type_info = { sizeof (EventSemaphoreClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) event_semaphore_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (EventSemaphore), 0, (GInstanceInitFunc) event_semaphore_instance_init, NULL }; + GType event_semaphore_type_id; + event_semaphore_type_id = g_type_register_static (TYPE_ABSTRACT_SEMAPHORE, "EventSemaphore", &g_define_type_info, 0); + g_once_init_leave (&event_semaphore_type_id__volatile, event_semaphore_type_id); + } + return event_semaphore_type_id__volatile; +} + + +static void _vala_clear_GMutex (GMutex * mutex) { + GMutex zero_mutex = { 0 }; + if (memcmp (mutex, &zero_mutex, sizeof (GMutex))) { + g_mutex_clear (mutex); + memset (mutex, 0, sizeof (GMutex)); + } +} + + +static void _vala_clear_GRecMutex (GRecMutex * mutex) { + GRecMutex zero_mutex = { 0 }; + if (memcmp (mutex, &zero_mutex, sizeof (GRecMutex))) { + g_rec_mutex_clear (mutex); + memset (mutex, 0, sizeof (GRecMutex)); + } +} + + +static void _vala_clear_GRWLock (GRWLock * mutex) { + GRWLock zero_mutex = { 0 }; + if (memcmp (mutex, &zero_mutex, sizeof (GRWLock))) { + g_rw_lock_clear (mutex); + memset (mutex, 0, sizeof (GRWLock)); + } +} + + +static void _vala_clear_GCond (GCond * mutex) { + GCond zero_mutex = { 0 }; + if (memcmp (mutex, &zero_mutex, sizeof (GCond))) { + g_cond_clear (mutex); + memset (mutex, 0, sizeof (GCond)); + } +} + + + diff --git a/src/threads/Threads.c b/src/threads/Threads.c new file mode 100644 index 0000000..d87457f --- /dev/null +++ b/src/threads/Threads.c @@ -0,0 +1,28 @@ +/* Threads.c generated by valac 0.32.1, the Vala compiler + * generated from Threads.vala, do not modify */ + +/* Copyright 2016 Software Freedom Conservancy Inc. + * + * This software is licensed under the GNU Lesser General Public License + * (version 2.1 or later). See the COPYING file in this distribution. + */ + +#include <glib.h> +#include <glib-object.h> + + + + +void threads_init (GError** error); +void threads_terminate (void); + + +void threads_init (GError** error) { +} + + +void threads_terminate (void) { +} + + + diff --git a/src/threads/Workers.c b/src/threads/Workers.c new file mode 100644 index 0000000..92d5e97 --- /dev/null +++ b/src/threads/Workers.c @@ -0,0 +1,1074 @@ +/* Workers.c generated by valac 0.32.1, the Vala compiler + * generated from Workers.vala, do not modify */ + +/* Copyright 2016 Software Freedom Conservancy Inc. + * + * This software is licensed under the GNU LGPL (version 2.1 or later). + * See the COPYING file in this distribution. + */ + +#include <glib.h> +#include <glib-object.h> +#include <gee.h> +#include <gobject/gvaluecollector.h> + + +#define TYPE_SORTED_LIST (sorted_list_get_type ()) +#define SORTED_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SORTED_LIST, SortedList)) +#define SORTED_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SORTED_LIST, SortedListClass)) +#define IS_SORTED_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SORTED_LIST)) +#define IS_SORTED_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SORTED_LIST)) +#define SORTED_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SORTED_LIST, SortedListClass)) + +typedef struct _SortedList SortedList; +typedef struct _SortedListClass SortedListClass; +typedef struct _SortedListPrivate SortedListPrivate; + +#define TYPE_BACKGROUND_JOB_BATCH (background_job_batch_get_type ()) +#define BACKGROUND_JOB_BATCH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BACKGROUND_JOB_BATCH, BackgroundJobBatch)) +#define BACKGROUND_JOB_BATCH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BACKGROUND_JOB_BATCH, BackgroundJobBatchClass)) +#define IS_BACKGROUND_JOB_BATCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BACKGROUND_JOB_BATCH)) +#define IS_BACKGROUND_JOB_BATCH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BACKGROUND_JOB_BATCH)) +#define BACKGROUND_JOB_BATCH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BACKGROUND_JOB_BATCH, BackgroundJobBatchClass)) + +typedef struct _BackgroundJobBatch BackgroundJobBatch; +typedef struct _BackgroundJobBatchClass BackgroundJobBatchClass; +typedef struct _BackgroundJobBatchPrivate BackgroundJobBatchPrivate; + +#define TYPE_BACKGROUND_JOB (background_job_get_type ()) +#define BACKGROUND_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BACKGROUND_JOB, BackgroundJob)) +#define BACKGROUND_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BACKGROUND_JOB, BackgroundJobClass)) +#define IS_BACKGROUND_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BACKGROUND_JOB)) +#define IS_BACKGROUND_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BACKGROUND_JOB)) +#define BACKGROUND_JOB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BACKGROUND_JOB, BackgroundJobClass)) + +typedef struct _BackgroundJob BackgroundJob; +typedef struct _BackgroundJobClass BackgroundJobClass; + +#define TYPE_WORKERS (workers_get_type ()) +#define WORKERS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_WORKERS, Workers)) +#define WORKERS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_WORKERS, WorkersClass)) +#define IS_WORKERS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_WORKERS)) +#define IS_WORKERS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_WORKERS)) +#define WORKERS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_WORKERS, WorkersClass)) + +typedef struct _Workers Workers; +typedef struct _WorkersClass WorkersClass; +typedef struct _WorkersPrivate WorkersPrivate; + +#define TYPE_ABSTRACT_SEMAPHORE (abstract_semaphore_get_type ()) +#define ABSTRACT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)) +#define ABSTRACT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphoreClass)) +#define IS_ABSTRACT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_ABSTRACT_SEMAPHORE)) +#define IS_ABSTRACT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_ABSTRACT_SEMAPHORE)) +#define ABSTRACT_SEMAPHORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphoreClass)) + +typedef struct _AbstractSemaphore AbstractSemaphore; +typedef struct _AbstractSemaphoreClass AbstractSemaphoreClass; + +#define TYPE_EVENT_SEMAPHORE (event_semaphore_get_type ()) +#define EVENT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_EVENT_SEMAPHORE, EventSemaphore)) +#define EVENT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_EVENT_SEMAPHORE, EventSemaphoreClass)) +#define IS_EVENT_SEMAPHORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_EVENT_SEMAPHORE)) +#define IS_EVENT_SEMAPHORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_EVENT_SEMAPHORE)) +#define EVENT_SEMAPHORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_EVENT_SEMAPHORE, EventSemaphoreClass)) + +typedef struct _EventSemaphore EventSemaphore; +typedef struct _EventSemaphoreClass EventSemaphoreClass; +#define _g_thread_pool_free0(var) ((var == NULL) ? NULL : (var = (g_thread_pool_free (var, FALSE, TRUE), NULL))) +#define _g_async_queue_unref0(var) ((var == NULL) ? NULL : (var = (g_async_queue_unref (var), NULL))) +#define _abstract_semaphore_unref0(var) ((var == NULL) ? NULL : (var = (abstract_semaphore_unref (var), NULL))) +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL))) +#define _background_job_unref0(var) ((var == NULL) ? NULL : (var = (background_job_unref (var), NULL))) +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) +typedef struct _ParamSpecWorkers ParamSpecWorkers; +#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); +#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; } +#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; } +#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + +struct _SortedList { + GObject parent_instance; + SortedListPrivate * priv; +}; + +struct _SortedListClass { + GObjectClass parent_class; +}; + +struct _BackgroundJobBatch { + SortedList parent_instance; + BackgroundJobBatchPrivate * priv; +}; + +struct _BackgroundJobBatchClass { + SortedListClass parent_class; +}; + +typedef gint64 (*Comparator) (void* a, void* b, void* user_data); +struct _Workers { + GTypeInstance parent_instance; + volatile int ref_count; + WorkersPrivate * priv; +}; + +struct _WorkersClass { + GTypeClass parent_class; + void (*finalize) (Workers *self); +}; + +struct _WorkersPrivate { + GThreadPool* thread_pool; + GAsyncQueue* queue; + GRecMutex __lock_queue; + EventSemaphore* empty_event; + gint enqueued; +}; + +struct _ParamSpecWorkers { + GParamSpec parent_instance; +}; + + +static gpointer background_job_batch_parent_class = NULL; +static gpointer workers_parent_class = NULL; + +GType sorted_list_get_type (void) G_GNUC_CONST; +GType background_job_batch_get_type (void) G_GNUC_CONST; +enum { + BACKGROUND_JOB_BATCH_DUMMY_PROPERTY +}; +BackgroundJobBatch* background_job_batch_new (void); +BackgroundJobBatch* background_job_batch_construct (GType object_type); +gint64 background_job_priority_comparator (void* a, void* b); +static gint64 _background_job_priority_comparator_comparator (void* a, void* b, gpointer self); +SortedList* sorted_list_new (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, Comparator cmp, void* cmp_target); +SortedList* sorted_list_construct (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, Comparator cmp, void* cmp_target); +gpointer background_job_ref (gpointer instance); +void background_job_unref (gpointer instance); +GParamSpec* param_spec_background_job (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void value_set_background_job (GValue* value, gpointer v_object); +void value_take_background_job (GValue* value, gpointer v_object); +gpointer value_get_background_job (const GValue* value); +GType background_job_get_type (void) G_GNUC_CONST; +gpointer workers_ref (gpointer instance); +void workers_unref (gpointer instance); +GParamSpec* param_spec_workers (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void value_set_workers (GValue* value, gpointer v_object); +void value_take_workers (GValue* value, gpointer v_object); +gpointer value_get_workers (const GValue* value); +GType workers_get_type (void) G_GNUC_CONST; +gpointer abstract_semaphore_ref (gpointer instance); +void abstract_semaphore_unref (gpointer instance); +GParamSpec* param_spec_abstract_semaphore (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void value_set_abstract_semaphore (GValue* value, gpointer v_object); +void value_take_abstract_semaphore (GValue* value, gpointer v_object); +gpointer value_get_abstract_semaphore (const GValue* value); +GType abstract_semaphore_get_type (void) G_GNUC_CONST; +GType event_semaphore_get_type (void) G_GNUC_CONST; +#define WORKERS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_WORKERS, WorkersPrivate)) +enum { + WORKERS_DUMMY_PROPERTY +}; +static void _background_job_unref0_ (gpointer var); +EventSemaphore* event_semaphore_new (void); +EventSemaphore* event_semaphore_construct (GType object_type); +#define WORKERS_UNLIMITED_THREADS -1 +Workers* workers_new (guint max_threads, gboolean exclusive); +Workers* workers_construct (GType object_type, guint max_threads, gboolean exclusive); +void abstract_semaphore_notify (AbstractSemaphore* self); +static void workers_thread_start (Workers* self, void* ignored); +static void _workers_thread_start_gfunc (gpointer data, gpointer self); +guint workers_threads_per_cpu (gint per, gint max); +guint workers_thread_per_cpu_minus_one (void); +void workers_enqueue (Workers* self, BackgroundJob* job); +gboolean abstract_semaphore_reset (AbstractSemaphore* self); +gint background_job_priority_compare_func (BackgroundJob* a, BackgroundJob* b); +static gint _background_job_priority_compare_func_gcompare_data_func (gconstpointer a, gconstpointer b, gpointer self); +void workers_enqueue_many (Workers* self, BackgroundJobBatch* batch); +void workers_wait_for_empty_queue (Workers* self); +void abstract_semaphore_wait (AbstractSemaphore* self); +gint workers_get_pending_job_count (Workers* self); +gboolean background_job_is_cancelled (BackgroundJob* self); +void background_job_execute (BackgroundJob* self); +void background_job_internal_notify_completion (BackgroundJob* self); +static void workers_finalize (Workers* obj); + + +static gint64 _background_job_priority_comparator_comparator (void* a, void* b, gpointer self) { + gint64 result; + result = background_job_priority_comparator (a, b); +#line 10 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return result; +#line 204 "Workers.c" +} + + +BackgroundJobBatch* background_job_batch_construct (GType object_type) { + BackgroundJobBatch * self = NULL; +#line 10 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self = (BackgroundJobBatch*) sorted_list_construct (object_type, TYPE_BACKGROUND_JOB, (GBoxedCopyFunc) background_job_ref, background_job_unref, _background_job_priority_comparator_comparator, NULL); +#line 9 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return self; +#line 214 "Workers.c" +} + + +BackgroundJobBatch* background_job_batch_new (void) { +#line 9 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return background_job_batch_construct (TYPE_BACKGROUND_JOB_BATCH); +#line 221 "Workers.c" +} + + +static void background_job_batch_class_init (BackgroundJobBatchClass * klass) { +#line 8 "/home/jens/Source/shotwell/src/threads/Workers.vala" + background_job_batch_parent_class = g_type_class_peek_parent (klass); +#line 228 "Workers.c" +} + + +static void background_job_batch_instance_init (BackgroundJobBatch * self) { +} + + +GType background_job_batch_get_type (void) { + static volatile gsize background_job_batch_type_id__volatile = 0; + if (g_once_init_enter (&background_job_batch_type_id__volatile)) { + static const GTypeInfo g_define_type_info = { sizeof (BackgroundJobBatchClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) background_job_batch_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (BackgroundJobBatch), 0, (GInstanceInitFunc) background_job_batch_instance_init, NULL }; + GType background_job_batch_type_id; + background_job_batch_type_id = g_type_register_static (TYPE_SORTED_LIST, "BackgroundJobBatch", &g_define_type_info, 0); + g_once_init_leave (&background_job_batch_type_id__volatile, background_job_batch_type_id); + } + return background_job_batch_type_id__volatile; +} + + +static void _background_job_unref0_ (gpointer var) { +#line 19 "/home/jens/Source/shotwell/src/threads/Workers.vala" + (var == NULL) ? NULL : (var = (background_job_unref (var), NULL)); +#line 251 "Workers.c" +} + + +static void _workers_thread_start_gfunc (gpointer data, gpointer self) { +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + workers_thread_start ((Workers*) self, data); +#line 258 "Workers.c" +} + + +Workers* workers_construct (GType object_type, guint max_threads, gboolean exclusive) { + Workers* self = NULL; + gboolean _tmp0_ = FALSE; + guint _tmp1_ = 0U; + EventSemaphore* _tmp3_ = NULL; + GError * _inner_error_ = NULL; +#line 23 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self = (Workers*) g_type_create_instance (object_type); +#line 24 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp1_ = max_threads; +#line 24 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (_tmp1_ <= ((guint) 0)) { +#line 274 "Workers.c" + guint _tmp2_ = 0U; +#line 24 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp2_ = max_threads; +#line 24 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = _tmp2_ != ((guint) WORKERS_UNLIMITED_THREADS); +#line 280 "Workers.c" + } else { +#line 24 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = FALSE; +#line 284 "Workers.c" + } +#line 24 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (_tmp0_) { +#line 25 "/home/jens/Source/shotwell/src/threads/Workers.vala" + max_threads = (guint) 1; +#line 290 "Workers.c" + } +#line 28 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp3_ = self->priv->empty_event; +#line 28 "/home/jens/Source/shotwell/src/threads/Workers.vala" + abstract_semaphore_notify (G_TYPE_CHECK_INSTANCE_CAST (_tmp3_, TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)); +#line 296 "Workers.c" + { + GThreadPool* _tmp4_ = NULL; + guint _tmp5_ = 0U; + gboolean _tmp6_ = FALSE; + GThreadPool* _tmp7_ = NULL; + GThreadPool* _tmp8_ = NULL; +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp5_ = max_threads; +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp6_ = exclusive; +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp7_ = g_thread_pool_new (_workers_thread_start_gfunc, self, (gint) _tmp5_, _tmp6_, &_inner_error_); +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp4_ = _tmp7_; +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (G_UNLIKELY (_inner_error_ != NULL)) { +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (_inner_error_->domain == G_THREAD_ERROR) { +#line 315 "Workers.c" + goto __catch6_g_thread_error; + } +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_clear_error (&_inner_error_); +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return NULL; +#line 324 "Workers.c" + } +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp8_ = _tmp4_; +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp4_ = NULL; +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _g_thread_pool_free0 (self->priv->thread_pool); +#line 31 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self->priv->thread_pool = _tmp8_; +#line 30 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _g_thread_pool_free0 (_tmp4_); +#line 336 "Workers.c" + } + goto __finally6; + __catch6_g_thread_error: + { + GError* err = NULL; + const gchar* _tmp9_ = NULL; +#line 30 "/home/jens/Source/shotwell/src/threads/Workers.vala" + err = _inner_error_; +#line 30 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _inner_error_ = NULL; +#line 33 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp9_ = err->message; +#line 33 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_error ("Workers.vala:33: Unable to create thread pool: %s", _tmp9_); +#line 30 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _g_error_free0 (err); +#line 353 "Workers.c" + } + __finally6: +#line 30 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (G_UNLIKELY (_inner_error_ != NULL)) { +#line 30 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 30 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_clear_error (&_inner_error_); +#line 30 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return NULL; +#line 364 "Workers.c" + } +#line 23 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return self; +#line 368 "Workers.c" +} + + +Workers* workers_new (guint max_threads, gboolean exclusive) { +#line 23 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return workers_construct (TYPE_WORKERS, max_threads, exclusive); +#line 375 "Workers.c" +} + + +guint workers_threads_per_cpu (gint per, gint max) { + guint result = 0U; + gint _tmp0_ = 0; + guint count = 0U; + guint _tmp1_ = 0U; + gint _tmp2_ = 0; + guint _tmp3_ = 0U; + gint _tmp4_ = 0; + guint _tmp9_ = 0U; + guint _tmp10_ = 0U; +#line 37 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = per; +#line 37 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _vala_return_val_if_fail (_tmp0_ > 0, "per > 0", 0U); +#line 38 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp1_ = g_get_num_processors (); +#line 38 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp2_ = per; +#line 38 "/home/jens/Source/shotwell/src/threads/Workers.vala" + count = _tmp1_ * _tmp2_; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp4_ = max; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (_tmp4_ < 0) { +#line 403 "Workers.c" + guint _tmp5_ = 0U; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp5_ = count; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp3_ = _tmp5_; +#line 409 "Workers.c" + } else { + guint _tmp6_ = 0U; + gint _tmp7_ = 0; + guint _tmp8_ = 0U; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp6_ = count; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp7_ = max; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp8_ = CLAMP (_tmp6_, (guint) 0, (guint) _tmp7_); +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp3_ = _tmp8_; +#line 422 "Workers.c" + } +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + result = _tmp3_; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp9_ = result; +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _vala_warn_if_fail (_tmp9_ > ((guint) 0), "result > 0"); +#line 40 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return result; +#line 432 "Workers.c" +} + + +guint workers_thread_per_cpu_minus_one (void) { + guint result = 0U; + guint _tmp0_ = 0U; + guint _tmp1_ = 0U; + guint _tmp2_ = 0U; + guint _tmp3_ = 0U; +#line 46 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = g_get_num_processors (); +#line 46 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp1_ = CLAMP (_tmp0_ - 1, (guint) 1, (guint) G_MAXINT); +#line 46 "/home/jens/Source/shotwell/src/threads/Workers.vala" + result = _tmp1_; +#line 46 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp2_ = result; +#line 46 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _vala_warn_if_fail (_tmp2_ > ((guint) 0), "result > 0"); +#line 46 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return result; +#line 454 "Workers.c" +} + + +static gpointer _background_job_ref0 (gpointer self) { +#line 55 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return self ? background_job_ref (self) : NULL; +#line 461 "Workers.c" +} + + +static gint _background_job_priority_compare_func_gcompare_data_func (gconstpointer a, gconstpointer b, gpointer self) { + gint result; + result = background_job_priority_compare_func ((BackgroundJob*) a, (BackgroundJob*) b); +#line 55 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return result; +#line 470 "Workers.c" +} + + +void workers_enqueue (Workers* self, BackgroundJob* job) { + EventSemaphore* _tmp0_ = NULL; + GError * _inner_error_ = NULL; +#line 51 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (IS_WORKERS (self)); +#line 51 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (IS_BACKGROUND_JOB (job)); +#line 52 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = self->priv->empty_event; +#line 52 "/home/jens/Source/shotwell/src/threads/Workers.vala" + abstract_semaphore_reset (G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)); +#line 485 "Workers.c" + { + GAsyncQueue* _tmp1_ = NULL; +#line 54 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp1_ = self->priv->queue; +#line 54 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_lock (&self->priv->__lock_queue); +#line 492 "Workers.c" + { + GAsyncQueue* _tmp2_ = NULL; + BackgroundJob* _tmp3_ = NULL; + BackgroundJob* _tmp4_ = NULL; + gint _tmp5_ = 0; +#line 55 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp2_ = self->priv->queue; +#line 55 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp3_ = job; +#line 55 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp4_ = _background_job_ref0 (_tmp3_); +#line 55 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_async_queue_push_sorted (_tmp2_, _tmp4_, _background_job_priority_compare_func_gcompare_data_func, NULL); +#line 56 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp5_ = self->priv->enqueued; +#line 56 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self->priv->enqueued = _tmp5_ + 1; +#line 510 "Workers.c" + } + __finally7: + { + GAsyncQueue* _tmp6_ = NULL; +#line 54 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp6_ = self->priv->queue; +#line 54 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_unlock (&self->priv->__lock_queue); +#line 519 "Workers.c" + } +#line 54 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (G_UNLIKELY (_inner_error_ != NULL)) { +#line 54 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 54 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_clear_error (&_inner_error_); +#line 54 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return; +#line 529 "Workers.c" + } + } + { + GThreadPool* _tmp7_ = NULL; + BackgroundJob* _tmp8_ = NULL; +#line 60 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp7_ = self->priv->thread_pool; +#line 60 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp8_ = job; +#line 60 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_thread_pool_push (_tmp7_, _tmp8_, &_inner_error_); +#line 60 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (G_UNLIKELY (_inner_error_ != NULL)) { +#line 60 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (_inner_error_->domain == G_THREAD_ERROR) { +#line 545 "Workers.c" + goto __catch8_g_thread_error; + } +#line 60 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 60 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_clear_error (&_inner_error_); +#line 60 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return; +#line 554 "Workers.c" + } + } + goto __finally8; + __catch8_g_thread_error: + { + GError* err = NULL; + GError* _tmp9_ = NULL; + const gchar* _tmp10_ = NULL; +#line 59 "/home/jens/Source/shotwell/src/threads/Workers.vala" + err = _inner_error_; +#line 59 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _inner_error_ = NULL; +#line 64 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp9_ = err; +#line 64 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp10_ = _tmp9_->message; +#line 64 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_warning ("Workers.vala:64: Unable to create worker thread: %s", _tmp10_); +#line 59 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _g_error_free0 (err); +#line 575 "Workers.c" + } + __finally8: +#line 59 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (G_UNLIKELY (_inner_error_ != NULL)) { +#line 59 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 59 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_clear_error (&_inner_error_); +#line 59 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return; +#line 586 "Workers.c" + } +} + + +void workers_enqueue_many (Workers* self, BackgroundJobBatch* batch) { +#line 68 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (IS_WORKERS (self)); +#line 68 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (IS_BACKGROUND_JOB_BATCH (batch)); +#line 596 "Workers.c" + { + GeeIterator* _job_it = NULL; + BackgroundJobBatch* _tmp0_ = NULL; + GeeIterator* _tmp1_ = NULL; +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = batch; +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp1_ = gee_iterable_iterator (G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, GEE_TYPE_ITERABLE, GeeIterable)); +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _job_it = _tmp1_; +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + while (TRUE) { +#line 609 "Workers.c" + GeeIterator* _tmp2_ = NULL; + gboolean _tmp3_ = FALSE; + BackgroundJob* job = NULL; + GeeIterator* _tmp4_ = NULL; + gpointer _tmp5_ = NULL; + BackgroundJob* _tmp6_ = NULL; +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp2_ = _job_it; +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp3_ = gee_iterator_next (_tmp2_); +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (!_tmp3_) { +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + break; +#line 624 "Workers.c" + } +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp4_ = _job_it; +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp5_ = gee_iterator_get (_tmp4_); +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + job = (BackgroundJob*) _tmp5_; +#line 70 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp6_ = job; +#line 70 "/home/jens/Source/shotwell/src/threads/Workers.vala" + workers_enqueue (self, _tmp6_); +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _background_job_unref0 (job); +#line 638 "Workers.c" + } +#line 69 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _g_object_unref0 (_job_it); +#line 642 "Workers.c" + } +} + + +void workers_wait_for_empty_queue (Workers* self) { + EventSemaphore* _tmp0_ = NULL; +#line 73 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (IS_WORKERS (self)); +#line 74 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = self->priv->empty_event; +#line 74 "/home/jens/Source/shotwell/src/threads/Workers.vala" + abstract_semaphore_wait (G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)); +#line 655 "Workers.c" +} + + +gint workers_get_pending_job_count (Workers* self) { + gint result = 0; + GError * _inner_error_ = NULL; +#line 78 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_val_if_fail (IS_WORKERS (self), 0); +#line 664 "Workers.c" + { + GAsyncQueue* _tmp0_ = NULL; +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = self->priv->queue; +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_lock (&self->priv->__lock_queue); +#line 671 "Workers.c" + { + gint _tmp1_ = 0; +#line 80 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp1_ = self->priv->enqueued; +#line 80 "/home/jens/Source/shotwell/src/threads/Workers.vala" + result = _tmp1_; +#line 678 "Workers.c" + { + GAsyncQueue* _tmp2_ = NULL; +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp2_ = self->priv->queue; +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_unlock (&self->priv->__lock_queue); +#line 685 "Workers.c" + } +#line 80 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return result; +#line 689 "Workers.c" + } + __finally9: + { + GAsyncQueue* _tmp3_ = NULL; +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp3_ = self->priv->queue; +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_unlock (&self->priv->__lock_queue); +#line 698 "Workers.c" + } +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_clear_error (&_inner_error_); +#line 79 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return 0; +#line 706 "Workers.c" + } +} + + +static void workers_thread_start (Workers* self, void* ignored) { + BackgroundJob* job = NULL; + gboolean empty = FALSE; + gboolean _tmp7_ = FALSE; + GError * _inner_error_ = NULL; +#line 84 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (IS_WORKERS (self)); +#line 718 "Workers.c" + { + GAsyncQueue* _tmp0_ = NULL; +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = self->priv->queue; +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_lock (&self->priv->__lock_queue); +#line 725 "Workers.c" + { + GAsyncQueue* _tmp1_ = NULL; + gpointer _tmp2_ = NULL; + gint _tmp3_ = 0; + gint _tmp4_ = 0; + gint _tmp5_ = 0; +#line 88 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp1_ = self->priv->queue; +#line 88 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp2_ = g_async_queue_try_pop (_tmp1_); +#line 88 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _background_job_unref0 (job); +#line 88 "/home/jens/Source/shotwell/src/threads/Workers.vala" + job = (BackgroundJob*) _tmp2_; +#line 89 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _vala_assert (job != NULL, "job != null"); +#line 91 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp3_ = self->priv->enqueued; +#line 91 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _vala_assert (_tmp3_ > 0, "enqueued > 0"); +#line 92 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp4_ = self->priv->enqueued; +#line 92 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self->priv->enqueued = _tmp4_ - 1; +#line 92 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp5_ = self->priv->enqueued; +#line 92 "/home/jens/Source/shotwell/src/threads/Workers.vala" + empty = _tmp5_ == 0; +#line 754 "Workers.c" + } + __finally10: + { + GAsyncQueue* _tmp6_ = NULL; +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp6_ = self->priv->queue; +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_unlock (&self->priv->__lock_queue); +#line 763 "Workers.c" + } +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (G_UNLIKELY (_inner_error_ != NULL)) { +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _background_job_unref0 (job); +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_clear_error (&_inner_error_); +#line 87 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return; +#line 775 "Workers.c" + } + } +#line 95 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp7_ = background_job_is_cancelled (job); +#line 95 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (!_tmp7_) { +#line 96 "/home/jens/Source/shotwell/src/threads/Workers.vala" + background_job_execute (job); +#line 784 "Workers.c" + } +#line 98 "/home/jens/Source/shotwell/src/threads/Workers.vala" + background_job_internal_notify_completion (job); +#line 100 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (empty) { +#line 790 "Workers.c" + EventSemaphore* _tmp8_ = NULL; +#line 101 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp8_ = self->priv->empty_event; +#line 101 "/home/jens/Source/shotwell/src/threads/Workers.vala" + abstract_semaphore_notify (G_TYPE_CHECK_INSTANCE_CAST (_tmp8_, TYPE_ABSTRACT_SEMAPHORE, AbstractSemaphore)); +#line 796 "Workers.c" + } +#line 84 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _background_job_unref0 (job); +#line 800 "Workers.c" +} + + +static void value_workers_init (GValue* value) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + value->data[0].v_pointer = NULL; +#line 807 "Workers.c" +} + + +static void value_workers_free_value (GValue* value) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (value->data[0].v_pointer) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + workers_unref (value->data[0].v_pointer); +#line 816 "Workers.c" + } +} + + +static void value_workers_copy_value (const GValue* src_value, GValue* dest_value) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (src_value->data[0].v_pointer) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + dest_value->data[0].v_pointer = workers_ref (src_value->data[0].v_pointer); +#line 826 "Workers.c" + } else { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + dest_value->data[0].v_pointer = NULL; +#line 830 "Workers.c" + } +} + + +static gpointer value_workers_peek_pointer (const GValue* value) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return value->data[0].v_pointer; +#line 838 "Workers.c" +} + + +static gchar* value_workers_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (collect_values[0].v_pointer) { +#line 845 "Workers.c" + Workers* object; + object = collect_values[0].v_pointer; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (object->parent_instance.g_class == NULL) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 852 "Workers.c" + } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); +#line 856 "Workers.c" + } +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + value->data[0].v_pointer = workers_ref (object); +#line 860 "Workers.c" + } else { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + value->data[0].v_pointer = NULL; +#line 864 "Workers.c" + } +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return NULL; +#line 868 "Workers.c" +} + + +static gchar* value_workers_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + Workers** object_p; + object_p = collect_values[0].v_pointer; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (!object_p) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); +#line 879 "Workers.c" + } +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (!value->data[0].v_pointer) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + *object_p = NULL; +#line 885 "Workers.c" + } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + *object_p = value->data[0].v_pointer; +#line 889 "Workers.c" + } else { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + *object_p = workers_ref (value->data[0].v_pointer); +#line 893 "Workers.c" + } +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return NULL; +#line 897 "Workers.c" +} + + +GParamSpec* param_spec_workers (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) { + ParamSpecWorkers* spec; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_val_if_fail (g_type_is_a (object_type, TYPE_WORKERS), NULL); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + G_PARAM_SPEC (spec)->value_type = object_type; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return G_PARAM_SPEC (spec); +#line 911 "Workers.c" +} + + +gpointer value_get_workers (const GValue* value) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_WORKERS), NULL); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return value->data[0].v_pointer; +#line 920 "Workers.c" +} + + +void value_set_workers (GValue* value, gpointer v_object) { + Workers* old; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_WORKERS)); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + old = value->data[0].v_pointer; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (v_object) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_WORKERS)); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + value->data[0].v_pointer = v_object; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + workers_ref (value->data[0].v_pointer); +#line 940 "Workers.c" + } else { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + value->data[0].v_pointer = NULL; +#line 944 "Workers.c" + } +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (old) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + workers_unref (old); +#line 950 "Workers.c" + } +} + + +void value_take_workers (GValue* value, gpointer v_object) { + Workers* old; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_WORKERS)); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + old = value->data[0].v_pointer; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (v_object) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_WORKERS)); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + value->data[0].v_pointer = v_object; +#line 969 "Workers.c" + } else { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + value->data[0].v_pointer = NULL; +#line 973 "Workers.c" + } +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (old) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + workers_unref (old); +#line 979 "Workers.c" + } +} + + +static void workers_class_init (WorkersClass * klass) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + workers_parent_class = g_type_class_peek_parent (klass); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + ((WorkersClass *) klass)->finalize = workers_finalize; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_type_class_add_private (klass, sizeof (WorkersPrivate)); +#line 991 "Workers.c" +} + + +static void workers_instance_init (Workers * self) { + GAsyncQueue* _tmp0_ = NULL; + EventSemaphore* _tmp1_ = NULL; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self->priv = WORKERS_GET_PRIVATE (self); +#line 19 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_init (&self->priv->__lock_queue); +#line 19 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp0_ = g_async_queue_new_full (_background_job_unref0_); +#line 19 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self->priv->queue = _tmp0_; +#line 20 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _tmp1_ = event_semaphore_new (); +#line 20 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self->priv->empty_event = _tmp1_; +#line 21 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self->priv->enqueued = 0; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self->ref_count = 1; +#line 1014 "Workers.c" +} + + +static void workers_finalize (Workers* obj) { + Workers * self; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_WORKERS, Workers); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_signal_handlers_destroy (self); +#line 18 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _g_thread_pool_free0 (self->priv->thread_pool); +#line 19 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_rec_mutex_clear (&self->priv->__lock_queue); +#line 19 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _g_async_queue_unref0 (self->priv->queue); +#line 20 "/home/jens/Source/shotwell/src/threads/Workers.vala" + _abstract_semaphore_unref0 (self->priv->empty_event); +#line 1032 "Workers.c" +} + + +GType workers_get_type (void) { + static volatile gsize workers_type_id__volatile = 0; + if (g_once_init_enter (&workers_type_id__volatile)) { + static const GTypeValueTable g_define_type_value_table = { value_workers_init, value_workers_free_value, value_workers_copy_value, value_workers_peek_pointer, "p", value_workers_collect_value, "p", value_workers_lcopy_value }; + static const GTypeInfo g_define_type_info = { sizeof (WorkersClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) workers_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Workers), 0, (GInstanceInitFunc) workers_instance_init, &g_define_type_value_table }; + static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) }; + GType workers_type_id; + workers_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Workers", &g_define_type_info, &g_define_type_fundamental_info, 0); + g_once_init_leave (&workers_type_id__volatile, workers_type_id); + } + return workers_type_id__volatile; +} + + +gpointer workers_ref (gpointer instance) { + Workers* self; + self = instance; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_atomic_int_inc (&self->ref_count); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + return instance; +#line 1057 "Workers.c" +} + + +void workers_unref (gpointer instance) { + Workers* self; + self = instance; +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + if (g_atomic_int_dec_and_test (&self->ref_count)) { +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + WORKERS_GET_CLASS (self)->finalize (self); +#line 15 "/home/jens/Source/shotwell/src/threads/Workers.vala" + g_type_free_instance ((GTypeInstance *) self); +#line 1070 "Workers.c" + } +} + + + diff --git a/src/threads/mk/threads.mk b/src/threads/mk/threads.mk deleted file mode 100644 index 83afc47..0000000 --- a/src/threads/mk/threads.mk +++ /dev/null @@ -1,30 +0,0 @@ - -# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with -# a init() and terminate() function declared in the namespace. -UNIT_NAME := Threads - -# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all -# lowercase. The name of this file should be UNIT_DIR.mk. -UNIT_DIR := threads - -# All Vala files in the unit should be listed here with no subdirectory prefix. -# -# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala. -UNIT_FILES := \ - Workers.vala \ - BackgroundJob.vala \ - Semaphore.vala - -# Any unit this unit relies upon (and should be initialized before it's initialized) should -# be listed here using its Vala namespace. -# -# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here. -UNIT_USES := - -# List any additional files that are used in the build process as a part of this unit that should -# be packaged in the tarball. File names should be relative to the unit's home directory. -UNIT_RC := - -# unitize.mk must be called at the end of each UNIT_DIR.mk file. -include unitize.mk - |