YAP 7.1.0
opt.mavar.h
1/************************************************************************
2** **
3** The YapTab/YapOr/OPTYap systems **
4** **
5** YapTab extends the Yap Prolog engine to support sequential tabling **
6** YapOr extends the Yap Prolog engine to support or-parallelism **
7** OPTYap extends the Yap Prolog engine to support or-parallel tabling **
8** **
9** **
10** Yap Prolog was developed at University of Porto, Portugal **
11** **
12************************************************************************/
13
14#ifdef MULTI_ASSIGNMENT_VARIABLES
15/*
16 Set of routines to allow restoring updatable variables when we go *up*
17 in the tree. Required by copying, SBA, and tabling. Not required by ACOW.
18*/
19
20#ifndef OPT_MAVAR_STATIC
21#define OPT_MAVAR_STATIC inline static
22#endif /* !OPT_MAVAR_STATIC */
23
24OPT_MAVAR_STATIC unsigned int Yap_MAVAR_HASH(CELL *addr USES_REGS);
25OPT_MAVAR_STATIC struct ma_h_entry * Yap_ALLOC_NEW_MASPACE(USES_REGS1);
26OPT_MAVAR_STATIC int Yap_lookup_ma_var(CELL *addr USES_REGS);
27OPT_MAVAR_STATIC UInt Yap_NEW_MAHASH(ma_h_inner_struct *top USES_REGS);
28
29OPT_MAVAR_STATIC unsigned int
30Yap_MAVAR_HASH(CELL *addr USES_REGS) {
31#if SIZEOF_INT_P==8
32 return((((unsigned int)((CELL)(addr)))>>3)%MAVARS_HASH_SIZE);
33#else
34 return((((unsigned int)((CELL)(addr)))>>2)%MAVARS_HASH_SIZE);
35#endif
36}
37
38OPT_MAVAR_STATIC struct ma_h_entry *
39Yap_ALLOC_NEW_MASPACE(USES_REGS1)
40{
41 ma_h_inner_struct *newS = LOCAL_ma_h_top;
42 LOCAL_ma_h_top++;
43 return newS;
44}
45
46OPT_MAVAR_STATIC int
47Yap_lookup_ma_var(CELL *addr USES_REGS) {
48 unsigned int i = Yap_MAVAR_HASH(addr PASS_REGS);
49 struct ma_h_entry *nptr, *optr;
50
51 if (LOCAL_ma_hash_table[i].timestmp != LOCAL_ma_timestamp) {
52 LOCAL_ma_hash_table[i].timestmp = LOCAL_ma_timestamp;
53 LOCAL_ma_hash_table[i].val.addr = addr;
54 LOCAL_ma_hash_table[i].val.next = NULL;
55 return FALSE;
56 }
57 if (LOCAL_ma_hash_table[i].val.addr == addr)
58 return TRUE;
59 optr = &(LOCAL_ma_hash_table[i].val);
60 nptr = LOCAL_ma_hash_table[i].val.next;
61 while (nptr != NULL) {
62 if (nptr->addr == addr) {
63 return TRUE;
64 }
65 optr = nptr;
66 nptr = nptr->next;
67 }
68 nptr = Yap_ALLOC_NEW_MASPACE(PASS_REGS1);
69 nptr->addr = addr;
70 nptr->next = optr;
71 return FALSE;
72}
73
74OPT_MAVAR_STATIC UInt
75Yap_NEW_MAHASH(ma_h_inner_struct *top USES_REGS) {
76 UInt time = ++LOCAL_ma_timestamp;
77 if (time == 0) {
78 unsigned int i;
79 /* damn, we overflowed */
80 for (i = 0; i < MAVARS_HASH_SIZE; i++)
81 LOCAL_ma_hash_table[i].timestmp = 0;
82 time = ++LOCAL_ma_timestamp;
83 }
84 LOCAL_ma_h_top = top;
85 return time;
86}
87#else
88#define Yap_MAVAR_HASH(addr)
89#define Yap_ALLOC_NEW_MASPACE()
90#define Yap_lookup_ma_var(addr)
91#define Yap_NEW_MAHASH(top)
92#endif /* MULTI_ASSIGNMENT_VARIABLES */