aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic
diff options
context:
space:
mode:
authorTaras Kondratiuk <taras.kondratiuk@linaro.org>2014-12-18 13:19:39 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2014-12-18 16:38:33 +0300
commita75f7a0b76bda95bd7492904702aba7729df5af0 (patch)
tree884c1ad5af70d307288103afe5fc2519b39a4f9f /platform/linux-generic
parent2da50e616965e4b17bafa34897e99fd2f5645dc5 (diff)
linux-generic: init: implement basic odp_term_local()
Signed-off-by: Taras Kondratiuk <taras.kondratiuk@linaro.org> Reviewed-by: Petri Savolainen <petri.savolainen@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform/linux-generic')
-rw-r--r--platform/linux-generic/include/odp_internal.h1
-rw-r--r--platform/linux-generic/odp_init.c3
-rw-r--r--platform/linux-generic/odp_linux.c10
-rw-r--r--platform/linux-generic/odp_thread.c14
4 files changed, 22 insertions, 6 deletions
diff --git a/platform/linux-generic/include/odp_internal.h b/platform/linux-generic/include/odp_internal.h
index ee2ab1a0d..549d40663 100644
--- a/platform/linux-generic/include/odp_internal.h
+++ b/platform/linux-generic/include/odp_internal.h
@@ -23,6 +23,7 @@ int odp_system_info_init(void);
int odp_thread_init_global(void);
int odp_thread_init_local(void);
+int odp_thread_term_local(void);
int odp_shm_init_global(void);
int odp_shm_init_local(void);
diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c
index c66123136..7210430ad 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -90,6 +90,5 @@ int odp_init_local(void)
int odp_term_local(void)
{
- ODP_UNIMPLEMENTED();
- return 0;
+ return (odp_thread_term_local() > 0) ? 1 : 0;
}
diff --git a/platform/linux-generic/odp_linux.c b/platform/linux-generic/odp_linux.c
index 95761a911..229d24e9f 100644
--- a/platform/linux-generic/odp_linux.c
+++ b/platform/linux-generic/odp_linux.c
@@ -43,9 +43,15 @@ static void *odp_run_start_routine(void *arg)
return NULL;
}
- void *ret = start_args->start_routine(start_args->arg);
+ void *ret_ptr = start_args->start_routine(start_args->arg);
_odp_flush_caches();
- return ret;
+ int ret = odp_term_local();
+ if (ret < 0)
+ ODP_ERR("Local term failed\n");
+ else if (ret == 0 && odp_term_global())
+ ODP_ERR("Global term failed\n");
+
+ return ret_ptr;
}
diff --git a/platform/linux-generic/odp_thread.c b/platform/linux-generic/odp_thread.c
index faa12a27d..01c814776 100644
--- a/platform/linux-generic/odp_thread.c
+++ b/platform/linux-generic/odp_thread.c
@@ -32,6 +32,7 @@ typedef struct {
typedef struct {
thread_state_t thr[ODP_CONFIG_MAX_THREADS];
odp_atomic_u32_t num;
+ odp_atomic_u32_t next_id;
} thread_globals_t;
@@ -58,6 +59,8 @@ int odp_thread_init_global(void)
return -1;
memset(thread_globals, 0, sizeof(thread_globals_t));
+ odp_atomic_init_u32(&thread_globals->next_id, 0);
+ odp_atomic_init_u32(&thread_globals->num, 0);
return 0;
}
@@ -67,12 +70,13 @@ static int thread_id(void)
uint32_t id;
int cpu;
- id = odp_atomic_fetch_inc_u32(&thread_globals->num);
+ id = odp_atomic_fetch_inc_u32(&thread_globals->next_id);
if (id >= ODP_CONFIG_MAX_THREADS) {
ODP_ERR("Too many threads\n");
return -1;
}
+ odp_atomic_inc_u32(&thread_globals->num);
cpu = sched_getcpu();
@@ -87,7 +91,6 @@ static int thread_id(void)
return id;
}
-
int odp_thread_init_local(void)
{
int id;
@@ -101,6 +104,13 @@ int odp_thread_init_local(void)
return 0;
}
+int odp_thread_term_local(void)
+{
+ uint32_t num;
+ num = odp_atomic_fetch_dec_u32(&thread_globals->num);
+ ODP_ASSERT(num > 0, "Number of threads should be > 0");
+ return num - 1; /* return a number of threads left */
+}
int odp_thread_id(void)
{