Rev 74426 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/** R : A Computer Language for Statistical Data Analysis* Copyright (C) 2011--2018 The R Core Team.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, a copy is available at* https://www.R-project.org/Licenses/*/#ifdef HAVE_CONFIG_H#include <config.h>#endif#include "tools.h"#include <signal.h> // C99#ifdef _WIN32#define WIN32_LEAN_AND_MEAN#include <windows.h>#endifSEXP ps_kill(SEXP spid, SEXP ssignal){SEXP sspid, sres;int *pid, *res, signal = asInteger(ssignal);PROTECT(sspid = coerceVector(spid, INTSXP));unsigned int ns = LENGTH(sspid);PROTECT(sres = allocVector(LGLSXP, ns));pid = INTEGER(sspid);res = INTEGER(sres);#if !defined(_WIN32) && !defined(HAVE_KILL)warning(_("pskill() is not supported on this platform"));#endiffor (int i = 0; i < ns; i++) {res[i] = FALSE;if(signal != NA_INTEGER) {#ifdef _WIN32HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pid[i]);if (hProc) {if (TerminateProcess(hProc, 1) != 0) res[i] = TRUE;CloseHandle(hProc);}#elif defined(HAVE_KILL)if (pid[i] > 0 && pid[i] != NA_INTEGER &&kill(pid[i], signal) == 0) res[i] = TRUE;#endif}}UNPROTECT(2);return sres;}#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETPRIORITY)/* on macOS it seems sys/resource.h needed sys/time.h first at one time */#include <sys/time.h>#include <sys/resource.h>#include <errno.h>SEXP ps_priority(SEXP spid, SEXP svalue){SEXP sspid, sres;int *pid, *res, val;val = asInteger(svalue);PROTECT(sspid = coerceVector(spid, INTSXP));unsigned int ns = LENGTH(sspid);PROTECT(sres = allocVector(INTSXP, ns));pid = INTEGER(sspid);res = INTEGER(sres);for (int i = 0; i < ns; i++) {if (pid[i] <= 0) {res[i] = NA_INTEGER;continue;}if (pid[i] != NA_INTEGER) {/* return value -1 is both an error valueand a legitimate niceness */errno = 0;res[i] = getpriority(PRIO_PROCESS, pid[i]);if(errno) res[i] = NA_INTEGER;if(val != NA_INTEGER) setpriority(PRIO_PROCESS, pid[i], val);} else res[i] = NA_INTEGER;}UNPROTECT(2);return sres;}#elif defined(_WIN32)SEXP ps_priority(SEXP spid, SEXP svalue){SEXP sspid, sres;int *pid, *res, val;val = asInteger(svalue);PROTECT(sspid = coerceVector(spid, INTSXP));unsigned int ns = LENGTH(sspid);PROTECT(sres = allocVector(INTSXP, ns));pid = INTEGER(sspid);res = INTEGER(sres);for (int i = 0; i < ns; i++) {HANDLE hProc = OpenProcess(val != NA_INTEGER ?PROCESS_SET_INFORMATION: PROCESS_QUERY_INFORMATION,FALSE, pid[i]);if (hProc && pid[i] != NA_INTEGER) {DWORD tmp = GetPriorityClass(hProc);switch(tmp) {case ABOVE_NORMAL_PRIORITY_CLASS: res[i] = -5; break;case BELOW_NORMAL_PRIORITY_CLASS: res[i] = 15; break;case HIGH_PRIORITY_CLASS: res[i] = -10; break;case IDLE_PRIORITY_CLASS: res[i] = 19; break;case NORMAL_PRIORITY_CLASS: res[i] = 0; break;case REALTIME_PRIORITY_CLASS: res[i] = -20; break;}if(val != NA_INTEGER) {switch(val) {case 19: tmp = IDLE_PRIORITY_CLASS; break;case 15: tmp = BELOW_NORMAL_PRIORITY_CLASS; break;case 0: tmp = NORMAL_PRIORITY_CLASS; break;case -5: tmp = ABOVE_NORMAL_PRIORITY_CLASS; break;case -10: tmp = HIGH_PRIORITY_CLASS; break;}SetPriorityClass(hProc, tmp);}CloseHandle(hProc);} else res[i] = NA_INTEGER;}UNPROTECT(2);return sres;}#elseSEXP ps_priority(SEXP spid, SEXP svalue){error(_("psnice() is not supported on this platform"));return R_NilValue; /* -Wall */}#endifSEXP ps_sigs(SEXP signo){int res = NA_INTEGER;switch(asInteger(signo)) {/* only SIGINT and SIGTERM are in C99 */#ifdef SIGHUPcase 1: res = SIGHUP; break;#endif#ifdef SIGINTcase 2: res = SIGINT; break;#endif#ifdef SIGQUITcase 3: res = SIGQUIT; break;#endif#ifdef SIGKILLcase 9: res = SIGKILL; break;#endif#ifdef SIGTERMcase 15: res = SIGTERM; break;#endif#ifdef SIGSTOPcase 17: res = SIGSTOP; break;#endif#ifdef SIGTSTPcase 18: res = SIGTSTP; break;#endif#ifdef SIGCONTcase 19: res = SIGCONT; break;#endif#ifdef SIGCHLDcase 20: res = SIGCHLD; break;#endif#ifdef SIGUSR1case 30: res = SIGUSR1; break;#endif#ifdef SIGUSR2case 31: res = SIGUSR2; break;#endifdefault: break;}return ScalarInteger(res);}