*/
/**
+ * @brief The task template.
+ */
+typedef struct task task_t;
+
+/**
* @brief Called on the task execution.
*/
typedef void(*task_execute_cb)(task_t *task);
*/
typedef void(*task_shutdown_cb)(task_t *task);
-/**
- * @brief The task template.
- */
-typedef struct task
+struct task
{
task_init_cb init;
task_shutdown_cb shutdown;
task_execute_cb execute;
int frequency;
void *user_data;
-} task_t;
+};
/**
* @brief Initializes the task.
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Flora License, Version 1.1 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <glib.h>
+
+#include "worker.h"
+#include "log.h"
+#include "err-check.h"
+
+#define MAX_THREAD_DEFAULT 1
+
+static void worker_function(gpointer data, gpointer user_data);
+
+struct worker
+{
+ GThreadPool *thread_pool;
+};
+
+worker_t *worker_create()
+{
+ GError *err = NULL;
+ struct worker *_worker = g_malloc(sizeof(struct worker));
+
+ _worker->thread_pool = g_thread_pool_new((GFunc)worker_function, NULL, MAX_THREAD_DEFAULT, FALSE, &err);
+ if (err != NULL)
+ {
+ ERR("Failed to create thread pool ", err->message);
+ g_error_free (err);
+ g_free(_worker);
+ return NULL;
+ }
+ return _worker;
+}
+
+void worker_destroy(worker_t *worker)
+{
+ ON_NULL_RETURN(worker);
+
+ g_thread_pool_free (worker->thread_pool, FALSE, TRUE);
+ g_free(worker);
+}
+
+void worker_set_max_num_of_threads(worker_t *worker, int max_threads)
+{
+ ON_NULL_RETURN(worker);
+
+ GError *err = NULL;
+ g_thread_pool_set_max_threads(worker->thread_pool, max_threads, &err);
+ if (err != NULL)
+ {
+ ERR("Failed to set maximum threads for given pool ", err->message);
+ g_error_free (err);
+ }
+}
+
+int worker_enqueue_task(worker_t *worker, task_t task)
+{
+ ON_NULL_RETURN_VAL(worker, -1);
+
+ return g_thread_pool_push(worker->thread_pool, &task, NULL);
+}
+
+static void worker_function(gpointer data, gpointer user_data)
+{
+ task_t *task = (task_t *)data;
+ task->init(task);
+ task->execute(task);
+ task->shutdown(task);
+}
\ No newline at end of file
typedef struct worker worker_t;
/**
- * @brief Worker mode enumeration.
- */
-typedef enum worker_mode
-{
- /**
- * @brief In this mode worker busy to idle proportion is low.
- */
- MODE_LOW,
-
- /**
- * @brief In this mode worker busy to idle proportion is balanced.
- */
- MODE_MEDIUM,
-
- /**
- * @brief In this mode worker busy to idle proportion is high.
- */
- MODE_HIGH
-} worker_mode_e;
-
-/**
* @brief Creates worker.
*/
worker_t *worker_create();
/**
* @brief Destroys worker.
*/
-void worker_destroy();
+void worker_destroy(worker_t *worker);
/**
* @brief Sets maximum number of threads that worker can use.
*/
int worker_enqueue_task(worker_t *worker, task_t task);
-/**
- * @brief Sets worker mode.
- * @param[in] worker Worker reference.
- */
-void worker_set_mode(worker_t *worker, worker_mode_e mode);
-
-/**
- * @brief Gets worker mode.
- * @param[in] worker Worker reference.
- */
-worker_mode_e worker_get_mode(worker_t *worker);
-
-#endif
\ No newline at end of file
+#endif