XRootD
XrdFfsDent.cc File Reference
+ Include dependency graph for XrdFfsDent.cc:

Go to the source code of this file.

Classes

struct  XrdFfsDentcache
 

Macros

#define XrdFfsDent_NDENTCACHES   20
 

Functions

void XrdFfsDent_cache_destroy ()
 
int XrdFfsDent_cache_fill (char *dname, char ***dnarray, int nents)
 
void XrdFfsDent_cache_init ()
 
int XrdFfsDent_cache_search (char *dname, char *dentname)
 
int XrdFfsDent_cstr_cmp (const void *a, const void *b)
 
int XrdFfsDent_dentcache_expired (struct XrdFfsDentcache *cache)
 
void XrdFfsDent_dentcache_fill (struct XrdFfsDentcache *cache, char *dname, char ***dnarray, int nents)
 
void XrdFfsDent_dentcache_free (struct XrdFfsDentcache *cache)
 
int XrdFfsDent_dentcache_invalid (struct XrdFfsDentcache *cache)
 
int XrdFfsDent_dentcache_search (struct XrdFfsDentcache *cache, char *dname, char *dentname)
 
void XrdFfsDent_names_add (struct XrdFfsDentnames **p, char *name)
 
void XrdFfsDent_names_del (struct XrdFfsDentnames **p)
 
int XrdFfsDent_names_extract (struct XrdFfsDentnames **p, char ***dnarray)
 
void XrdFfsDent_names_join (struct XrdFfsDentnames **p, struct XrdFfsDentnames **n)
 

Variables

struct XrdFfsDentcache XrdFfsDentCaches [XrdFfsDent_NDENTCACHES]
 
pthread_mutex_t XrdFfsDentCaches_mutex = PTHREAD_MUTEX_INITIALIZER
 

Class Documentation

◆ XrdFfsDentcache

struct XrdFfsDentcache

Definition at line 132 of file XrdFfsDent.cc.

+ Collaboration diagram for XrdFfsDentcache:
Class Members
char * dirname
char ** dnarray
time_t life
unsigned int nents
time_t t0

Macro Definition Documentation

◆ XrdFfsDent_NDENTCACHES

#define XrdFfsDent_NDENTCACHES   20

Definition at line 203 of file XrdFfsDent.cc.

Function Documentation

◆ XrdFfsDent_cache_destroy()

void XrdFfsDent_cache_destroy ( )

Definition at line 261 of file XrdFfsDent.cc.

262 {
263  int i;
264  for (i = 0; i < XrdFfsDent_NDENTCACHES; i++)
266 }
#define XrdFfsDent_NDENTCACHES
Definition: XrdFfsDent.cc:203
struct XrdFfsDentcache XrdFfsDentCaches[XrdFfsDent_NDENTCACHES]
Definition: XrdFfsDent.cc:204
void XrdFfsDent_dentcache_free(struct XrdFfsDentcache *cache)
Definition: XrdFfsDent.cc:154

References XrdFfsDent_dentcache_free(), XrdFfsDent_NDENTCACHES, and XrdFfsDentCaches.

+ Here is the call graph for this function:

◆ XrdFfsDent_cache_fill()

int XrdFfsDent_cache_fill ( char *  dname,
char ***  dnarray,
int  nents 
)

Definition at line 219 of file XrdFfsDent.cc.

220 {
221  int i;
222  pthread_mutex_lock(&XrdFfsDentCaches_mutex);
223  for (i = 0; i < XrdFfsDent_NDENTCACHES; i++)
224  {
225  if (XrdFfsDent_dentcache_search(&XrdFfsDentCaches[i], dname, NULL) != 0)
226  {
228  XrdFfsDent_dentcache_fill(&XrdFfsDentCaches[i], dname, dnarray, nents);
229  pthread_mutex_unlock(&XrdFfsDentCaches_mutex);
230  return 1;
231  }
232  }
233  for (i = 0; i < XrdFfsDent_NDENTCACHES; i++)
234  {
236  {
238  XrdFfsDent_dentcache_fill(&XrdFfsDentCaches[i], dname, dnarray, nents);
239  pthread_mutex_unlock(&XrdFfsDentCaches_mutex);
240  return 1;
241  }
242  }
243  pthread_mutex_unlock(&XrdFfsDentCaches_mutex);
244  return 0;
245 }
int XrdFfsDent_dentcache_invalid(struct XrdFfsDentcache *cache)
Definition: XrdFfsDent.cc:176
pthread_mutex_t XrdFfsDentCaches_mutex
Definition: XrdFfsDent.cc:205
int XrdFfsDent_dentcache_search(struct XrdFfsDentcache *cache, char *dname, char *dentname)
Definition: XrdFfsDent.cc:183
int XrdFfsDent_dentcache_expired(struct XrdFfsDentcache *cache)
Definition: XrdFfsDent.cc:169
void XrdFfsDent_dentcache_fill(struct XrdFfsDentcache *cache, char *dname, char ***dnarray, int nents)
Definition: XrdFfsDent.cc:140

