From c388ad8910dbb1a3c478176d8b1ab3142fdbd9d5 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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