Move some profile stuff to NDK and fix some bugs in the executive implementation...
[reactos.git] / reactos / ntoskrnl / fs / filelock.c
index 577f2f8..5889e1a 100644 (file)
 #define NDEBUG
 #include <internal/debug.h>
 
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, FsRtlpInitFileLockingImplementation)
+#endif
+
+
 /*
 NOTE:
 I'm not using resource syncronization here, since FsRtlFastCheckLockForRead/Write
@@ -27,7 +32,7 @@ PAGED_LOOKASIDE_LIST    LockLookaside;
 
 
 
-inline BOOLEAN
+__inline BOOLEAN
 IsOverlappingLock(
    PFILE_LOCK_INFO Lock,
    PLARGE_INTEGER StartOffset,
@@ -48,7 +53,7 @@ IsOverlappingLock(
 }
 
 
-inline BOOLEAN
+__inline BOOLEAN
 IsSurroundingLock(
    PFILE_LOCK_INFO Lock,
    PLARGE_INTEGER StartOffset,
@@ -161,7 +166,6 @@ FsRtlpCheckLockForReadOrWriteAccess(
    KIRQL                oldirql;
    PFILE_LOCK_TOC       LockToc;
    PFILE_LOCK_GRANTED   Granted;
-   PLIST_ENTRY          EnumEntry;
    LARGE_INTEGER        EndOffset;
 
    ASSERT(FileLock);
@@ -177,10 +181,8 @@ FsRtlpCheckLockForReadOrWriteAccess(
 
    KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
 
-   LIST_FOR_EACH(EnumEntry, &LockToc->GrantedListHead)
+   LIST_FOR_EACH(Granted, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry)
    {
-      Granted = CONTAINING_RECORD(EnumEntry, FILE_LOCK_GRANTED, ListEntry);
-
       //if overlapping
       if(IsOverlappingLock(&Granted->Lock, FileOffset, &EndOffset))
       {
@@ -358,12 +360,12 @@ FsRtlpFastUnlockAllByKey(
 {
    KIRQL                                     oldirql;
    PFILE_LOCK_TOC                 LockToc;
-   PLIST_ENTRY                    EnumEntry;
-   PFILE_LOCK_GRANTED  Granted;
+   PFILE_LOCK_GRANTED  Granted, tmp;
    BOOLEAN                                Unlock = FALSE;
    //must make local copy since FILE_LOCK struct is allowed to be paged
    BOOLEAN                     GotUnlockRoutine;
    LIST_ENTRY           UnlockedListHead;
+   PLIST_ENTRY          EnumEntry;
 
    ASSERT(FileLock);
    LockToc = FileLock->LockInformation;
@@ -377,7 +379,7 @@ FsRtlpFastUnlockAllByKey(
    GotUnlockRoutine = FileLock->UnlockRoutine != NULL;
    KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
 
-   LIST_FOR_EACH_SAFE(EnumEntry, &LockToc->GrantedListHead, Granted, FILE_LOCK_GRANTED, ListEntry)
+   LIST_FOR_EACH_SAFE(Granted, tmp, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry)
    {
 
       if (Granted->Lock.Process == Process &&
@@ -506,17 +508,14 @@ FsRtlpAddLock(
    IN PVOID                Context
    )
 {
-   PLIST_ENTRY          EnumEntry;
    PFILE_LOCK_GRANTED   Granted;
    LARGE_INTEGER        EndOffset;
 
    EndOffset.QuadPart = FileOffset->QuadPart + Length->QuadPart - 1;
 
    //loop and try to find conflicking locks
-   LIST_FOR_EACH(EnumEntry, &LockToc->GrantedListHead)
+   LIST_FOR_EACH(Granted, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry)
    {
-      Granted = CONTAINING_RECORD(EnumEntry,FILE_LOCK_GRANTED, ListEntry);
-
       if (IsOverlappingLock(&Granted->Lock, FileOffset, &EndOffset))
       {
          //we found a locks that overlap with the new lock
@@ -578,13 +577,13 @@ FsRtlpCompletePendingLocks(
 {
    //walk pending list, FIFO order, try 2 complete locks
    PLIST_ENTRY                   EnumEntry;
-   PIRP                          Irp;
+   PIRP                          Irp, tmp;
    PIO_STACK_LOCATION            Stack;
    LIST_ENTRY                    CompletedListHead;
 
    InitializeListHead(&CompletedListHead);
 
-   LIST_FOR_EACH_SAFE(EnumEntry, &LockToc->PendingListHead, Irp, IRP, Tail.Overlay.ListEntry)
+   LIST_FOR_EACH_SAFE(Irp, tmp, &LockToc->PendingListHead, IRP, Tail.Overlay.ListEntry)
    {
       Stack = IoGetCurrentIrpStackLocation(Irp);
       if (FsRtlpAddLock(LockToc,
@@ -676,8 +675,7 @@ FsRtlpUnlockSingle(
 {
    KIRQL                oldirql;
    PFILE_LOCK_TOC       LockToc;
-   PFILE_LOCK_GRANTED   Granted;
-   PLIST_ENTRY          EnumEntry;
+   PFILE_LOCK_GRANTED   Granted, tmp;
 
    ASSERT(FileLock);
    LockToc = FileLock->LockInformation;
@@ -689,7 +687,7 @@ FsRtlpUnlockSingle(
 
    KeAcquireSpinLock(&LockToc->SpinLock, &oldirql );
 
-   LIST_FOR_EACH_SAFE(EnumEntry, &LockToc->GrantedListHead, Granted,FILE_LOCK_GRANTED,ListEntry)
+   LIST_FOR_EACH_SAFE(Granted, tmp, &LockToc->GrantedListHead, FILE_LOCK_GRANTED,ListEntry)
    {
 
       //must be exact match
@@ -778,7 +776,6 @@ FsRtlpDumpFileLocks(
    PFILE_LOCK_TOC       LockToc;
    PFILE_LOCK_GRANTED   Granted;
    PIRP                 Irp;
-   PLIST_ENTRY          EnumEntry;
    PIO_STACK_LOCATION   Stack;
 
    ASSERT(FileLock);
@@ -794,11 +791,9 @@ FsRtlpDumpFileLocks(
 
    KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
 
-   LIST_FOR_EACH(EnumEntry, &LockToc->GrantedListHead)
+   LIST_FOR_EACH(Granted, &LockToc->GrantedListHead, FILE_LOCK_GRANTED , ListEntry)
    {
-      Granted = CONTAINING_RECORD(EnumEntry, FILE_LOCK_GRANTED , ListEntry);
-
-      DPRINT1("%s, start: %i, len: %i, end: %i, key: %i, proc: 0x%X, fob: 0x%X\n",
+      DPRINT1("%s, start: %I64x, len: %I64x, end: %I64x, key: %i, proc: 0x%p, fob: 0x%p\n",
          Granted->Lock.ExclusiveLock ? "EXCL" : "SHRD",
          Granted->Lock.StartingByte.QuadPart,
          Granted->Lock.Length.QuadPart,
@@ -812,12 +807,11 @@ FsRtlpDumpFileLocks(
 
    DPRINT1("Dumping pending file locks, FIFO order\n");
 
-   LIST_FOR_EACH(EnumEntry, &LockToc->PendingListHead)
+   LIST_FOR_EACH(Irp, &LockToc->PendingListHead, IRP , Tail.Overlay.ListEntry)
    {
-      Irp = CONTAINING_RECORD(EnumEntry, IRP , Tail.Overlay.ListEntry);
       Stack = IoGetCurrentIrpStackLocation(Irp);
 
-      DPRINT1("%s, start: %i, len: %i, end: %i, key: %i, proc: 0x%X, fob: 0x%X\n",
+      DPRINT1("%s, start: %I64x, len: %I64x, end: %I64x, key: %i, proc: 0x%p, fob: 0x%p\n",
          (Stack->Flags & SL_EXCLUSIVE_LOCK) ? "EXCL" : "SHRD",
          Stack->Parameters.LockControl.ByteOffset.QuadPart,
          Stack->Parameters.LockControl.Length->QuadPart,
@@ -1372,7 +1366,7 @@ FsRtlReleaseFile(
     if ((FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)) {
 
         /* Use a Resource Release */
-        ExReleaseResource(FcbHeader->Resource);
+        ExReleaseResourceLite(FcbHeader->Resource);
 
         return;
     }