File: ioprio.cpp

package info (click to toggle)
watchman 4.9.0-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,992 kB
  • sloc: cpp: 27,459; python: 6,538; java: 3,404; php: 3,257; ansic: 2,803; javascript: 1,116; makefile: 671; ruby: 364; sh: 124; xml: 102; lisp: 4
file content (56 lines) | stat: -rw-r--r-- 1,323 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* Copyright 2012-present Facebook, Inc.
 * Licensed under the Apache License, Version 2.0 */

#include "watchman.h"
#ifdef __linux__
#include <syscall.h>

/* There's no easily included header for this, so we recreate these here */
enum {
  IOPRIO_CLASS_NONE,
  IOPRIO_CLASS_RT,
  IOPRIO_CLASS_BE,
  IOPRIO_CLASS_IDLE,
};
enum {
  IOPRIO_WHO_PROCESS = 1,
  IOPRIO_WHO_PGRP,
  IOPRIO_WHO_USER,
};
#define IOPRIO_CLASS_SHIFT      (13)
#define IOPRIO_PRIO_MASK        ((1UL << IOPRIO_CLASS_SHIFT) - 1)
#define IOPRIO_PRIO_VALUE(class, data)  (((class) << IOPRIO_CLASS_SHIFT) | data)

#endif
#ifdef __APPLE__
#include <sys/resource.h>
#endif

static void adjust_ioprio(bool low) {
#if defined(__APPLE__) && defined(IOPOL_STANDARD)
  setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_THREAD,
      low ? IOPOL_THROTTLE : IOPOL_STANDARD);
#endif
#ifdef __linux__
  syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, 0,
      low ? IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)
          : IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 4));
#endif
#ifdef _WIN32
  SetThreadPriority(GetCurrentThread(),
      low ? THREAD_MODE_BACKGROUND_BEGIN
          : THREAD_MODE_BACKGROUND_END);
#endif
  unused_parameter(low);
}

void w_ioprio_set_low(void) {
  adjust_ioprio(true);
}

void w_ioprio_set_normal(void) {
  adjust_ioprio(false);
}

/* vim:ts=2:sw=2:et:
 */