home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / comm / cyberpager-1.5.lha / CyberPager / source / library / lockFile.c < prev    next >
C/C++ Source or Header  |  1994-02-07  |  2KB  |  95 lines

  1. #include "memory.h"
  2.  
  3.   typedef struct {
  4.       struct Node Node;
  5.       ULONG LockCount;
  6.   }
  7. LockNode_t;
  8.  
  9. BOOL __saveds __asm LockFile(register __a0 PagerHandle_t * ph, register __a1 STRPTR fileName)
  10. {
  11.     STRPTR ptr;
  12.     LockNode_t *node, *n;
  13.  
  14.     ptr = FilePart(fileName);
  15.  
  16.     if (node = MyAllocVec(sizeof(LockNode_t) + strlen(ptr) + 16)) {
  17.         node->Node.ln_Name = (char *)&node[1];
  18.  
  19.         strcpy(node->Node.ln_Name, ptr);
  20.         strcat(node->Node.ln_Name, ".LOCK");
  21.  
  22.         ObtainSemaphore(&ph->ph_Sema);
  23.  
  24.         for (n = (LockNode_t *) ph->ph_LockList.lh_Head;
  25.              n->Node.ln_Succ;
  26.              n = (LockNode_t *) n->Node.ln_Succ)
  27.             if (stricmp(node->Node.ln_Name, n->Node.ln_Name) == 0) {
  28.                 n->LockCount++;
  29.                 MyFreeVec(node);
  30.                 ReleaseSemaphore(&ph->ph_Sema);
  31.                 return TRUE;
  32.             }
  33.  
  34.         if (ptr = LockDevUnit(node->Node.ln_Name, 0, ph->ph_LogProgram, 0)) {
  35.             ULog(ph, -1, "LockDevUnit() failed: %s", ptr);
  36.         }
  37.  
  38.         node->LockCount = 1;
  39.         AddTail(&ph->ph_LockList, &node->Node);
  40.  
  41.         ReleaseSemaphore(&ph->ph_Sema);
  42.  
  43.         return TRUE;
  44.     }
  45.  
  46.     ReleaseSemaphore(&ph->ph_Sema);
  47.  
  48.     return FALSE;
  49. }
  50.  
  51. static void __inline FreeLockNode(LockNode_t * node)
  52. {
  53.     Remove(&node->Node);
  54.  
  55.     FreeDevUnit(node->Node.ln_Name, 0);
  56.  
  57.     MyFreeVec(node);
  58. }
  59.  
  60. void __saveds __asm UnLockFile(register __a0 PagerHandle_t * ph, register __a1 STRPTR fileName)
  61. {
  62.     STRPTR ptr;
  63.     int ptrLen;
  64.     LockNode_t *n;
  65.  
  66.     ptr = FilePart(fileName);
  67.     ptrLen = strlen(ptr);
  68.  
  69.     ObtainSemaphore(&ph->ph_Sema);
  70.  
  71.     for (n = (LockNode_t *) ph->ph_LockList.lh_Head;
  72.          n->Node.ln_Succ;
  73.          n = (LockNode_t *) n->Node.ln_Succ)
  74.         if ((strnicmp(ptr, n->Node.ln_Name, ptrLen) == 0) && (strcmp(".LOCK", &n->Node.ln_Name[ptrLen]) == 0)) {
  75.             if (--n->LockCount == 0)
  76.                 FreeLockNode(n);
  77.  
  78.             break;
  79.         }
  80.  
  81.     ReleaseSemaphore(&ph->ph_Sema);
  82. }
  83.  
  84. void __saveds __asm UnLockFiles(register __a0 PagerHandle_t * ph)
  85. {
  86.     LockNode_t *n;
  87.  
  88.     ObtainSemaphore(&ph->ph_Sema);
  89.  
  90.     while ((n = (LockNode_t *) ph->ph_LockList.lh_Head) != (LockNode_t *) & ph->ph_LockList.lh_Tail)
  91.         FreeLockNode(n);
  92.  
  93.     ReleaseSemaphore(&ph->ph_Sema);
  94. }
  95.