diff --git a/man/man1/pmsleep.1 b/man/man1/pmsleep.1 index 3cd4c7d..832c710 100644 --- a/man/man1/pmsleep.1 +++ b/man/man1/pmsleep.1 @@ -1,5 +1,6 @@ '\"macro stdmacro .\" +.\" Copyright (c) 2015 Red Hat. .\" Copyright (c) 2007 Silicon Graphics, Inc. All Rights Reserved. .\" .\" This program is free software; you can redistribute it and/or modify it @@ -15,15 +16,21 @@ .\" .TH PMSLEEP 1 "PCP" "Performance Co-Pilot" .SH NAME +\f3pmpause\f1, \f3pmsleep\f1 \- portable subsecond-capable sleep .\" literals use .B or \f3 .\" arguments use .I or \f2 .SH SYNOPSIS +.B $PCP_BINADM_DIR/pmpause +.br .B $PCP_BINADM_DIR/pmsleep .I interval .SH DESCRIPTION +.B pmpause +sleeps indefinitely, until interrupted by SIGKILL. +.PP .B pmsleep -sleeps for +sleeps for the specified .I interval. The .I interval @@ -37,8 +44,10 @@ or floating point constant .SH DIAGNOSTICS The exit status is 0 for success, or 1 for a malformed command line. If the underlying -.B nanosleep (2) +.BR nanosleep (2) system call fails, an errno is returned. .SH SEE ALSO .BR sleep (1), -.BR nanosleep (3). +.BR pause (2) +and +.BR nanosleep (2). diff --git a/src/pmcd/rc_pmcd b/src/pmcd/rc_pmcd index 6e78a36..8659a19 100644 --- a/src/pmcd/rc_pmcd +++ b/src/pmcd/rc_pmcd @@ -499,9 +499,10 @@ Error: pmcd control file '"$PCP_PMCDCONF_PATH"' is missing, cannot start pmcd.' rm -f "$PCP_TMP_DIR/pmlogger/primary" # site-local customisations after PMCD startup - # [ -x $PCPLOCAL ] && $PCPLOCAL $VFLAG start - + + # finally, pause here if running in a container + [ -f $PCP_SYSCONF_DIR/rc.pause ] && $PCP_BINADM_DIR/pmpause fi status=0 ;; diff --git a/src/pmsleep/GNUmakefile b/src/pmsleep/GNUmakefile index 4682093..de529ee 100644 --- a/src/pmsleep/GNUmakefile +++ b/src/pmsleep/GNUmakefile @@ -1,4 +1,5 @@ # +# Copyright (c) 2015 Red Hat. # Copyright (c) 2007 Silicon Graphics, Inc. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify it @@ -26,6 +27,7 @@ include $(BUILDRULES) install: $(CMDTARGET) $(INSTALL) -m 755 $(CMDTARGET) $(PCP_BINADM_DIR)/$(CMDTARGET) + $(INSTALL) -S $(PCP_BINADM_DIR)/$(CMDTARGET) $(PCP_BINADM_DIR)/pmpause default_pcp: default diff --git a/src/pmsleep/pmsleep.c b/src/pmsleep/pmsleep.c index a3c5f75..187b408 100644 --- a/src/pmsleep/pmsleep.c +++ b/src/pmsleep/pmsleep.c @@ -1,4 +1,5 @@ /* + * Copyright (c) 2015 Red Hat. All Rights Reserved. * Copyright (c) 2007 Silicon Graphics, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it @@ -12,32 +13,49 @@ * for more details. */ -#include -#include -#include #include "pmapi.h" +#include "impl.h" -int -main(int argc, char **argv) +static int +pmpause(void) +{ + sigset_t sigset; + sigfillset(&sigset); + sigprocmask(SIG_BLOCK, &sigset, NULL); + pause(); + return 0; +} + +static int +pmsleep(const char *interval) { struct timespec rqt; struct timeval delta; - int r = 0; char *msg; + + if (pmParseInterval(interval, &delta, &msg) < 0) { + fputs(msg, stderr); + free(msg); + } else { + rqt.tv_sec = delta.tv_sec; + rqt.tv_nsec = delta.tv_usec * 1000; + if (0 != nanosleep(&rqt, NULL)) + return oserror(); + } + return 0; +} - if (argc == 2) { - if (pmParseInterval(argv[1], &delta, &msg) < 0) { - fputs(msg, stderr); - free(msg); - } else { - rqt.tv_sec = delta.tv_sec; - rqt.tv_nsec = delta.tv_usec * 1000; - if (0 != nanosleep(&rqt, NULL)) - r = oserror(); +int +main(int argc, char **argv) +{ + int sts = 1; - exit(r); - } - } - fprintf(stderr, "Usage: pmsleep interval\n"); - exit(1); + __pmSetProgname(argv[0]); + if (strcmp(pmProgname, "pmpause") == 0) + sts = pmpause(); + else if (argc == 2) + sts = pmsleep(argv[1]); + else + fprintf(stderr, "Usage: %s interval\n", pmProgname); + exit(sts); }