pike.git
/
src
/
cyclic.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/cyclic.c:14:
static size_t cyclic_hash_func(CYCLIC *c) { size_t h; h = PTR_TO_INT(c->id); h *= 33; h ^= PTR_TO_INT(c->a); h *= 33; h ^= PTR_TO_INT(c->b); h *= 33;
+
h ^= PTR_TO_INT(c->d);
+
h *= 33;
h ^= PTR_TO_INT(c->th); #if SIZEOF_CHAR_P > 4 h ^= h>>8; #endif /* Fold h. This is to retain as many bits of h as possible. * * NB: The "magic" constant below has a 1 bit every 10 bits * starting at the least significant, and is == 1 when * shifted right 20 bits. Note also that 32 - 20 == 12
pike.git/src/cyclic.c:71:
PMOD_EXPORT void unlink_cyclic(CYCLIC *c) { UNSET_ONERROR(c->onerr); low_unlink_cyclic(c); } void *low_begin_cyclic(CYCLIC *c, char *id, void *th, void *a,
-
void *b)
+
void *b
,
+
void *d
)
{ size_t h; void *ret = 0; CYCLIC *p; c->ret = (void *)(ptrdiff_t)1; c->a = a; c->b = b;
-
+
c->d = d;
c->id = id; c->th = th; h = cyclic_hash_func(c); for(p=cyclic_hash[h];p;p=p->next) {
-
if(a == p->a && b==p->b && id==p->id && th==p->th)
+
if(a == p->a && b==p->b && id==p->id && th==p->th
&& d==p->d
)
{ #ifdef CYCLIC_DEBUG
-
fprintf (stderr, "%s: BEGIN_CYCLIC a=%p b=%p: found cycle\n", id, a, b);
+
fprintf (stderr, "%s: BEGIN_CYCLIC a=%p b=%p
d=%p
: found cycle\n",
+
id, a, b
, d
);
#endif c->ret = ret = p->ret; break; } } c->next = cyclic_hash[h]; cyclic_hash[h] = c; #ifdef CYCLIC_DEBUG
-
if (!ret) fprintf (stderr, "%s: BEGIN_CYCLIC a=%p b=%p: no cycle\n", id, a, b);
+
if (!ret) fprintf (stderr, "%s: BEGIN_CYCLIC a=%p b=%p
d=%p
: no cycle\n",
+
id, a, b
, d
);
#endif return ret; } PMOD_EXPORT void *begin_cyclic(CYCLIC *c, char *id, void *th, void *a,
-
void *b)
+
void *b
,
+
void *d
)
{
-
void *ret = low_begin_cyclic(c, id, th, a, b);
+
void *ret = low_begin_cyclic(c, id, th, a, b
, d
);
SET_ONERROR(c->onerr, low_unlink_cyclic, c); return ret; }