| 
									
										
										
										
											2010-04-03 05:58:14 +01:00
										 |  |  | /************************************************************************
 | 
					
						
							|  |  |  | **                                                                     ** | 
					
						
							|  |  |  | **                   The YapTab/YapOr/OPTYap systems                   ** | 
					
						
							|  |  |  | **                                                                     ** | 
					
						
							|  |  |  | ** YapTab extends the Yap Prolog engine to support sequential tabling  ** | 
					
						
							|  |  |  | ** YapOr extends the Yap Prolog engine to support or-parallelism       ** | 
					
						
							|  |  |  | ** OPTYap extends the Yap Prolog engine to support or-parallel tabling ** | 
					
						
							|  |  |  | **                                                                     ** | 
					
						
							|  |  |  | **                                                                     ** | 
					
						
							|  |  |  | **      Yap Prolog was developed at University of Porto, Portugal      ** | 
					
						
							|  |  |  | **                                                                     ** | 
					
						
							|  |  |  | ************************************************************************/ | 
					
						
							| 
									
										
										
										
											2005-05-31 08:24:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-03 05:58:14 +01:00
										 |  |  | /************************************************************************
 | 
					
						
							|  |  |  | **                         Atomic locks for MIPS                       ** | 
					
						
							|  |  |  | ************************************************************************/ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* This code is stolen from the Linux kernel */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { unsigned long a[100]; } __dummy_lock_t; | 
					
						
							|  |  |  | #define __dummy_lock(lock) (*(__dummy_lock_t *)(lock))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define load_linked(addr)                                       \
 | 
					
						
							|  |  |  | ({                                                              \ | 
					
						
							|  |  |  | 	unsigned int __res;                                     \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  | 	__asm__ __volatile__(                                   \ | 
					
						
							|  |  |  | 	"ll\t%0,(%1)"                                           \ | 
					
						
							|  |  |  | 	: "=r" (__res)                                          \ | 
					
						
							|  |  |  | 	: "r" ((unsigned long) (addr)));                        \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  | 	__res;                                                  \ | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define store_conditional(addr,value)                           \
 | 
					
						
							|  |  |  | ({                                                              \ | 
					
						
							|  |  |  | 	int	__res;                                          \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  | 	__asm__ __volatile__(                                   \ | 
					
						
							|  |  |  | 	"sc\t%0,(%2)"                                           \ | 
					
						
							|  |  |  | 	: "=r" (__res)                                          \ | 
					
						
							|  |  |  | 	: "0" (value), "r" (addr));                             \ | 
					
						
							|  |  |  |                                                                 \ | 
					
						
							|  |  |  | 	__res;                                                  \ | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define INIT_LOCK(LOCK_VAR)    ((LOCK_VAR) = 0)
 | 
					
						
							|  |  |  | #define TRY_LOCK(LOCK_PTR)  (!test_and_set_bit(0,(__dumy_lock_t *)(LOCK_PTR)))
 | 
					
						
							|  |  |  | #define LOCK(LOCK_VAR)      _spin_lock((__dummy_lock_t *)(&(LOCK_VAR)))
 | 
					
						
							|  |  |  | #define IS_LOCKED(LOCK_VAR)    ((LOCK_VAR) != 0)
 | 
					
						
							|  |  |  | #define IS_UNLOCKED(LOCK_VAR)  ((LOCK_VAR) == 0)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* We need to support sync on MIPS */ | 
					
						
							|  |  |  | #define UNLOCK(LOCK_VAR)     spin_unlock((__dummy_lock_t *)(&(LOCK_VAR)))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  | 	volatile unsigned int lock; | 
					
						
							|  |  |  | } rwlock_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define READ_LOCK(X) _read_lock(&(X))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define READ_UNLOCK(X) _read_unlock(&(X))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define WRITE_LOCK(X)  _write_lock(&(X))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define WRITE_UNLOCK(X)  _write_unlock(&(X))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define INIT_RWLOCK(RW)   (RW) = RW_LOCK_UNLOCKED
 |