References XrdFfsDentcache::dnarray, XrdFfsDentcache::nents, XrdFfsDent_dentcache_expired(), XrdFfsDent_dentcache_fill(), XrdFfsDent_dentcache_free(), XrdFfsDent_dentcache_invalid(), XrdFfsDent_dentcache_search(), XrdFfsDent_NDENTCACHES, XrdFfsDentCaches, and XrdFfsDentCaches_mutex.

+ Here is the call graph for this function:

◆ XrdFfsDent_cache_init()

void XrdFfsDent_cache_init ( )

Definition at line 207 of file XrdFfsDent.cc.

208 {
209  int i;
210  for (i = 0; i < XrdFfsDent_NDENTCACHES; i++)
211  {
212  XrdFfsDentCaches[i].t0 = 0;
213  XrdFfsDentCaches[i].nents = 0;
214  XrdFfsDentCaches[i].dirname = strdup("");
215  XrdFfsDentCaches[i].dnarray = NULL;
216  }
217 }
unsigned int nents
Definition: XrdFfsDent.cc:135

References XrdFfsDentcache::dirname, XrdFfsDentcache::dnarray, XrdFfsDentcache::nents, XrdFfsDentcache::t0, XrdFfsDent_NDENTCACHES, and XrdFfsDentCaches.

Referenced by XrdFfsMisc_xrd_init().

+ Here is the caller graph for this function:

◆ XrdFfsDent_cache_search()

int XrdFfsDent_cache_search ( char *  dname,
char *  dentname 
)

Definition at line 247 of file XrdFfsDent.cc.

248 {
249  int i, rval = 0;
250  pthread_mutex_lock(&XrdFfsDentCaches_mutex);
251  for (i = 0; i < XrdFfsDent_NDENTCACHES; i++)
252  if (XrdFfsDent_dentcache_search(&XrdFfsDentCaches[i], dname, dentname) == 1)
253  {
254  rval = 1;
255  break;
256  }
257  pthread_mutex_unlock(&XrdFfsDentCaches_mutex);
258  return rval;
259 }

References XrdFfsDent_dentcache_search(), XrdFfsDent_NDENTCACHES, XrdFfsDentCaches, and XrdFfsDentCaches_mutex.

Referenced by XrdFfsPosix_statall().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ XrdFfsDent_cstr_cmp()

int XrdFfsDent_cstr_cmp ( const void *  a,
const void *  b 
)

Definition at line 39 of file XrdFfsDent.cc.

40 {
41  const char **aa = (const char **)a;
42  const char **bb = (const char **)b;
43  return strcmp(*aa, *bb);
44 }

Referenced by XrdFfsDent_dentcache_search(), and XrdFfsDent_names_extract().

+ Here is the caller graph for this function:

◆ XrdFfsDent_dentcache_expired()

int XrdFfsDent_dentcache_expired ( struct XrdFfsDentcache cache)

Definition at line 169 of file XrdFfsDent.cc.

170 {
171  time_t t1;
172  t1 = time(NULL);
173  return (((t1 - cache->t0) < cache->life)? 0 : 1);
174 }

References XrdFfsDentcache::life, and XrdFfsDentcache::t0.

Referenced by XrdFfsDent_cache_fill().

+ Here is the caller graph for this function:

◆ XrdFfsDent_dentcache_fill()

void XrdFfsDent_dentcache_fill ( struct XrdFfsDentcache cache,
char *  dname,
char ***  dnarray,
int  nents 
)

Definition at line 140 of file XrdFfsDent.cc.

141 {
142  int i;
143 
144  cache->dirname = strdup(dname);
145  cache->nents = nents;
146  cache->t0 = time(NULL);
147  cache->life = nents / 10 ;
148  cache->dnarray = (char**) malloc(sizeof(char*) * nents);
149 
150  for (i = 0; i < nents; i++)
151  cache->dnarray[i] = strdup((*dnarray)[i]);
152 }

References XrdFfsDentcache::dirname, XrdFfsDentcache::dnarray, XrdFfsDentcache::life, XrdFfsDentcache::nents, and XrdFfsDentcache::t0.

Referenced by XrdFfsDent_cache_fill().

+ Here is the caller graph for this function:

◆ XrdFfsDent_dentcache_free()

void XrdFfsDent_dentcache_free ( struct XrdFfsDentcache cache)

Definition at line 154 of file XrdFfsDent.cc.

155 {
156  int i;
157  for (i = 0; i < (int)cache->nents; i++)
158  {
159  free(cache->dnarray[i]);
160  }
161  cache->nents = 0;
162  free(cache->dnarray);
163  free(cache->dirname);
164  cache->dnarray = NULL;
165  cache->dirname = NULL;
166 }

References XrdFfsDentcache::dirname, XrdFfsDentcache::dnarray, and XrdFfsDentcache::nents.

Referenced by XrdFfsDent_cache_destroy(), and XrdFfsDent_cache_fill().

+ Here is the caller graph for this function:

◆ XrdFfsDent_dentcache_invalid()

int XrdFfsDent_dentcache_invalid ( struct XrdFfsDentcache cache)

