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