Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Same thing. But working, this time.
[simgrid.git] / src / xbt / xbt_os_synchro.c
1 /* xbt_synchro -- Synchronization virtualized depending on whether we are   */
2 /*                in simulation or real life (act on simulated processes)   */
3
4 /* This is the simulation implementation, using simix.                      */
5
6 /* Copyright (c) 2007-2016. The SimGrid Team.
7  * All rights reserved.                                                     */
8
9 /* This program is free software; you can redistribute it and/or modify it
10  * under the terms of the license (GNU LGPL) which comes with this package. */
11
12 #include "xbt/ex.h"
13 #include "xbt/synchro_core.h"
14
15 #include "simgrid/simix.h"        /* used implementation */
16 #include "../simix/smx_private.h" /* FIXME */
17
18 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync, xbt, "Synchronization mechanism");
19
20 /****** mutex related functions ******/
21 struct s_xbt_mutex_ {
22   s_smx_mutex_t mutex;
23 };
24
25 xbt_mutex_t xbt_mutex_init(void)
26 {
27   return (xbt_mutex_t) simcall_mutex_init();
28 }
29
30 void xbt_mutex_acquire(xbt_mutex_t mutex)
31 {
32   simcall_mutex_lock((smx_mutex_t) mutex);
33 }
34
35 int xbt_mutex_try_acquire(xbt_mutex_t mutex)
36 {
37   return simcall_mutex_trylock((smx_mutex_t) mutex);
38 }
39
40 void xbt_mutex_release(xbt_mutex_t mutex)
41 {
42   simcall_mutex_unlock((smx_mutex_t) mutex);
43 }
44
45 void xbt_mutex_destroy(xbt_mutex_t mutex)
46 {
47   SIMIX_mutex_destroy((smx_mutex_t) mutex);
48 }
49
50 /***** condition related functions *****/
51 struct s_xbt_cond_ {
52   s_smx_cond_t cond;
53 };
54
55 xbt_cond_t xbt_cond_init(void)
56 {
57   return (xbt_cond_t) simcall_cond_init();
58 }
59
60 void xbt_cond_wait(xbt_cond_t cond, xbt_mutex_t mutex)
61 {
62   simcall_cond_wait((smx_cond_t) cond, (smx_mutex_t) mutex);
63 }
64
65 void xbt_cond_timedwait(xbt_cond_t cond, xbt_mutex_t mutex, double delay)
66 {
67   simcall_cond_wait_timeout((smx_cond_t) cond, (smx_mutex_t) mutex, delay);
68 }
69
70 void xbt_cond_signal(xbt_cond_t cond)
71 {
72   simcall_cond_signal((smx_cond_t) cond);
73 }
74
75 void xbt_cond_broadcast(xbt_cond_t cond)
76 {
77   simcall_cond_broadcast((smx_cond_t) cond);
78 }
79
80 void xbt_cond_destroy(xbt_cond_t cond)
81 {
82   SIMIX_cond_destroy((smx_cond_t) cond);
83 }
84
85 /***** barrier related functions *****/
86 typedef struct s_xbt_bar_ {
87   xbt_mutex_t mutex;
88   xbt_cond_t cond;
89   unsigned int arrived_processes;
90   unsigned int expected_processes;
91 } s_xbt_bar_;
92
93 xbt_bar_t xbt_barrier_init(unsigned int count)
94 {
95   xbt_bar_t bar = xbt_new0(s_xbt_bar_, 1);
96   bar->expected_processes = count;
97   bar->arrived_processes = 0;
98   bar->mutex = xbt_mutex_init();
99   bar->cond = xbt_cond_init();
100   return bar;
101 }
102
103 int xbt_barrier_wait(xbt_bar_t bar)
104 {
105    int ret=0;
106    xbt_mutex_acquire(bar->mutex);
107    if (++bar->arrived_processes == bar->expected_processes) {
108      xbt_cond_broadcast(bar->cond);
109      xbt_mutex_release(bar->mutex);
110      ret=XBT_BARRIER_SERIAL_PROCESS;
111      bar->arrived_processes = 0;
112    } else {
113      xbt_cond_wait(bar->cond, bar->mutex);
114      xbt_mutex_release(bar->mutex);
115    }
116    return ret;
117 }
118
119 void xbt_barrier_destroy(xbt_bar_t bar)
120 {
121    xbt_mutex_destroy(bar->mutex);
122    xbt_cond_destroy(bar->cond);
123    xbt_free(bar);
124 }