93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /************************************************************************
 | |
| **                                                                     **
 | |
| **                   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      **
 | |
| **                                                                     **
 | |
| ************************************************************************/
 | |
| 
 | |
| #ifdef MULTI_ASSIGNMENT_VARIABLES
 | |
| /* 
 | |
|    Set of routines to allow restoring updatable variables when we go *up*
 | |
|    in the tree. Required by copying, SBA, and tabling. Not required by ACOW.
 | |
| */
 | |
| 
 | |
| #ifndef OPT_MAVAR_STATIC
 | |
| #define OPT_MAVAR_STATIC inline static
 | |
| #endif /* !OPT_MAVAR_STATIC */
 | |
| 
 | |
| OPT_MAVAR_STATIC unsigned int Yap_MAVAR_HASH(CELL *addr USES_REGS);
 | |
| OPT_MAVAR_STATIC struct ma_h_entry * Yap_ALLOC_NEW_MASPACE(USES_REGS1);
 | |
| OPT_MAVAR_STATIC int Yap_lookup_ma_var(CELL *addr USES_REGS);
 | |
| OPT_MAVAR_STATIC UInt Yap_NEW_MAHASH(ma_h_inner_struct *top USES_REGS);
 | |
| 
 | |
| OPT_MAVAR_STATIC unsigned int
 | |
| Yap_MAVAR_HASH(CELL *addr USES_REGS) {
 | |
| #if SIZEOF_INT_P==8
 | |
|   return((((unsigned int)((CELL)(addr)))>>3)%MAVARS_HASH_SIZE);
 | |
| #else
 | |
|   return((((unsigned int)((CELL)(addr)))>>2)%MAVARS_HASH_SIZE); 
 | |
| #endif
 | |
| }
 | |
| 
 | |
| OPT_MAVAR_STATIC struct ma_h_entry *
 | |
| Yap_ALLOC_NEW_MASPACE(USES_REGS1)
 | |
| {
 | |
|   ma_h_inner_struct *newS = LOCAL_ma_h_top;
 | |
|   LOCAL_ma_h_top++;
 | |
|   return newS;
 | |
| }
 | |
| 
 | |
| OPT_MAVAR_STATIC int
 | |
| Yap_lookup_ma_var(CELL *addr USES_REGS) {
 | |
|   unsigned int i = Yap_MAVAR_HASH(addr PASS_REGS);
 | |
|   struct ma_h_entry *nptr, *optr;
 | |
| 
 | |
|   if (LOCAL_ma_hash_table[i].timestmp != LOCAL_ma_timestamp) {
 | |
|     LOCAL_ma_hash_table[i].timestmp = LOCAL_ma_timestamp;
 | |
|     LOCAL_ma_hash_table[i].val.addr = addr;
 | |
|     LOCAL_ma_hash_table[i].val.next = NULL;
 | |
|     return FALSE;
 | |
|   }
 | |
|   if (LOCAL_ma_hash_table[i].val.addr == addr) 
 | |
|     return TRUE;
 | |
|   optr = &(LOCAL_ma_hash_table[i].val);
 | |
|   nptr = LOCAL_ma_hash_table[i].val.next;
 | |
|   while (nptr != NULL) {
 | |
|     if (nptr->addr == addr) {
 | |
|       return TRUE;
 | |
|     }
 | |
|     optr = nptr;
 | |
|     nptr = nptr->next;
 | |
|   }
 | |
|   nptr = Yap_ALLOC_NEW_MASPACE(PASS_REGS1);
 | |
|   nptr->addr = addr;
 | |
|   nptr->next = optr;
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| OPT_MAVAR_STATIC UInt
 | |
| Yap_NEW_MAHASH(ma_h_inner_struct *top USES_REGS) {
 | |
|   UInt time = ++LOCAL_ma_timestamp;
 | |
|   if (time == 0) {
 | |
|     unsigned int i;
 | |
|     /* damn, we overflowed */
 | |
|     for (i = 0; i < MAVARS_HASH_SIZE; i++)
 | |
|       LOCAL_ma_hash_table[i].timestmp = 0;
 | |
|     time = ++LOCAL_ma_timestamp;
 | |
|   }
 | |
|   LOCAL_ma_h_top = top;
 | |
|   return time;
 | |
| }
 | |
| #else
 | |
| #define Yap_MAVAR_HASH(addr)
 | |
| #define Yap_ALLOC_NEW_MASPACE()
 | |
| #define Yap_lookup_ma_var(addr)
 | |
| #define Yap_NEW_MAHASH(top)
 | |
| #endif /* MULTI_ASSIGNMENT_VARIABLES */
 |