Definition at line 176 of file XrdFfsDent.cc.

177 {
178  time_t t1;
179  t1 = time(NULL);
180  return (((t1 - cache->t0) < 28700)? 0 : 1); // after 8 hours (28800 sec), the redirector no longer remembers
181 }

References XrdFfsDentcache::t0.

Referenced by XrdFfsDent_cache_fill(), and XrdFfsDent_dentcache_search().

+ Here is the caller graph for this function:

◆ XrdFfsDent_dentcache_search()

int XrdFfsDent_dentcache_search ( struct XrdFfsDentcache cache,
char *  dname,
char *  dentname 
)

Definition at line 183 of file XrdFfsDent.cc.

184 {
185  char path[1024];
186 
187  strcpy(path, dname);
188  if (dentname != NULL && path[strlen(path) -1] != '/')
189  strcat(path,"/");
190  if (dentname != NULL) strcat(path, dentname);
191  if (XrdFfsDent_dentcache_invalid(cache))
192  return 0;
193  else if (strlen(cache->dirname) == strlen(path) && strcmp(cache->dirname, path) == 0)
194  return 1;
195  else if (strlen(cache->dirname) != strlen(dname) || strcmp(cache->dirname, dname) != 0)
196  return 0;
197  else if (bsearch(&dentname, cache->dnarray, cache->nents, sizeof(char*), XrdFfsDent_cstr_cmp) != NULL)
198  return 1;
199  else
200  return 0;
201 }
int XrdFfsDent_cstr_cmp(const void *a, const void *b)
Definition: XrdFfsDent.cc:39

References XrdFfsDentcache::dirname, XrdFfsDentcache::dnarray, XrdFfsDentcache::nents, XrdFfsDent_cstr_cmp(), and XrdFfsDent_dentcache_invalid().

Referenced by XrdFfsDent_cache_fill(), and XrdFfsDent_cache_search().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ XrdFfsDent_names_add()

void XrdFfsDent_names_add ( struct XrdFfsDentnames **  p,
char *  name 
)

Definition at line 56 of file XrdFfsDent.cc.

57 {
58  struct XrdFfsDentnames *n = (struct XrdFfsDentnames*)malloc(sizeof(struct XrdFfsDentnames));
59  n->name = strdup(name);
60 
61  n->next = *p;
62  *p = n;
63  return;
64 }
struct XrdFfsDentnames * next
Definition: XrdFfsDent.hh:41

References XrdFfsDentnames::name, and XrdFfsDentnames::next.

Referenced by XrdFfsPosix_x_readdirall().

+ Here is the caller graph for this function:

◆ XrdFfsDent_names_del()

void XrdFfsDent_names_del ( struct XrdFfsDentnames **  p)

Definition at line 49 of file XrdFfsDent.cc.

50 {
51  (*p)->name = NULL;
52  (*p)->next = NULL;
53  free(*p);
54 }

Referenced by XrdFfsDent_names_extract().

+ Here is the caller graph for this function:

◆ XrdFfsDent_names_extract()

int XrdFfsDent_names_extract ( struct XrdFfsDentnames **  p,
char ***  dnarray 
)

Definition at line 100 of file XrdFfsDent.cc.

101 {
102  struct XrdFfsDentnames *x, *y;
103  int i = 0;
104 
105  y = *p;
106  while (y != NULL)
107  {
108  i++;
109  y = y->next;
110  }
111  /* be careful, old dnarray is lost */
112  *dnarray = (char**) malloc(sizeof(char*) * i);
113 
114  x = *p;
115  y = *p;
116  i = 0;
117  while (y != NULL)
118  {
119  (*dnarray)[i++] = y->name;
120  y = y->next;
122  x = y;
123  }
124 
125  qsort((*dnarray), i, sizeof(char*), XrdFfsDent_cstr_cmp);
126  *p = NULL;
127  return i;
128 }
void XrdFfsDent_names_del(struct XrdFfsDentnames **p)
Definition: XrdFfsDent.cc:49

References XrdFfsDentnames::name, XrdFfsDentnames::next, XrdFfsDent_cstr_cmp(), and XrdFfsDent_names_del().

+ Here is the call graph for this function:

◆ XrdFfsDent_names_join()

void XrdFfsDent_names_join ( struct XrdFfsDentnames **  p,
struct XrdFfsDentnames **  n 
)

Definition at line 78 of file XrdFfsDent.cc.

79 {
80  struct XrdFfsDentnames *t, *l = 0;
81 
82  if ( *p != NULL )
83  {
84  t = *p;
85  while ( t != NULL )
86  {
87  l = t;
88  t = t->next;
89  }
90  l->next = *n;
91  }
92  else
93  *p = *n;
94 }

References XrdFfsDentnames::next.

Variable Documentation

◆ XrdFfsDentCaches

◆ XrdFfsDentCaches_mutex

pthread_mutex_t XrdFfsDentCaches_mutex = PTHREAD_MUTEX_INITIALIZER

Definition at line 205 of file XrdFfsDent.cc.

Referenced by XrdFfsDent_cache_fill(), and XrdFfsDent_cache_search().