xref: /PHP-7.4/win32/nice.c (revision 92ac598a)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 7                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) The PHP Group                                          |
6    +----------------------------------------------------------------------+
7    | This source file is subject to version 3.01 of the PHP license,      |
8    | that is bundled with this package in the file LICENSE, and is        |
9    | available through the world-wide-web at the following url:           |
10    | http://www.php.net/license/3_01.txt                                  |
11    | If you did not receive a copy of the PHP license and are unable to   |
12    | obtain it through the world-wide-web, please send a note to          |
13    | license@php.net so we can mail you a copy immediately.               |
14    +----------------------------------------------------------------------+
15    | Authors: Kalle Sommer Nielsen <kalle@php.net>                        |
16    +----------------------------------------------------------------------+
17  */
18 
19 #include <php.h>
20 #include "nice.h"
21 
22 /*
23  * Basic Windows implementation for the nice() function.
24  *
25  * This implementation uses SetPriorityClass() as a backend for defining
26  * a process priority.
27  *
28  * The following values of inc, defines the value sent to SetPriorityClass():
29  *
30  *  +-----------------------+-----------------------------+
31  *  | Expression            | Priority type                |
32  *  +-----------------------+-----------------------------+
33  *  | priority < -9         | HIGH_PRIORITY_CLASS          |
34  *  +-----------------------+-----------------------------+
35  *  | priority < -4         | ABOVE_NORMAL_PRIORITY_CLASS  |
36  *  +-----------------------+-----------------------------+
37  *  | priority > 4          | BELOW_NORMAL_PRIORITY_CLASS  |
38  *  +-----------------------+-----------------------------+
39  *  | priority > 9          | IDLE_PRIORITY_CLASS          |
40  *  +-----------------------+-----------------------------+
41  *
42  * If a value is between -4 and 4 (inclusive), then the priority will be set
43  * to NORMAL_PRIORITY_CLASS.
44  *
45  * These values tries to mimic that of the UNIX version of nice().
46  *
47  * This is applied to the main process, not per thread, although this could
48  * be implemented using SetThreadPriority() at one point.
49  *
50  * Note, the following priority classes are left out with intention:
51  *
52  *   . REALTIME_PRIORITY_CLASS
53  *     Realtime priority class requires special system permissions to set, and
54  *     can be dangerous in certain cases.
55  *
56  *   . PROCESS_MODE_BACKGROUND_BEGIN
57  *   . PROCESS_MODE_BACKGROUND_END
58  *     Process mode is not covered because it can easily forgotten to be changed
59  *     back and can cause unforseen side effects that is hard to debug. Besides
60  *     that, these do generally not really fit into making a Windows somewhat
61  *     compatible nice() function.
62  */
63 
nice(zend_long p)64 PHPAPI int nice(zend_long p)
65 {
66 	DWORD dwFlag = NORMAL_PRIORITY_CLASS;
67 
68 	if (p < -9) {
69 		dwFlag = HIGH_PRIORITY_CLASS;
70 	} else if (p < -4) {
71 		dwFlag = ABOVE_NORMAL_PRIORITY_CLASS;
72 	} else if (p > 9) {
73 		dwFlag = IDLE_PRIORITY_CLASS;
74 	} else if (p > 4) {
75 		dwFlag = BELOW_NORMAL_PRIORITY_CLASS;
76 	}
77 
78 	if (!SetPriorityClass(GetCurrentProcess(), dwFlag)) {
79 		return -1;
80 	}
81 
82 	return 0;
83 }
84