Merge pull request #1336 from brauner/2016-11-29/use_clockgettime

state: use async signal safe fun in lxc_wait()
This commit is contained in:
Stéphane Graber 2016-11-29 14:01:39 -05:00 committed by GitHub
commit aee937d034

View File

@ -20,25 +20,27 @@
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <errno.h>
#include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <fcntl.h> #include <time.h>
#include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/file.h> #include <sys/file.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "lxc.h"
#include "log.h"
#include "start.h"
#include "cgroup.h" #include "cgroup.h"
#include "monitor.h"
#include "commands.h" #include "commands.h"
#include "config.h" #include "config.h"
#include "log.h"
#include "lxc.h"
#include "monitor.h"
#include "start.h"
lxc_log_define(lxc_state, lxc); lxc_log_define(lxc_state, lxc);
@ -103,11 +105,12 @@ static int fillwaitedstates(const char *strstates, int *states)
return 0; return 0;
} }
extern int lxc_wait(const char *lxcname, const char *states, int timeout, const char *lxcpath) extern int lxc_wait(const char *lxcname, const char *states, int timeout,
const char *lxcpath)
{ {
struct lxc_msg msg; struct lxc_msg msg;
int state, ret; int state, ret;
int s[MAX_STATE] = { }, fd; int s[MAX_STATE] = {0}, fd;
if (fillwaitedstates(states, s)) if (fillwaitedstates(states, s))
return -1; return -1;
@ -133,16 +136,16 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout, const
} }
for (;;) { for (;;) {
int elapsed_time, curtime = 0; int64_t elapsed_time, curtime = 0;
struct timeval tv; struct timespec tspec;
int stop = 0; int stop = 0;
int retval; int retval;
if (timeout != -1) { if (timeout != -1) {
retval = gettimeofday(&tv, NULL); retval = clock_gettime(CLOCK_REALTIME, &tspec);
if (retval) if (retval)
goto out_close; goto out_close;
curtime = tv.tv_sec; curtime = tspec.tv_sec;
} }
if (lxc_monitor_read_timeout(fd, &msg, timeout) < 0) { if (lxc_monitor_read_timeout(fd, &msg, timeout) < 0) {
/* try again if select interrupted by signal */ /* try again if select interrupted by signal */
@ -151,10 +154,10 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout, const
} }
if (timeout != -1) { if (timeout != -1) {
retval = gettimeofday(&tv, NULL); retval = clock_gettime(CLOCK_REALTIME, &tspec);
if (retval) if (retval)
goto out_close; goto out_close;
elapsed_time = tv.tv_sec - curtime; elapsed_time = tspec.tv_sec - curtime;
if (timeout - elapsed_time <= 0) if (timeout - elapsed_time <= 0)
stop = 1; stop = 1;
timeout -= elapsed_time; timeout -= elapsed_time;
@ -170,11 +173,8 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout, const
switch (msg.type) { switch (msg.type) {
case lxc_msg_state: case lxc_msg_state:
if (msg.value < 0 || msg.value >= MAX_STATE) { if (msg.value < 0 || msg.value >= MAX_STATE)
ERROR("Receive an invalid state number '%d'",
msg.value);
goto out_close; goto out_close;
}
if (s[msg.value]) { if (s[msg.value]) {
ret = 0; ret = 0;