GNU Radio 3.3.0 C++ API
libsync.h
Go to the documentation of this file.
00001 /* --------------------------------------------------------------  */
00002 /* (C)Copyright 2001,2007,                                         */
00003 /* International Business Machines Corporation,                    */
00004 /* Sony Computer Entertainment, Incorporated,                      */
00005 /* Toshiba Corporation,                                            */
00006 /*                                                                 */
00007 /* All Rights Reserved.                                            */
00008 /*                                                                 */
00009 /* Redistribution and use in source and binary forms, with or      */
00010 /* without modification, are permitted provided that the           */
00011 /* following conditions are met:                                   */
00012 /*                                                                 */
00013 /* - Redistributions of source code must retain the above copyright*/
00014 /*   notice, this list of conditions and the following disclaimer. */
00015 /*                                                                 */
00016 /* - Redistributions in binary form must reproduce the above       */
00017 /*   copyright notice, this list of conditions and the following   */
00018 /*   disclaimer in the documentation and/or other materials        */
00019 /*   provided with the distribution.                               */
00020 /*                                                                 */
00021 /* - Neither the name of IBM Corporation nor the names of its      */
00022 /*   contributors may be used to endorse or promote products       */
00023 /*   derived from this software without specific prior written     */
00024 /*   permission.                                                   */
00025 /*                                                                 */
00026 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND          */
00027 /* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,     */
00028 /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF        */
00029 /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE        */
00030 /* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR            */
00031 /* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,    */
00032 /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT    */
00033 /* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;    */
00034 /* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)        */
00035 /* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN       */
00036 /* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR    */
00037 /* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  */
00038 /* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              */
00039 /* --------------------------------------------------------------  */
00040 /* PROLOG END TAG zYx                                              */
00041 #ifndef _PPU_LIBSYNC_H_
00042 #define _PPU_LIBSYNC_H_
00043 
00044 #include "sync_utils.h"
00045 
00046 #ifdef __cplusplus
00047 extern "C" {
00048 #endif
00049 
00050 typedef unsigned long long atomic_ea_t;
00051 
00052 extern void atomic_set(atomic_ea_t v, int val);
00053 extern void atomic_add(int a, atomic_ea_t v);
00054 extern void atomic_sub(int a, atomic_ea_t v);
00055 extern void atomic_inc(atomic_ea_t v);
00056 extern void atomic_dec(atomic_ea_t v);
00057 
00058 extern int atomic_read(atomic_ea_t v);
00059 extern int atomic_add_return(int a, atomic_ea_t v);
00060 extern int atomic_sub_return(int a, atomic_ea_t v);
00061 extern int atomic_inc_return(atomic_ea_t v);
00062 extern int atomic_dec_return(atomic_ea_t v);
00063 extern int atomic_sub_and_test(int a, atomic_ea_t v);
00064 extern int atomic_dec_and_test(atomic_ea_t v);
00065 extern int atomic_dec_if_positive(atomic_ea_t v);
00066 
00067 typedef unsigned long long mutex_ea_t;
00068 void mutex_init(mutex_ea_t lock);
00069 
00070 void mutex_lock(mutex_ea_t lock);
00071 int mutex_trylock(mutex_ea_t ea);
00072 void mutex_unlock(mutex_ea_t lock);
00073 
00074 typedef struct
00075 {
00076   int num_threads_signal;       /* the number of threads that are going to be waken up.
00077                                  There are 3 values possible for this parameter, 0, 1, 
00078                                  or num_threads_waiting*/
00079   int num_threads_waiting;      /* the number of threads that are waiting to be awaken */ 
00080 } condition_variable_t __attribute__ ((aligned (16)));  
00081 
00082 typedef unsigned long long cond_ea_t;         /* a system memory 64 bit address that points to
00083                                  * a valid condition_variable_t */
00084 
00085 typedef union {
00086     unsigned long long ull;  
00087     unsigned int ui[2];
00088 } val64;
00089 
00090 
00091 void cond_init (cond_ea_t  cond);
00092 void cond_signal (cond_ea_t cond);
00093 void cond_broadcast (cond_ea_t cond);
00094 void cond_wait (cond_ea_t cond, mutex_ea_t  mutex);
00095 
00096 
00097 #define MAX_THREADS_WAITING   32000 
00098 
00099 typedef unsigned long long completion_ea_t;
00100 
00101 extern void init_completion(completion_ea_t comp);
00102 extern void wait_for_completion(completion_ea_t comp);
00103 /*
00104 extern void wait_for_completion_irq(completion_ea_t comp);
00105 extern void wait_for_completion_irqsave(completion_ea_t comp);
00106 */
00107 extern void complete_all(completion_ea_t comp);
00108 extern void complete (completion_ea_t comp);
00109 
00110 #ifdef __cplusplus
00111 }
00112 #endif
00113 
00114 #endif /* _PPU_LIBSYNC_H_ */