ソースを参照

LibC: Make the madvise advice field a value instead of a bitfield

The advices are almost always exclusive of one another, and while POSIX
does not define madvise, most other unix-like and *BSD systems also only
accept a singular value per call.
Idan Horowitz 3 年 前
コミット
fc13d0782f
2 ファイル変更4 行追加8 行削除
  1. 2 2
      Kernel/API/POSIX/sys/mman.h
  2. 2 6
      Kernel/Syscalls/mmap.cpp

+ 2 - 2
Kernel/API/POSIX/sys/mman.h

@@ -31,8 +31,8 @@ extern "C" {
 
 #define MAP_FAILED ((void*)-1)
 
-#define MADV_SET_VOLATILE 0x100
-#define MADV_SET_NONVOLATILE 0x200
+#define MADV_SET_VOLATILE 0x1
+#define MADV_SET_NONVOLATILE 0x2
 
 #define MS_SYNC 1
 #define MS_ASYNC 2

+ 2 - 6
Kernel/Syscalls/mmap.cpp

@@ -424,18 +424,14 @@ ErrorOr<FlatPtr> Process::sys$madvise(Userspace<void*> address, size_t size, int
         return EINVAL;
     if (!region->is_mmap())
         return EPERM;
-    bool set_volatile = advice & MADV_SET_VOLATILE;
-    bool set_nonvolatile = advice & MADV_SET_NONVOLATILE;
-    if (set_volatile && set_nonvolatile)
-        return EINVAL;
-    if (set_volatile || set_nonvolatile) {
+    if (advice == MADV_SET_VOLATILE || advice == MADV_SET_NONVOLATILE) {
         if (!region->vmobject().is_anonymous())
             return EINVAL;
         auto& vmobject = static_cast<Memory::AnonymousVMObject&>(region->vmobject());
         if (!vmobject.is_purgeable())
             return EINVAL;
         bool was_purged = false;
-        TRY(vmobject.set_volatile(set_volatile, was_purged));
+        TRY(vmobject.set_volatile(advice == MADV_SET_VOLATILE, was_purged));
         return was_purged ? 1 : 0;
     }
     return EINVAL;