mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-08 00:16:13 +00:00
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:
commit
aee937d034
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user