Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Usage of xbt_new0 instead calloc
[simgrid.git] / examples / xbt / sem_basic.c
1 #include <stdio.h>\r
2 #include <stdlib.h>\r
3 \r
4 \r
5 #include "xbt/xbt_os_thread.h"\r
6 #include "xbt.h"\r
7 #include "xbt/log.h"\r
8 XBT_LOG_NEW_DEFAULT_CATEGORY(sem_basic,"Messages specific for this sem example");\r
9 \r
10 \r
11 \r
12 #define THREAD_THREADS_MAX                      ((unsigned int)10)\r
13 \r
14 /*\r
15  * the thread funtion.\r
16  */\r
17 void*\r
18 thread_routine(void* param);\r
19 \r
20 /* an entry of the table of threads */\r
21 typedef struct s_thread_entry\r
22 {\r
23         xbt_os_thread_t thread;\r
24         unsigned int thread_index;      /* the index of the thread      */\r
25 }s_thread_entry_t,* thread_entry_t;\r
26 \r
27 \r
28 static xbt_os_sem_t \r
29 sem = NULL;\r
30 \r
31 static\r
32 int value = 0;\r
33 int\r
34 main(int argc, char* argv[])\r
35 {\r
36         s_thread_entry_t threads_table[THREAD_THREADS_MAX] = {0};       \r
37         unsigned int i,j;\r
38         int exit_code = 0;\r
39         \r
40         xbt_init(&argc,argv);\r
41         \r
42         sem = xbt_os_sem_init(1);\r
43         \r
44         i = 0;\r
45         \r
46         while(i < THREAD_THREADS_MAX)\r
47         {\r
48                 threads_table[i].thread_index = i;\r
49 \r
50                 if(NULL == (threads_table[i].thread = xbt_os_thread_create("thread",thread_routine,&(threads_table[i].thread_index))))\r
51                         break;\r
52         \r
53                 i++;\r
54         }\r
55         \r
56         /* close the thread handles */\r
57         for(j = 0; j < THREAD_THREADS_MAX; j++)\r
58                 xbt_os_thread_join(threads_table[j].thread,NULL);\r
59         \r
60         xbt_os_sem_destroy(sem);\r
61         \r
62         INFO1("sem_basic terminated with exit code %d (success)",EXIT_SUCCESS);\r
63 \r
64         xbt_exit();\r
65         \r
66         return EXIT_SUCCESS;\r
67                 \r
68 }\r
69 \r
70 void*\r
71 thread_routine(void* param)\r
72 {\r
73         int thread_index = *((int*)param);\r
74         int exit_code = 0;\r
75         \r
76         xbt_os_sem_acquire(sem);\r
77         INFO1("Hello i'm the thread %d",thread_index);\r
78         value++;\r
79         INFO1("The new value of the global variable is %d, bye",value);\r
80         xbt_os_sem_release(sem);\r
81         \r
82         xbt_os_thread_exit(&exit_code);\r
83 \r
84         return (void*)(NULL);\r
85 }\r
86 \r
87 \r
88 \r