From f8f31456786374baee9014331ba1aef267508375 Mon Sep 17 00:00:00 2001 From: bossiel Date: Tue, 30 Mar 2010 00:12:55 +0000 Subject: [PATCH] Update documentation. --- trunk/documentation/programmer-guide-1.0.doc | Bin 77824 -> 88064 bytes trunk/tinySAK/src/tsk_fsm.h | 4 +- trunk/tinySAK/src/tsk_list.c | 10 +- trunk/tinySAK/src/tsk_list.h | 10 +- trunk/tinySAK/src/tsk_object.h | 4 +- trunk/tinySAK/src/tsk_sha1.h | 2 +- trunk/tinySAK/src/tsk_timer.c | 104 +++++++------------ trunk/tinySAK/src/tsk_timer.h | 1 - trunk/tinySAK/test/test.c | 13 ++- trunk/tinySAK/test/test.vcproj | 4 + trunk/tinySAK/test/test_mutex.h | 8 +- trunk/tinySAK/test/test_object.h | 37 +++---- trunk/tinySAK/test/test_threads.h | 48 +++++++++ 13 files changed, 132 insertions(+), 113 deletions(-) create mode 100644 trunk/tinySAK/test/test_threads.h diff --git a/trunk/documentation/programmer-guide-1.0.doc b/trunk/documentation/programmer-guide-1.0.doc index c9f771088de9a57c5ddc8db8547ffc56e45c9a57..84dc10c630af07ca3cd9288dd95c3806fa2e446b 100644 GIT binary patch literal 88064 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 diff --git a/trunk/tinySAK/src/tsk_fsm.h b/trunk/tinySAK/src/tsk_fsm.h index 90cda600..84770fa4 100644 --- a/trunk/tinySAK/src/tsk_fsm.h +++ b/trunk/tinySAK/src/tsk_fsm.h @@ -74,10 +74,10 @@ TSK_BEGIN_DECLS #define tsk_fsm_action_any -0xFFFF /**@ingroup tsk_fsm_group -* @def tsk_fsm_state_id +* @def tsk_fsm_state_id_t */ /**@ingroup tsk_fsm_group -* @def tsk_fsm_action_id +* @def tsk_fsm_action_id_t */ /**@ingroup tsk_fsm_group * @def tsk_fsm_cond diff --git a/trunk/tinySAK/src/tsk_list.c b/trunk/tinySAK/src/tsk_list.c index 954cd686..1e8d33a6 100644 --- a/trunk/tinySAK/src/tsk_list.c +++ b/trunk/tinySAK/src/tsk_list.c @@ -63,7 +63,7 @@ void tsk_list_remove_item(tsk_list_t* list, tsk_list_item_t* item) * @param tskobj Any valid object(declared using @ref TSK_DECLARE_OBJECT) to remove. * @retval The item. */ -tsk_list_item_t* tsk_list_pop_item_by_data(tsk_list_t* list, const void * tskobj) +tsk_list_item_t* tsk_list_pop_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj) { if(list) { @@ -112,7 +112,7 @@ tsk_list_item_t* tsk_list_pop_item_by_data(tsk_list_t* list, const void * tskobj * @param list The list from which to remove the object. * @param tskobj Any valid object(declared using @ref TSK_DECLARE_OBJECT) to remove. */ -void tsk_list_remove_item_by_data(tsk_list_t* list, const void * tskobj) +void tsk_list_remove_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj) { tsk_list_item_t* item; if((item = tsk_list_pop_item_by_data(list, tskobj))){ @@ -177,7 +177,7 @@ tsk_list_item_t* tsk_list_pop_item_by_pred(tsk_list_t* list, tsk_list_func_predi * @param predicate The predicate function used to match the item. * @param data Arbitrary data to pass to the predicate function. */ -void tsk_list_remove_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const void * data) +void tsk_list_remove_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const tsk_object_t * data) { tsk_list_item_t* item; if((item = tsk_list_pop_item_by_pred(list, predicate, data))){ @@ -360,7 +360,7 @@ void tsk_list_push_filtered_data(tsk_list_t* list, void** data, int ascending) * @param tskobj The @a object to find. * @retval A @ref tsk_list_item_t item if found and NULL otherwize. */ -const tsk_list_item_t* tsk_list_find_item_by_data(const tsk_list_t* list, const void * tskobj) +const tsk_list_item_t* tsk_list_find_item_by_data(const tsk_list_t* list, const tsk_object_t * tskobj) { if(list && tskobj) { @@ -383,7 +383,7 @@ const tsk_list_item_t* tsk_list_find_item_by_data(const tsk_list_t* list, const * @param data data passed to the predicate function for comparaison * @retval the item which match the criteria and NULL otherwise */ -const tsk_list_item_t* tsk_list_find_item_by_pred(const tsk_list_t* list, tsk_list_func_predicate predicate, const void * data) +const tsk_list_item_t* tsk_list_find_item_by_pred(const tsk_list_t* list, tsk_list_func_predicate predicate, const tsk_object_t * data) { if(predicate) { diff --git a/trunk/tinySAK/src/tsk_list.h b/trunk/tinySAK/src/tsk_list.h index 11035e74..18da5ceb 100644 --- a/trunk/tinySAK/src/tsk_list.h +++ b/trunk/tinySAK/src/tsk_list.h @@ -96,10 +96,10 @@ typedef int (*tsk_list_func_predicate)(const tsk_list_item_t* item, const void* #define tsk_list_foreach(item, list) for(item = list?list->head:0; item; item= item->next) TINYSAK_API void tsk_list_remove_item(tsk_list_t* list, tsk_list_item_t* item); -TINYSAK_API tsk_list_item_t* tsk_list_pop_item_by_data(tsk_list_t* list, const void * tskobj); -TINYSAK_API void tsk_list_remove_item_by_data(tsk_list_t* list, const void * tskobj); -TINYSAK_API void tsk_list_remove_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const void * data); -TINYSAK_API tsk_list_item_t* tsk_list_pop_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const void * data); +TINYSAK_API tsk_list_item_t* tsk_list_pop_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj); +TINYSAK_API void tsk_list_remove_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj); +TINYSAK_API void tsk_list_remove_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const tsk_object_t * data); +TINYSAK_API tsk_list_item_t* tsk_list_pop_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const tsk_object_t * data); TINYSAK_API void tsk_list_clear_items(tsk_list_t* list); TINYSAK_API tsk_list_item_t* tsk_list_pop_first_item(tsk_list_t* list); @@ -121,7 +121,7 @@ TINYSAK_API void tsk_list_push_filtered_data(tsk_list_t* list, void** data, int #define tsk_list_push_ascending_data(list, data) tsk_list_push_filtered_data(list, data, 1) #define tsk_list_push_descending_data(list, data) tsk_list_push_filtered_data(list, data, 0) -TINYSAK_API const tsk_list_item_t* tsk_list_find_item_by_data(const tsk_list_t* list, const void * tskobj); +TINYSAK_API const tsk_list_item_t* tsk_list_find_item_by_data(const tsk_list_t* list, const tsk_object_t * tskobj); TINYSAK_API const tsk_list_item_t* tsk_list_find_item_by_pred(const tsk_list_t* list, tsk_list_func_predicate predicate, const void * data); TINYSAK_GEXTERN const void *tsk_list_def_t; diff --git a/trunk/tinySAK/src/tsk_object.h b/trunk/tinySAK/src/tsk_object.h index 935e55c8..09597fdd 100644 --- a/trunk/tinySAK/src/tsk_object.h +++ b/trunk/tinySAK/src/tsk_object.h @@ -43,12 +43,12 @@ TSK_BEGIN_DECLS typedef void tsk_object_t; /**@ingroup tsk_object_group -* Safely free any object created using @ref tsk_object_new and declared using @ref TSK_DECLARE_OBJECT. If the reference count of the object was equal to 1 then this +* Safely free any well-defined object. If the reference count of the object was equal to 1 then this * object will be freed otherwise the refrence counter will be decremented. * In all case this operation will set the pointer (the object itself) to NULL. * @param self The object to free or unref. **/ -#define TSK_OBJECT_SAFE_FREE(self) tsk_object_unref(self), self = 0 +#define TSK_OBJECT_SAFE_FREE(self) tsk_object_unref(self), self = tsk_null /**@ingroup tsk_object_group * tag a structure as an object. If this macro is used then you MUST diff --git a/trunk/tinySAK/src/tsk_sha1.h b/trunk/tinySAK/src/tsk_sha1.h index 62285de9..a0d31a6d 100644 --- a/trunk/tinySAK/src/tsk_sha1.h +++ b/trunk/tinySAK/src/tsk_sha1.h @@ -88,7 +88,7 @@ typedef char tsk_sha1digest_t[TSK_SHA1_DIGEST_SIZE]; /**< SHA-1 digest bytes. */ /**@ingroup tsk_sha1_group * This structure will hold context information for the SHA-1 - * hashing operation + * hashing SSESSION */ typedef struct tsk_sha1context_s { diff --git a/trunk/tinySAK/src/tsk_timer.c b/trunk/tinySAK/src/tsk_timer.c index d0966148..5bdb4368 100644 --- a/trunk/tinySAK/src/tsk_timer.c +++ b/trunk/tinySAK/src/tsk_timer.c @@ -46,11 +46,7 @@ /** * @struct tsk_timer_s - * * @brief Timer. - * - * @author Mamadou - * @date 12/20/2009 **/ typedef struct tsk_timer_s { @@ -70,15 +66,11 @@ typedef tsk_list_t tsk_timers_L_t; /**< List of @ref tsk_timer_t elements. */ * @struct tsk_timer_manager_s * * @brief Timer manager. - * - * @author Mamadou - * @date 12/20/2009 **/ typedef struct tsk_timer_manager_s { TSK_DECLARE_RUNNABLE; - unsigned active:1; void* mainThreadId[1]; tsk_condwait_handle_t *condwait; tsk_mutex_handle_t *mutex; @@ -96,7 +88,7 @@ static void __tsk_timer_manager_raise(tsk_timer_t *timer); static void *run(void* self); /**@ingroup tsk_timer_group -* Start the timer manager. +* Starts the timer manager. */ int tsk_timer_manager_start(tsk_timer_manager_handle_t *self) { @@ -105,34 +97,14 @@ int tsk_timer_manager_start(tsk_timer_manager_handle_t *self) if(manager && !TSK_RUNNABLE(manager)->running) { TSK_RUNNABLE(manager)->run = run; - if(err = tsk_runnable_start(TSK_RUNNABLE(manager), tsk_timer_def_t)) - { - TSK_OBJECT_SAFE_FREE(manager); - return err; - } - - if(err = tsk_thread_create(&(manager->mainThreadId[0]), __tsk_timer_manager_mainthread, manager)) - { - TSK_OBJECT_SAFE_FREE(manager); - - TSK_DEBUG_FATAL("Failed to start timer manager: %d\n", err); + if(err = tsk_runnable_start(TSK_RUNNABLE(manager), tsk_timer_def_t)){ + //TSK_OBJECT_SAFE_FREE(manager); return err; } } return err; } -/**@ingroup tsk_timer_group -*/ -int tsk_timer_manager_isready(tsk_timer_manager_handle_t *self) -{ - tsk_timer_manager_t *manager = self; - if(manager) - { - return (TSK_RUNNABLE(manager)->running && manager->active); - } - return 0; -} #if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG) /**@ingroup tsk_timer_group @@ -147,8 +119,7 @@ void tsk_timer_manager_debug(tsk_timer_manager_handle_t *self) tsk_mutex_lock(manager->mutex); - tsk_list_foreach(item, manager->timers) - { + tsk_list_foreach(item, manager->timers){ tsk_timer_t* timer = item->data; TSK_DEBUG_INFO("timer [%d]- %llu, %llu", timer->id, timer->timeout, tsk_time_epoch()); } @@ -185,8 +156,7 @@ tsk_timer_id_t tsk_timer_manager_schedule(tsk_timer_manager_handle_t *self, uint tsk_timer_id_t timer_id = TSK_INVALID_TIMER_ID; tsk_timer_manager_t *manager = self; - if(manager && TSK_RUNNABLE(manager)->running) - { + if(manager && TSK_RUNNABLE(manager)->running){ tsk_timer_t *timer; timer = TSK_TIMER_CREATE(timeout, callback, arg); @@ -240,16 +210,23 @@ int tsk_timer_manager_cancel(tsk_timer_manager_handle_t *self, tsk_timer_id_t id static void *run(void* self) { + int ret; tsk_list_item_t *curr; tsk_timer_manager_t *manager = self; + + TSK_RUNNABLE(manager)->running = tsk_true; // VERY IMPORTANT --> needed by the main thread + /* create main thread */ + if((ret = tsk_thread_create(&(manager->mainThreadId[0]), __tsk_timer_manager_mainthread, manager))){ + TSK_DEBUG_FATAL("Failed to create mainthread: %d\n", ret); + return tsk_null; + } + TSK_RUNNABLE_RUN_BEGIN(manager); - if(curr = TSK_RUNNABLE_POP_FIRST(manager)) - { + if(curr = TSK_RUNNABLE_POP_FIRST(manager)){ tsk_timer_t *timer = (tsk_timer_t *)curr->data; - if(timer->callback) - { + if(timer->callback){ timer->callback(timer->arg, timer->id); } tsk_object_unref(curr); @@ -257,14 +234,13 @@ static void *run(void* self) TSK_RUNNABLE_RUN_END(manager); - return 0; + return tsk_null; } static int __tsk_pred_find_timer_by_id(const tsk_list_item_t *item, const void *id) { tsk_timer_t *timer; - if(item && item->data) - { + if(item && item->data){ timer = item->data; return (int)(timer->id - *((tsk_timer_id_t*)id)); } @@ -273,20 +249,19 @@ static int __tsk_pred_find_timer_by_id(const tsk_list_item_t *item, const void * static void *__tsk_timer_manager_mainthread(void *param) { + int ret; tsk_timer_t *curr; uint64_t epoch; tsk_timer_manager_t *manager = param; TSK_DEBUG_INFO("TIMER MANAGER -- START"); - manager->active = 1; while(TSK_RUNNABLE(manager)->running) { tsk_semaphore_decrement(manager->sem); peek_first: - if(!TSK_RUNNABLE(manager)->running) - { + if(!TSK_RUNNABLE(manager)->running){ break; } @@ -294,39 +269,35 @@ peek_first: curr = TSK_TIMER_GET_FIRST(); tsk_mutex_unlock(manager->mutex); - if(curr && !curr->canceled) - { + if(curr && !curr->canceled) { epoch = tsk_time_epoch(); - if(epoch >= curr->timeout) - { + if(epoch >= curr->timeout){ tsk_timer_t *timer = tsk_object_ref(curr); + //TSK_DEBUG_INFO("Timer raise %llu", timer->id); tsk_mutex_lock(manager->mutex); TSK_RUNNABLE_ENQUEUE_OBJECT(TSK_RUNNABLE(manager), timer); tsk_list_remove_item_by_data(manager->timers, curr); tsk_mutex_unlock(manager->mutex); } - else - { - if(tsk_condwait_timedwait(manager->condwait, (curr->timeout - epoch))) - { + else{ + if((ret = tsk_condwait_timedwait(manager->condwait, (curr->timeout - epoch)))){ + TSK_DEBUG_ERROR("CONWAIT for timer manager failed [%d]", ret); break; } - else - { + else{ goto peek_first; } } } - else if(curr) - { + else if(curr){ tsk_mutex_lock(manager->mutex); + //TSK_DEBUG_INFO("Timer canceled %llu", curr->id); tsk_list_remove_item_by_data(manager->timers, curr); tsk_mutex_unlock(manager->mutex); } } - manager->active = 0; TSK_DEBUG_INFO("TIMER MANAGER -- STOP"); return 0; @@ -354,8 +325,7 @@ peek_first: static void* tsk_timer_manager_create(void * self, va_list * app) { tsk_timer_manager_t *manager = self; - if(manager) - { + if(manager){ manager->timers = TSK_LIST_CREATE(); manager->sem = tsk_semaphore_create(); manager->condwait = tsk_condwait_create(); @@ -368,8 +338,7 @@ static void* tsk_timer_manager_destroy(void * self) { tsk_timer_manager_t *manager = self; - if(manager) - { + if(manager){ tsk_timer_manager_stop(manager); tsk_semaphore_destroy(&manager->sem); @@ -386,7 +355,7 @@ static const tsk_object_def_t tsk_timer_manager_def_s = sizeof(tsk_timer_manager_t), tsk_timer_manager_create, tsk_timer_manager_destroy, - 0, + tsk_null, }; const void * tsk_timer_manager_def_t = &tsk_timer_manager_def_s; @@ -402,8 +371,7 @@ static void* tsk_timer_create(void * self, va_list * app) { static tsk_timer_id_t tsk_unique_timer_id = 1; tsk_timer_t *timer = self; - if(timer) - { + if(timer){ timer->id = tsk_unique_timer_id++; timer->timeout = va_arg(*app, uint64_t); timer->callback = va_arg(*app, tsk_timer_callback); @@ -418,8 +386,7 @@ static void* tsk_timer_destroy(void * self) { tsk_timer_t *timer = self; - if(timer) - { + if(timer){ } return self; @@ -430,8 +397,7 @@ static int tsk_timer_cmp(const void *obj1, const void *obj2) const tsk_timer_t *t1 = obj1; const tsk_timer_t *t2 = obj2; - if(t1 && t2) - { + if(t1 && t2){ return (int)(t1->timeout - t2->timeout); } else if(!t1 && !t2) return 0; diff --git a/trunk/tinySAK/src/tsk_timer.h b/trunk/tinySAK/src/tsk_timer.h index e03e8d42..26250983 100644 --- a/trunk/tinySAK/src/tsk_timer.h +++ b/trunk/tinySAK/src/tsk_timer.h @@ -66,7 +66,6 @@ typedef uint64_t tsk_timer_id_t; typedef int (*tsk_timer_callback)(const void* arg, tsk_timer_id_t timer_id); TINYSAK_API int tsk_timer_manager_start(tsk_timer_manager_handle_t *self); -TINYSAK_API int tsk_timer_manager_isready(tsk_timer_manager_handle_t *self); TINYSAK_API int tsk_timer_manager_stop(tsk_timer_manager_handle_t *self); #if defined(DEBUG) || defined(_DEBUG) TINYSAK_API void tsk_timer_manager_debug(tsk_timer_manager_handle_t *self); diff --git a/trunk/tinySAK/test/test.c b/trunk/tinySAK/test/test.c index 59928ca1..f10ee376 100644 --- a/trunk/tinySAK/test/test.c +++ b/trunk/tinySAK/test/test.c @@ -38,11 +38,12 @@ #define RUN_TEST_HEAP 0 #define RUN_TEST_STRINGS 0 #define RUN_TEST_URL 0 +#define RUN_TEST_THREADS 1 #define RUN_TEST_MUTEX 0 #define RUN_TEST_CONDWAIT 0 #define RUN_TEST_SEMAPHORE 0 /* FIXME: android */ #define RUN_TEST_SAFEOBJECT 0 -#define RUN_TEST_OBJECT 1 +#define RUN_TEST_OBJECT 0 #define RUN_TEST_PARAMS 0 #define RUN_TEST_TIMER 0 #define RUN_TEST_RUNNABLE 0 @@ -69,6 +70,10 @@ #include "test_url.h" #endif +#if RUN_TEST_THREADS || RUN_TEST_ALL +#include "test_threads.h" +#endif + #if RUN_TEST_MUTEX || RUN_TEST_ALL #include "test_mutex.h" #endif @@ -167,6 +172,12 @@ int main() printf("\n\n"); #endif +#if RUN_TEST_THREADS || RUN_TEST_ALL + /* threads */ + test_threads(); + printf("\n\n"); +#endif + #if RUN_TEST_MUTEX || RUN_TEST_ALL /* mutex */ test_mutex(); diff --git a/trunk/tinySAK/test/test.vcproj b/trunk/tinySAK/test/test.vcproj index ee726897..4088f1fb 100644 --- a/trunk/tinySAK/test/test.vcproj +++ b/trunk/tinySAK/test/test.vcproj @@ -427,6 +427,10 @@ RelativePath=".\test_strings.h" > + + diff --git a/trunk/tinySAK/test/test_mutex.h b/trunk/tinySAK/test/test_mutex.h index 2966f6aa..c3634b61 100644 --- a/trunk/tinySAK/test/test_mutex.h +++ b/trunk/tinySAK/test/test_mutex.h @@ -20,13 +20,7 @@ * */ -/**@file tsk_mutex.h - * @brief Pthread mutex. - * - * @author Mamadou Diop - * - * @date Created: Sat Nov 8 16:54:58 2009 mdiop - */ + #ifndef _TEST_MUTEX_H_ #define _TEST_MUTEX_H_ diff --git a/trunk/tinySAK/test/test_object.h b/trunk/tinySAK/test/test_object.h index 3aaf6017..0ff1838d 100644 --- a/trunk/tinySAK/test/test_object.h +++ b/trunk/tinySAK/test/test_object.h @@ -27,7 +27,7 @@ typedef struct person_s TSK_DECLARE_OBJECT; // Mandatory char* name; - person_t* mother; + struct person_s* mother; } person_t; @@ -46,14 +46,14 @@ static void* person_create(tsk_object_t * self, va_list * app) { person_t *person = self; if(person){ - TSK_FREE(person->firstName); - TSK_FREE(person->lastName); + TSK_FREE(person->name); + tsk_object_unref(person->mother); } - return self; + return self; // return } // comparator - static int person_cmp(const tsk_object_t *object1, const tsk_object_t *object1) + static int person_cmp(const tsk_object_t *object1, const tsk_object_t *object2) { const person_t *person1 = object1; const person_t *person2 = object2; @@ -73,29 +73,26 @@ static void* person_create(tsk_object_t * self, va_list * app) } //(Object defnition) - static const tsk_object_def_t person_def_s = + static const tsk_object_def_t person_def_t = { sizeof(person_t), person_create, person_destroy, - person_cmp, - }person_def_t; + person_cmp + }; + + // create a person +#define PERSON_CREATE(name) tsk_object_new(&person_def_t, (const char*)name) /* test object */ void test_object() { - tsk_string_t *a = tsk_object_new(tsk_string_def_t, "first string"); - tsk_string_t *b = tsk_object_new(tsk_string_def_t, "second string"); - - a = tsk_object_ref(a); - a = tsk_object_ref(a); - - a = tsk_object_unref(a); - a = tsk_object_unref(a); - a = tsk_object_unref(a); - - tsk_object_delete(a); - tsk_object_delete(b); + // create a person: will call the constructor + person_t* bob = PERSON_CREATE("bob"); + // create bob's mother + bob->mother = PERSON_CREATE("alice"); + // delete bob: will delete both bob and bob's mother field by calling their destructors + TSK_OBJECT_SAFE_FREE(bob); } #endif /* _TEST_OBJECT_H_ */ diff --git a/trunk/tinySAK/test/test_threads.h b/trunk/tinySAK/test/test_threads.h new file mode 100644 index 00000000..166765b8 --- /dev/null +++ b/trunk/tinySAK/test/test_threads.h @@ -0,0 +1,48 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + + +#ifndef _TEST_THREADS_H_ +#define _TEST_THREADS_H_ + + +void* MyThreadFunction(void *arg) +{ + printf("arg=%d", *((int*)arg)); + return tsk_null; +} + +void test_threads() +{ + void* tid[1] = {tsk_null}; // thread id + int arg = 112; // arg to pass to the function + + printf("test_threads//\n"); + + // create the thread + tsk_thread_create(&tid[0], MyThreadFunction, &arg); + + // join the thread + tsk_thread_join(&(tid[0])); +} + +#endif /* _TEST_THREADS_H_ */