e576bb | 2002-10-11 | Martin Nilsson | |
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
24ddc7 | 1998-03-28 | Henrik Grubbström (Grubba) | | #include "global.h"
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | #include "cyclic.h"
#define CYCLIC_HASH_SIZE 4711
|
c7719a | 2003-11-09 | Martin Nilsson | | static CYCLIC *cyclic_hash[CYCLIC_HASH_SIZE];
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | |
|
d4b720 | 2014-08-25 | Henrik Grubbström (Grubba) | | 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->th);
h *= 33;
return h % CYCLIC_HASH_SIZE;
}
|
545ca8 | 1997-10-07 | Fredrik Hübinette (Hubbe) | | static void low_unlink_cyclic(CYCLIC *c)
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | {
|
c7241b | 2000-08-10 | Henrik Grubbström (Grubba) | | size_t h;
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | CYCLIC **p;
|
d4b720 | 2014-08-25 | Henrik Grubbström (Grubba) | |
h = cyclic_hash_func(c);
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | |
for(p=cyclic_hash+h;*p;p=&(p[0]->next))
{
if(c == *p)
{
*p=c->next;
|
3b6bff | 2002-12-01 | Martin Stjernholm | | #ifdef CYCLIC_DEBUG
fprintf (stderr, "%s: END_CYCLIC a=%p b=%p: no cycle\n", c->id, c->a, c->b);
#endif
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | return;
}
}
|
d4b720 | 2014-08-25 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
Pike_fatal("Unlink cyclic on lost cyclic struct (%s).\n", c->id);
#else
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Unlink cyclic on lost cyclic struct.\n");
|
d4b720 | 2014-08-25 | Henrik Grubbström (Grubba) | | #endif
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | }
|
882255 | 2010-06-01 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void unlink_cyclic(CYCLIC *c)
|
545ca8 | 1997-10-07 | Fredrik Hübinette (Hubbe) | | {
UNSET_ONERROR(c->onerr);
low_unlink_cyclic(c);
}
|
882255 | 2010-06-01 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void *begin_cyclic(CYCLIC *c,
char *id,
void *th,
void *a,
void *b)
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | {
|
c7241b | 2000-08-10 | Henrik Grubbström (Grubba) | | size_t h;
|
d4b720 | 2014-08-25 | Henrik Grubbström (Grubba) | | void *ret = 0;
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | CYCLIC *p;
|
d4b720 | 2014-08-25 | Henrik Grubbström (Grubba) | | c->ret = (void *)(ptrdiff_t)1;
c->a = a;
c->b = b;
c->id = id;
c->th = th;
h = cyclic_hash_func(c);
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | |
for(p=cyclic_hash[h];p;p=p->next)
|
14bb59 | 2000-05-06 | Fredrik Hübinette (Hubbe) | | {
|
8d6f5c | 2014-08-26 | Henrik Grubbström (Grubba) | | if(a == p->a && b==p->b && id==p->id && th==p->th)
|
14bb59 | 2000-05-06 | Fredrik Hübinette (Hubbe) | | {
|
3b6bff | 2002-12-01 | Martin Stjernholm | | #ifdef CYCLIC_DEBUG
fprintf (stderr, "%s: BEGIN_CYCLIC a=%p b=%p: found cycle\n", id, a, b);
#endif
|
8d6f5c | 2014-08-26 | Henrik Grubbström (Grubba) | | c->ret = ret = p->ret;
|
14bb59 | 2000-05-06 | Fredrik Hübinette (Hubbe) | | break;
}
}
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | |
|
d4b720 | 2014-08-25 | Henrik Grubbström (Grubba) | | c->next = cyclic_hash[h];
cyclic_hash[h] = c;
|
545ca8 | 1997-10-07 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(c->onerr, low_unlink_cyclic, c);
|
3b6bff | 2002-12-01 | Martin Stjernholm | | #ifdef CYCLIC_DEBUG
if (!ret) fprintf (stderr, "%s: BEGIN_CYCLIC a=%p b=%p: no cycle\n", id, a, b);
#endif
|
14bb59 | 2000-05-06 | Fredrik Hübinette (Hubbe) | | return ret;
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | }
|