1 /* Copyright 2012-present Facebook, Inc.
2  * Licensed under the Apache License, Version 2.0 */
3 
4 #include "watchman.h"
5 #ifdef __linux__
6 #include <syscall.h>
7 
8 /* There's no easily included header for this, so we recreate these here */
9 enum {
10   IOPRIO_CLASS_NONE,
11   IOPRIO_CLASS_RT,
add(const w_string & path,bool is_vcs_ignore)12   IOPRIO_CLASS_BE,
13   IOPRIO_CLASS_IDLE,
14 };
15 enum {
16   IOPRIO_WHO_PROCESS = 1,
17   IOPRIO_WHO_PGRP,
18   IOPRIO_WHO_USER,
19 };
20 #define IOPRIO_CLASS_SHIFT      (13)
21 #define IOPRIO_PRIO_MASK        ((1UL << IOPRIO_CLASS_SHIFT) - 1)
isIgnored(const char * path,uint32_t pathlen) const22 #define IOPRIO_PRIO_VALUE(class, data)  (((class) << IOPRIO_CLASS_SHIFT) | data)
23 
24 #endif
25 #ifdef __APPLE__
26 #include <sys/resource.h>
27 #endif
28 
29 static void adjust_ioprio(bool low) {
30 #if defined(__APPLE__) && defined(IOPOL_STANDARD)
31   setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_THREAD,
32       low ? IOPOL_THROTTLE : IOPOL_STANDARD);
33 #endif
34 #ifdef __linux__
35   syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, 0,
36       low ? IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)
37           : IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 4));
38 #endif
39 #ifdef _WIN32
40   SetThreadPriority(GetCurrentThread(),
41       low ? THREAD_MODE_BACKGROUND_BEGIN
42           : THREAD_MODE_BACKGROUND_END);
43 #endif
44   unused_parameter(low);
45 }
46 
47 void w_ioprio_set_low(void) {
48   adjust_ioprio(true);
49 }
50 
51 void w_ioprio_set_normal(void) {
52   adjust_ioprio(false);
53 }
54 
55 /* vim:ts=2:sw=2:et:
56  */
57