Blame ext/posix/sched.c

Packit 437b5e
/*
Packit 437b5e
 * POSIX library for Lua 5.1, 5.2 & 5.3.
Packit 437b5e
 * (c) Gary V. Vaughan <gary@vaughan.pe>, 2013-2015
Packit 437b5e
 * (c) Reuben Thomas <rrt@sc3d.org> 2010-2013
Packit 437b5e
 * (c) Natanael Copa <natanael.copa@gmail.com> 2008-2010
Packit 437b5e
 * Clean up and bug fixes by Leo Razoumov <slonik.az@gmail.com> 2006-10-11
Packit 437b5e
 * Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br> 07 Apr 2006 23:17:49
Packit 437b5e
 * Based on original by Claudio Terra for Lua 3.x.
Packit 437b5e
 * With contributions by Roberto Ierusalimschy.
Packit 437b5e
 * With documentation from Steve Donovan 2012
Packit 437b5e
 */
Packit 437b5e
/***
Packit 437b5e
 Kernel Thread Scheduling Priority.
Packit 437b5e
Packit 437b5e
 Where supported by the underlying system, functions to discover and
Packit 437b5e
 change the kernel thread scheduling priority.  If the module loads
Packit 437b5e
 successfully, but there is no kernel support, then `posix.sched.version`
Packit 437b5e
 will be set, but the unsupported APIs will be `nil`.
Packit 437b5e
@module posix.sched
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
#include <config.h>
Packit 437b5e
Packit 437b5e
#include <unistd.h>	/* for _POSIX_PRIORITY_SCHEDULING */
Packit 437b5e
Packit 437b5e
#ifdef _POSIX_PRIORITY_SCHEDULING
Packit 437b5e
#include <sched.h>
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
#include "_helpers.c"
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
get scheduling policy
Packit 437b5e
@function sched_getscheduler
Packit 437b5e
@int[opt=0] pid process to act on, or `0` for caller process
Packit 437b5e
@treturn[1] int scheduling policy `SCHED_FIFO`, `SCHED_RR`, `SCHED_OTHER`,
Packit 437b5e
  if successful
Packit 437b5e
@return[2] nil
Packit 437b5e
@treturn[2] string error message
Packit 437b5e
@treturn[2] int errnum
Packit 437b5e
@see sched_getscheduler(2)
Packit 437b5e
*/
Packit 437b5e
#if HAVE_SCHED_GETSCHEDULER
Packit 437b5e
static int
Packit 437b5e
Psched_getscheduler(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	struct sched_param sched_param  = {0};
Packit 437b5e
	pid_t pid = optint(L, 1, 0);
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
	return pushresult(L, sched_getscheduler(pid), NULL);
Packit 437b5e
}
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
set scheduling policy/priority
Packit 437b5e
@function sched_setscheduler
Packit 437b5e
@see sched_setscheduler(2)
Packit 437b5e
@int[opt=0] pid process to act on, or `0` for caller process
Packit 437b5e
@int[opt=`SCHED_OTHER`] policy one of `SCHED_FIFO`, `SCHED_RR` or
Packit 437b5e
  `SCHED_OTHER`
Packit 437b5e
@int[opt=0] priority must be `0` for `SCHED_OTHER`, or else a positive
Packit 437b5e
  number below 100 for real-time policies
Packit 437b5e
@treturn[1] int `0`, if successful
Packit 437b5e
@return[2] nil
Packit 437b5e
@treturn[2] string error message
Packit 437b5e
@treturn[2] int errnum
Packit 437b5e
*/
Packit 437b5e
#if HAVE_SCHED_SETSCHEDULER
Packit 437b5e
static int
Packit 437b5e
Psched_setscheduler(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	struct sched_param sched_param = {0};
Packit 437b5e
	pid_t pid = optint(L, 1, 0);
Packit 437b5e
	int policy = optint(L, 2, SCHED_OTHER);
Packit 437b5e
	sched_param.sched_priority =  optint (L, 3, 0);
Packit 437b5e
	checknargs(L, 3);
Packit 437b5e
	return pushresult(L, sched_setscheduler(pid, policy, &sched_param), NULL);
Packit 437b5e
}
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const luaL_Reg posix_sched_fns[] =
Packit 437b5e
{
Packit 437b5e
#if HAVE_SCHED_GETSCHEDULER
Packit 437b5e
	LPOSIX_FUNC( Psched_getscheduler	),
Packit 437b5e
#endif
Packit 437b5e
#if HAVE_SCHED_SETSCHEDULER
Packit 437b5e
	LPOSIX_FUNC( Psched_setscheduler	),
Packit 437b5e
#endif
Packit 437b5e
	{NULL, NULL}
Packit 437b5e
};
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Constants.
Packit 437b5e
@section constants
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Scheduler constants.
Packit 437b5e
Any constants not available in the underlying system will be `nil` valued.
Packit 437b5e
@table posix.sched
Packit 437b5e
@int SCHED_FIFO  first-in, first-out scheduling policy
Packit 437b5e
@int SCHED_RR round-robin scheduling policy
Packit 437b5e
@int SCHED_OTHER another scheduling policy
Packit 437b5e
@usage
Packit 437b5e
  -- Print scheduler constants supported on this host.
Packit 437b5e
  for name, value in pairs (require "posix.sched") do
Packit 437b5e
    if type (value) == "number" then
Packit 437b5e
      print (name, value)
Packit 437b5e
     end
Packit 437b5e
  end
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
LUALIB_API int
Packit 437b5e
luaopen_posix_sched(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	luaL_register(L, "posix.sched", posix_sched_fns);
Packit 437b5e
	lua_pushliteral(L, "posix.sched for " LUA_VERSION " / " PACKAGE_STRING);
Packit 437b5e
	lua_setfield(L, -2, "version");
Packit 437b5e
Packit 437b5e
	/* Psched_setscheduler flags */
Packit 437b5e
#ifdef SCHED_FIFO
Packit 437b5e
	LPOSIX_CONST( SCHED_FIFO	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef SCHED_RR
Packit 437b5e
	LPOSIX_CONST( SCHED_RR		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef SCHED_OTHER
Packit 437b5e
	LPOSIX_CONST( SCHED_OTHER	);
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}