xfile.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "all.h"
  2. static Xfile * xflfree;
  3. static Xfid * xfdfree;
  4. #define FIDMOD 127 /* prime */
  5. static Xfile *xfiles[FIDMOD];
  6. static Lock xlocks[FIDMOD];
  7. Xfile *
  8. xfile(Qid *qid, void *s, int new)
  9. {
  10. int k;
  11. Xfile **hp, *f, *pf;
  12. k = ((ulong)qid->path ^ (((ulong)s)<<24))%FIDMOD;
  13. hp = &xfiles[k];
  14. lock(&xlocks[k]);
  15. for(f=*hp, pf=0; f; pf=f, f=f->next)
  16. if(f->qid.path == qid->path && f->s == s)
  17. break;
  18. if(f && pf){
  19. pf->next = f->next;
  20. f->next = *hp;
  21. *hp = f;
  22. }
  23. if(new < 0 && f){
  24. *hp = f->next;
  25. f->next = xflfree;
  26. xflfree = f;
  27. f = 0;
  28. }
  29. if(new > 0 && !f){
  30. if(!(f = xflfree)) /* assign = */
  31. f = listalloc(1024/sizeof(Xfile), sizeof(Xfile));
  32. xflfree = f->next;
  33. memset(f, 0, sizeof(Xfile));
  34. f->next = *hp;
  35. *hp = f;
  36. f->qid = *qid;
  37. f->s = s;
  38. }
  39. unlock(&xlocks[k]);
  40. return f;
  41. }
  42. Xfid *
  43. xfid(char *uid, Xfile *xp, int new)
  44. {
  45. Xfid *f, *pf;
  46. for(f=xp->users, pf=0; f; pf=f, f=f->next)
  47. if(f->uid[0] == uid[0] && strcmp(f->uid, uid) == 0)
  48. break;
  49. if(f && pf){
  50. pf->next = f->next;
  51. f->next = xp->users;
  52. xp->users = f;
  53. }
  54. if(new < 0 && f){
  55. if(f->urfid)
  56. clunkfid(xp->s, f->urfid);
  57. if(f->opfid)
  58. clunkfid(xp->s, f->opfid);
  59. xp->users = f->next;
  60. f->next = xfdfree;
  61. xfdfree = f;
  62. f = 0;
  63. }
  64. if(new > 0 && !f){
  65. if(!(f = xfdfree)) /* assign = */
  66. f = listalloc(1024/sizeof(Xfid), sizeof(Xfid));
  67. xfdfree = f->next;
  68. memset(f, 0, sizeof(Xfid));
  69. f->next = xp->users;
  70. xp->users = f;
  71. f->xp = xp;
  72. f->uid = strstore(uid);
  73. f->urfid = 0;
  74. f->opfid = 0;
  75. }
  76. return f;
  77. }
  78. int
  79. xfpurgeuid(Session *s, char *uid)
  80. {
  81. Xfile **hp, *f;
  82. Xfid *xf;
  83. int k, count=0;
  84. for(k=0; k<FIDMOD; k++){
  85. lock(&xlocks[k]);
  86. hp=&xfiles[k];
  87. for(f=*hp; f; f=f->next)
  88. if(f->s == s && (xf = xfid(uid, f, 0))){ /* assign = */
  89. xfclear(xf);
  90. ++count;
  91. }
  92. unlock(&xlocks[k]);
  93. }
  94. return count;
  95. }