33 #include <sys/socket.h>
34 #include <sys/types.h>
43 int XrdNetCache::keepTime = 0;
51 prevtablesize = psize;
52 nashtablesize = csize;
53 Threshold = (csize * LoadMax) / 100;
55 nashtable = (anItem **)malloc( (
size_t)(csize*
sizeof(anItem *)) );
56 memset((
void *)nashtable, 0, (
size_t)(csize*
sizeof(anItem *)));
70 if (!GenKey(Item, hAddr))
return;
75 if ((hip = Locate(Item)))
76 {
if (hip->hName) free(hip->hName);
77 hip->hName = strdup(hName);
78 hip->expTime = time(0) + keepTime;
85 if (++nashnum > Threshold) Expand();
89 hip =
new anItem(Item, hName, keepTime);
93 kent = hip->aHash % nashtablesize;
94 hip->Next = nashtable[kent];
95 nashtable[kent] = hip;
103 void XrdNetCache::Expand()
105 int newsize, newent, i;
107 anItem **newtab, *nip, *nextnip;
111 newsize = prevtablesize + nashtablesize;
115 memlen = (size_t)(newsize*
sizeof(anItem *));
116 if (!(newtab = (anItem **) malloc(memlen)))
return;
117 memset((
void *)newtab, 0, memlen);
121 for (i = 0; i < nashtablesize; i++)
124 {nextnip = nip->Next;
125 newent = nip->aHash % newsize;
126 nip->Next = newtab[newent];
127 newtab[newent] = nip;
134 free((
void *)nashtable);
136 prevtablesize = nashtablesize;
137 nashtablesize = newsize;
141 Threshold =
static_cast<int>((
static_cast<long long>(newsize)*LoadMax)/100);
150 anItem Item, *nip, *pip = 0;
155 if (!GenKey(Item, hAddr))
return 0;
160 kent = Item.aHash%nashtablesize;
164 nip = nashtable[kent];
165 while(nip && *nip != Item) {pip = nip; nip = nip->Next;}
166 if (!nip) {myMutex.
UnLock();
return 0;}
170 if (nip->expTime > time(0))
171 {
char *hName = strdup(nip->hName);
178 if (pip) pip->Next = nip->Next;
179 else nashtable[kent] = nip->Next;
189 int XrdNetCache::GenKey(XrdNetCache::anItem &Item,
XrdNetAddrInfo *hAddr)
192 {
const sockaddr *sAddr;
193 const sockaddr_in *sAddr4;
194 const sockaddr_in6 *sAddr6;
197 union{
long long llVal;
int intVal[2];} Temp;
198 int family = hAddr->
Family();
202 if (family == AF_INET)
203 {memcpy(Item.aVal, &(aP.sAddr4->sin_addr), 4);
204 Item.aHash = Item.aV4[0];
209 if (family == AF_INET6)
210 {memcpy(Item.aVal, &(aP.sAddr6->sin6_addr), 16);
211 Temp.llVal = Item.aV6[0] ^ Item.aV6[1];
212 Item.aHash = Temp.intVal[0] ^ Temp.intVal[1];
224 XrdNetCache::anItem *XrdNetCache::Locate(XrdNetCache::anItem &Item)
231 kent = Item.aHash%nashtablesize;
232 nip = nashtable[kent];
233 while(nip && *nip != Item) nip = nip->Next;
const sockaddr * SockAddr()
void Add(XrdNetAddrInfo *hAddr, const char *hName)
char * Find(XrdNetAddrInfo *hAddr)
XrdNetCache(int psize=987, int csize=1597)