Re: [C/R] sleepers don't wake up on restart

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Oren Laadan [orenl@xxxxxxxxxxxxxxx] wrote:
| 
| Suka,
| 
| can you please post the entire test program so I can try to reproduce
| it here ?

Sure. Attached.

Suka
#include <stdio.h>
#include <unistd.h>
#include <wait.h>
#include <errno.h>

#define NUM_PROCS	10
#define CKPT_READY	"ckpt-ready"
#define CKPT_DONE	"ckpt-done"
#define TEST_DONE	"test-done"
#define LOG_FILE	"log.ptree1"

FILE *logfp;

void do_exit(int status)
{
	if (logfp) {
		fflush(logfp);
		fclose(logfp);
	}
	_Exit(status);
}

int test_done()
{
	int rc;

	rc = access(TEST_DONE, F_OK);
	if (rc == 0)
		return 1;
	else if (errno == ENOENT)
		return 0;

	fprintf(logfp, "access(%s) failed, %s\n", TEST_DONE, strerror(errno));
	do_exit(1);
}

int checkpoint_done()
{
	int rc;

	rc = access(CKPT_DONE, F_OK);
	if (rc == 0)
		return 1;
	else if (errno == ENOENT)
		return 0;

	fprintf(logfp, "access(%s) failed, %s\n", CKPT_DONE, strerror(errno));
	do_exit(1);
}

void checkpoint_ready()
{
	int fd;

	fd = creat(CKPT_READY, 0666, 0);
	if (fd < 0) {
		fprintf(logfp, "creat(%s) failed, %s\n", CKPT_READY,
				strerror(errno));
		do_exit(1);
	}
	close(fd);
}

do_child(int cnum)
{
	int i;
	FILE *cfp;
	char cfile[256];

	sprintf(cfile, "child-log-%d", cnum);

	i = 0;
	while (!test_done()) {
		cfp = fopen(cfile, "a");
		if (!cfp) {
			fprintf(logfp, "fopen(%s) failed, error %s\n", cfile,
					strerror(errno));
			do_exit(1);
		}
		fprintf(cfp, "i = %d\n", i++);
		fflush(cfp);
		fclose(cfp);
		sleep(1);
	}

	do_exit(0);
}

print_exit_status(int pid, int status)
{
	fprintf(logfp, "Pid %d unexpected exit - ", pid);
	if (WIFEXITED(status)) {
		fprintf(logfp, "exit status %d\n", WEXITSTATUS(status));
	} else if (WIFSIGNALED(status)) {
		fprintf(logfp, "got signal %d\n", WTERMSIG(status));
	} else {
		fprintf(logfp, "stopped/continued ?\n");
	}
}

main(int argc, char *argv[])
{
	int i;
	int status;
	int pid_list[NUM_PROCS];

	if (test_done()) {
		printf("Remove %s before running test\n", TEST_DONE);
		do_exit(1);
	}

	logfp = fopen(LOG_FILE, "w");
	if (!logfp) {
		fprintf(stderr, "fopen(%s) failed, %s\n", LOG_FILE,
					strerror(errno));
		fflush(stderr);
		do_exit(1);
	}
	close(0);close(1);close(2);

	for (i = 0; i < NUM_PROCS; i++) {
		if ((pid_list[i] = fork()) == 0)
			do_child(i);
	}

	/*
 	 * Now that we closed the special files and created process tree
	 * tell any wrapper scripts, we are ready for checkpoint
	 */
	checkpoint_ready();

	while(!checkpoint_done())
		sleep(1);

	for (i = 0; i < NUM_PROCS; i++) {
		if (waitpid(pid_list[i], &status, 0) < 0) {
			fprintf(logfp, "waitpid(%d) failed, error %s\n",
					pid_list[i], strerror(errno));
		}

		if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
			print_exit_status(pid_list[i], status);	
	}
}
_______________________________________________
Containers mailing list
Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/containers

[Index of Archives]     [Cgroups]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux