From c388ad8910dbb1a3c478176d8b1ab3142fdbd9d5 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 20 Dec 2020 23:20:22 +0100
Subject: Completed the Python API for work groups.

---
 plugins/pychrysalide/core/queue.c | 116 ++++++++++++++++++++++++++++++++++++++
 src/core/queue.c                  |   6 +-
 2 files changed, 118 insertions(+), 4 deletions(-)

diff --git a/plugins/pychrysalide/core/queue.c b/plugins/pychrysalide/core/queue.c
index 5a0f524..d0fbed8 100644
--- a/plugins/pychrysalide/core/queue.c
+++ b/plugins/pychrysalide/core/queue.c
@@ -36,6 +36,12 @@
 
 
 
+/* Constitue un nouveau groupe de travail global. */
+static PyObject *py_queue_setup_global_work_group(PyObject *, PyObject *);
+
+/* Constitue un nouveau petit groupe de travail global. */
+static PyObject *py_queue_setup_tiny_global_work_group(PyObject *, PyObject *);
+
 /* Attend que toutes les tâches de tout groupe soient traitées. */
 static PyObject *py_queue_wait_for_all_global_works(PyObject *, PyObject *);
 
@@ -46,6 +52,114 @@ static PyObject *py_queue_wait_for_all_global_works(PyObject *, PyObject *);
 *  Paramètres  : self = objet Python concerné par l'appel.                    *
 *                args = non utilisé ici.                                      *
 *                                                                             *
+*  Description : Constitue un nouveau groupe de travail global.               *
+*                                                                             *
+*  Retour      : Nouvel identifiant unique d'un nouveau groupe de travail.    *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_queue_setup_global_work_group(PyObject *self, PyObject *args)
+{
+    PyObject *result;                       /* Valeur à retourner          */
+    PyThreadState *_save;                   /* Sauvegarde de contexte      */
+    wgroup_id_t wid;                        /* Identifiant de groupe       */
+
+#define QUEUE_SETUP_GLOBAL_WORK_GROUP_METHOD PYTHON_METHOD_DEF  \
+(                                                               \
+    setup_global_work_group, "",                                \
+    METH_NOARGS, py_queue,                                      \
+    "Create a new work group for parallel processed jobs.\n"    \
+    "\n"                                                        \
+    "The quantity of threads allocated for processing future"   \
+    " data depends of available CPU cores.\n"                   \
+    "\n"                                                        \
+    "The returned value is an integer value referring to the"   \
+    " unique identifier of a work group."                       \
+)
+
+    Py_UNBLOCK_THREADS;
+
+    wid = setup_global_work_group();
+
+    result = PyLong_FromUnsignedLongLong(wid);
+
+    Py_BLOCK_THREADS;
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : self = objet Python concerné par l'appel.                    *
+*                args = paramètre à récupérer pour le traitement.             *
+*                                                                             *
+*  Description : Constitue un nouveau petit groupe de travail global.         *
+*                                                                             *
+*  Retour      : Nouvel identifiant unique d'un nouveau groupe de travail.    *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_queue_setup_tiny_global_work_group(PyObject *self, PyObject *args)
+{
+    PyObject *result;                       /* Valeur à retourner          */
+    unsigned int count;                     /* Nombre de thread parallèle  */
+    PyThreadState *_save;                   /* Sauvegarde de contexte      */
+
+    int ret;                                /* Bilan de lecture des args.  */
+    wgroup_id_t wid;                        /* Identifiant de groupe       */
+
+#define QUEUE_SETUP_TINY_GLOBAL_WORK_GROUP_METHOD PYTHON_METHOD_DEF \
+(                                                                   \
+    setup_tiny_global_work_group, "/, count = 1",                   \
+    METH_VARARGS, py_queue,                                         \
+    "Create a new tiny work group for parallel processed jobs.\n"   \
+    "\n"                                                            \
+    "The *count* argument defines the quantity of threads allocated"\
+    " for processing future data.\n"                                \
+    "\n"                                                            \
+    "The returned value is an integer value referring to the"       \
+    " unique identifier of a work group."                           \
+)
+
+    result = NULL;
+
+    count = 1;
+
+    Py_UNBLOCK_THREADS;
+
+    ret = PyArg_ParseTuple(args, "|I", &count);
+    if (!ret) goto exit;
+
+    if (count < 1)
+    {
+        PyErr_SetString(PyExc_ValueError, "the provided quantity has to be strictly positive");
+        goto exit;
+    }
+
+    wid = setup_tiny_global_work_group(count);
+
+    result = PyLong_FromUnsignedLongLong(wid);
+
+ exit:
+
+    Py_BLOCK_THREADS;
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : self = objet Python concerné par l'appel.                    *
+*                args = non utilisé ici.                                      *
+*                                                                             *
 *  Description : Attend que toutes les tâches de tout groupe soient traitées. *
 *                                                                             *
 *  Retour      : None.                                                        *
@@ -94,6 +208,8 @@ bool populate_core_module_with_queue(void)
     PyObject *module;                       /* Module à recompléter        */
 
     static PyMethodDef py_queue_methods[] = {
+        QUEUE_SETUP_GLOBAL_WORK_GROUP_METHOD,
+        QUEUE_SETUP_TINY_GLOBAL_WORK_GROUP_METHOD,
         QUEUE_WAIT_FOR_ALL_GLOBAL_WORKS_METHOD,
         { NULL }
     };
diff --git a/src/core/queue.c b/src/core/queue.c
index 9323803..035f1e0 100644
--- a/src/core/queue.c
+++ b/src/core/queue.c
@@ -109,8 +109,7 @@ wgroup_id_t setup_global_work_group(void)
 
     G_LOCK(_gg_mutex);
 
-    _global_group_ids = (wgroup_id_t *)realloc(_global_group_ids,
-                                               ++_global_group_count * sizeof(wgroup_id_t));
+    _global_group_ids = realloc(_global_group_ids, ++_global_group_count * sizeof(wgroup_id_t));
 
     _global_group_ids[_global_group_count - 1] = result;
 
@@ -144,8 +143,7 @@ wgroup_id_t setup_tiny_global_work_group(guint count)
 
     G_LOCK(_gg_mutex);
 
-    _global_group_ids = (wgroup_id_t *)realloc(_global_group_ids,
-                                               ++_global_group_count * sizeof(wgroup_id_t));
+    _global_group_ids = realloc(_global_group_ids, ++_global_group_count * sizeof(wgroup_id_t));
 
     _global_group_ids[_global_group_count - 1] = result;
 
-- 
cgit v0.11.2-87-g4458