1/*
2 * Copyright 2019, Leorize <leorize+oss@disroot.org>. All rights reserved.
3 * Distributed under the terms of the MIT license.
4 */
5
6
7#ifndef _XOPEN_SOURCE
8#define _XOPEN_SOURCE 600
9#endif
10
11#include <limits.h>
12#include <sys/resource.h>
13#include <unistd.h>
14
15#include <sys/param.h> /* MAX(), MIN() */
16
17
18/* setpriority() is used for the implementation as they share the same
19 * restrictions as defined in POSIX.1-2008. However, some restrictions might not
20 * be implemented by Haiku's setpriority(). */
21int
22nice(int incr)
23{
24	int priority = incr;
25
26	/* avoids overflow by checking the bounds beforehand */
27	if (priority > -(2 * NZERO - 1) && priority < (2 * NZERO - 1))
28		priority += getpriority(PRIO_PROCESS, 0);
29
30	priority = MAX(priority, -NZERO);
31	priority = MIN(priority, NZERO - 1);
32
33	return setpriority(PRIO_PROCESS, 0, priority) != -1 ? priority : -1;
34}
35