aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2015-06-12 14:56:59 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2015-06-16 21:49:49 +0300
commit3b85a98072bfee1cc86dc5ed016fbf34f4e7255e (patch)
tree1af130ad1bec75e4f4c6a3ce36bc6cb96e0eccaa /platform
parent363707e3686a26d258c027e2c7bec2b0be9aab6b (diff)
linux-generic: thread: updated thread mask handling
Linux generic thread mask handling uses thrmask API. Added worker and control masks for easy implementation of functions returning those masks. Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com> Reviewed-and-tested-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/include/odp_internal.h3
-rw-r--r--platform/linux-generic/odp_init.c4
-rw-r--r--platform/linux-generic/odp_thread.c71
3 files changed, 43 insertions, 35 deletions
diff --git a/platform/linux-generic/include/odp_internal.h b/platform/linux-generic/include/odp_internal.h
index 8c5d339..6f0050f 100644
--- a/platform/linux-generic/include/odp_internal.h
+++ b/platform/linux-generic/include/odp_internal.h
@@ -19,6 +19,7 @@ extern "C" {
#endif
#include <odp/init.h>
+#include <odp/thread.h>
extern __thread int __odp_errno;
@@ -42,7 +43,7 @@ extern struct odp_global_data_s odp_global_data;
int odp_system_info_init(void);
int odp_thread_init_global(void);
-int odp_thread_init_local(void);
+int odp_thread_init_local(odp_thread_type_t type);
int odp_thread_term_local(void);
int odp_thread_term_global(void);
diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c
index 48c9bba..48d9b20 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -121,14 +121,14 @@ int odp_term_global(void)
return rc;
}
-int odp_init_local(odp_thread_type_t thr_type ODP_UNUSED)
+int odp_init_local(odp_thread_type_t thr_type)
{
if (odp_shm_init_local()) {
ODP_ERR("ODP shm local init failed.\n");
return -1;
}
- if (odp_thread_init_local()) {
+ if (odp_thread_init_local(thr_type)) {
ODP_ERR("ODP thread local init failed.\n");
return -1;
}
diff --git a/platform/linux-generic/odp_thread.c b/platform/linux-generic/odp_thread.c
index e815009..85ca047 100644
--- a/platform/linux-generic/odp_thread.c
+++ b/platform/linux-generic/odp_thread.c
@@ -10,6 +10,7 @@
#include <sched.h>
#include <odp/thread.h>
+#include <odp/thrmask.h>
#include <odp_internal.h>
#include <odp/spinlock.h>
#include <odp/config.h>
@@ -22,17 +23,18 @@
#include <stdio.h>
#include <stdlib.h>
-#define MASK_SIZE_16 ((ODP_CONFIG_MAX_THREADS+15)/16)
-
typedef struct {
int thr;
int cpu;
+ odp_thread_type_t type;
} thread_state_t;
typedef struct {
thread_state_t thr[ODP_CONFIG_MAX_THREADS];
- uint16_t mask[MASK_SIZE_16];
+ odp_thrmask_t all;
+ odp_thrmask_t worker;
+ odp_thrmask_t control;
uint32_t num;
odp_spinlock_t lock;
} thread_globals_t;
@@ -61,6 +63,10 @@ int odp_thread_init_global(void)
memset(thread_globals, 0, sizeof(thread_globals_t));
odp_spinlock_init(&thread_globals->lock);
+ odp_thrmask_zero(&thread_globals->all);
+ odp_thrmask_zero(&thread_globals->worker);
+ odp_thrmask_zero(&thread_globals->control);
+
return 0;
}
@@ -75,59 +81,59 @@ int odp_thread_term_global(void)
return ret;
}
-static int alloc_id(void)
+static int alloc_id(odp_thread_type_t type)
{
- int i, j;
- uint16_t *mask = thread_globals->mask;
+ int thr;
+ odp_thrmask_t *all = &thread_globals->all;
if (thread_globals->num >= ODP_CONFIG_MAX_THREADS)
return -1;
- for (i = 0; i < MASK_SIZE_16; i++) {
- if (mask[i] != 0xffff) {
- for (j = 0; j < 16; j++) {
- uint16_t bit = 0x1 << j;
- if ((bit & mask[i]) == 0) {
- mask[i] |= bit;
- thread_globals->num++;
- return i*16 + j;
- }
- }
- return -2;
+ for (thr = 0; thr < ODP_CONFIG_MAX_THREADS; thr++) {
+ if (odp_thrmask_isset(all, thr) == 0) {
+ odp_thrmask_set(all, thr);
+
+ if (type == ODP_THREAD_WORKER)
+ odp_thrmask_set(&thread_globals->worker, thr);
+ else
+ odp_thrmask_set(&thread_globals->control, thr);
+
+ thread_globals->num++;
+ return thr;
}
}
return -2;
}
-static int free_id(int id)
+static int free_id(int thr)
{
- int i, j;
- uint16_t *mask = thread_globals->mask;
- uint16_t bit;
+ odp_thrmask_t *all = &thread_globals->all;
- if (id < 0 || id >= ODP_CONFIG_MAX_THREADS)
+ if (thr < 0 || thr >= ODP_CONFIG_MAX_THREADS)
return -1;
- i = id / 16;
- j = id - (i * 16);
- bit = 0x1 << j;
-
- if ((bit & mask[i]) == 0)
+ if (odp_thrmask_isset(all, thr) == 0)
return -1;
- mask[i] &= ~bit;
+ odp_thrmask_clr(all, thr);
+
+ if (thread_globals->thr[thr].type == ODP_THREAD_WORKER)
+ odp_thrmask_clr(&thread_globals->worker, thr);
+ else
+ odp_thrmask_clr(&thread_globals->control, thr);
+
thread_globals->num--;
return thread_globals->num;
}
-int odp_thread_init_local(void)
+int odp_thread_init_local(odp_thread_type_t type)
{
int id;
int cpu;
odp_spinlock_lock(&thread_globals->lock);
- id = alloc_id();
+ id = alloc_id(type);
odp_spinlock_unlock(&thread_globals->lock);
if (id < 0) {
@@ -142,8 +148,9 @@ int odp_thread_init_local(void)
return -1;
}
- thread_globals->thr[id].thr = id;
- thread_globals->thr[id].cpu = cpu;
+ thread_globals->thr[id].thr = id;
+ thread_globals->thr[id].cpu = cpu;
+ thread_globals->thr[id].type = type;
this_thread = &thread_globals->thr[id];
return 0;