Imported Upstream version 3.2.2
[debian/gnuradio] / gcell / ibm / sync / ppu_source / libsync.h
1 /* --------------------------------------------------------------  */
2 /* (C)Copyright 2001,2007,                                         */
3 /* International Business Machines Corporation,                    */
4 /* Sony Computer Entertainment, Incorporated,                      */
5 /* Toshiba Corporation,                                            */
6 /*                                                                 */
7 /* All Rights Reserved.                                            */
8 /*                                                                 */
9 /* Redistribution and use in source and binary forms, with or      */
10 /* without modification, are permitted provided that the           */
11 /* following conditions are met:                                   */
12 /*                                                                 */
13 /* - Redistributions of source code must retain the above copyright*/
14 /*   notice, this list of conditions and the following disclaimer. */
15 /*                                                                 */
16 /* - Redistributions in binary form must reproduce the above       */
17 /*   copyright notice, this list of conditions and the following   */
18 /*   disclaimer in the documentation and/or other materials        */
19 /*   provided with the distribution.                               */
20 /*                                                                 */
21 /* - Neither the name of IBM Corporation nor the names of its      */
22 /*   contributors may be used to endorse or promote products       */
23 /*   derived from this software without specific prior written     */
24 /*   permission.                                                   */
25 /*                                                                 */
26 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND          */
27 /* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,     */
28 /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF        */
29 /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE        */
30 /* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR            */
31 /* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,    */
32 /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT    */
33 /* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;    */
34 /* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)        */
35 /* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN       */
36 /* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR    */
37 /* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  */
38 /* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              */
39 /* --------------------------------------------------------------  */
40 /* PROLOG END TAG zYx                                              */
41 #ifndef _PPU_LIBSYNC_H_
42 #define _PPU_LIBSYNC_H_
43
44 #include "sync_utils.h"
45
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
49
50 typedef unsigned long long atomic_ea_t;
51
52 extern void atomic_set(atomic_ea_t v, int val);
53 extern void atomic_add(int a, atomic_ea_t v);
54 extern void atomic_sub(int a, atomic_ea_t v);
55 extern void atomic_inc(atomic_ea_t v);
56 extern void atomic_dec(atomic_ea_t v);
57
58 extern int atomic_read(atomic_ea_t v);
59 extern int atomic_add_return(int a, atomic_ea_t v);
60 extern int atomic_sub_return(int a, atomic_ea_t v);
61 extern int atomic_inc_return(atomic_ea_t v);
62 extern int atomic_dec_return(atomic_ea_t v);
63 extern int atomic_sub_and_test(int a, atomic_ea_t v);
64 extern int atomic_dec_and_test(atomic_ea_t v);
65 extern int atomic_dec_if_positive(atomic_ea_t v);
66
67 typedef unsigned long long mutex_ea_t;
68 void mutex_init(mutex_ea_t lock);
69
70 void mutex_lock(mutex_ea_t lock);
71 int mutex_trylock(mutex_ea_t ea);
72 void mutex_unlock(mutex_ea_t lock);
73
74 typedef struct
75 {
76   int num_threads_signal;       /* the number of threads that are going to be waken up.
77                                  There are 3 values possible for this parameter, 0, 1, 
78                                  or num_threads_waiting*/
79   int num_threads_waiting;      /* the number of threads that are waiting to be awaken */ 
80 } condition_variable_t __attribute__ ((aligned (16)));  
81
82 typedef unsigned long long cond_ea_t;         /* a system memory 64 bit address that points to
83                                  * a valid condition_variable_t */
84
85 typedef union {
86     unsigned long long ull;  
87     unsigned int ui[2];
88 } val64;
89
90
91 void cond_init (cond_ea_t  cond);
92 void cond_signal (cond_ea_t cond);
93 void cond_broadcast (cond_ea_t cond);
94 void cond_wait (cond_ea_t cond, mutex_ea_t  mutex);
95
96
97 #define MAX_THREADS_WAITING   32000 
98
99 typedef unsigned long long completion_ea_t;
100
101 extern void init_completion(completion_ea_t comp);
102 extern void wait_for_completion(completion_ea_t comp);
103 /*
104 extern void wait_for_completion_irq(completion_ea_t comp);
105 extern void wait_for_completion_irqsave(completion_ea_t comp);
106 */
107 extern void complete_all(completion_ea_t comp);
108 extern void complete (completion_ea_t comp);
109
110 #ifdef __cplusplus
111 }
112 #endif
113
114 #endif /* _PPU_LIBSYNC_H_ */