Paste number 40932: memcpy + signal handler interaction test case

Index of paste annotations: 3 | 2 | 1

Paste number 40932: memcpy + signal handler interaction test case
Pasted by: slava
When:2 years, 1 month ago
Share:Tweet this! | http://paste.lisp.org/+VL0
Channel:#macdev
Paste contents:
Raw Source | XML | Display As
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <strings.h>
#include <sys/time.h>

void dummy_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{
	/* no-op */
}

void init_signal_handler(void)
{
	struct sigaction profile_sigaction;
	memset(&profile_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&profile_sigaction.sa_mask);
	profile_sigaction.sa_sigaction = dummy_signal_handler;
	profile_sigaction.sa_flags = SA_SIGINFO;
	sigaction(SIGALRM,&profile_sigaction,NULL);
}

void init_interval_timer(void)
{
	struct itimerval timerval;
	timerval.it_interval.tv_sec = 0;
	timerval.it_interval.tv_usec = 10 * 1000;
	timerval.it_value = timerval.it_interval;
	setitimer(ITIMER_REAL,&timerval,NULL);
}

static int N;

int main(int argc, char **argv)
{
	N = 4;

	int *src = calloc(20,N);
	int *dst = calloc(20,N);

	int i;
	for(i = 0; i < N; i++) src[i] = i;

	init_signal_handler();
	init_interval_timer();

	int iterations;

#define MAX_ITERATIONS 100000000

	for(iterations = 0; iterations < MAX_ITERATIONS; iterations++)
	{
		memset(dst,0,N * sizeof(int));
		for(i = 0; i < N; i++)
		{
			if(dst[i] != 0)
			{
				printf("Test failed after %d iterations\n",iterations);
				abort();
			}
		}

		memcpy(dst,src,N * sizeof(int));
		for(i = 0; i < N; i++)
		{
			if(dst[i] != i)
			{
				printf("Test failed after %d iterations\n",iterations);
				abort();
			}
		}
	}

	printf("Tests passed after %d iterations\n",iterations);
}

Annotations for this paste:

Annotation number 3: fix calloc call to not over-allocate
Pasted by: slava
When:2 years, 1 month ago
Share:Tweet this! | http://paste.lisp.org/+VL0#3
Paste contents:
Raw Source | Display As
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <strings.h>
#include <sys/time.h>

void dummy_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{
	/* no-op */
}

void init_signal_handler(void)
{
	struct sigaction profile_sigaction;
	memset(&profile_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&profile_sigaction.sa_mask);
	profile_sigaction.sa_sigaction = dummy_signal_handler;
	profile_sigaction.sa_flags = SA_SIGINFO;
	sigaction(SIGALRM,&profile_sigaction,NULL);
}

void init_interval_timer(void)
{
	struct itimerval timerval;
	timerval.it_interval.tv_sec = 0;
	timerval.it_interval.tv_usec = 10 * 1000;
	timerval.it_value = timerval.it_interval;
	setitimer(ITIMER_REAL,&timerval,NULL);
}

static int N;

int main(int argc, char **argv)
{
	N = 4;

	int *src = calloc(N,sizeof(int));
	int *dst = calloc(N,sizeof(int));

	int i;
	for(i = 0; i < N; i++) src[i] = i;

	init_signal_handler();
	init_interval_timer();

	int iterations;

#define MAX_ITERATIONS 100000000

	for(iterations = 0; iterations < MAX_ITERATIONS; iterations++)
	{
		memset(dst,0,N * sizeof(int));
		for(i = 0; i < N; i++)
		{
			if(dst[i] != 0)
			{
				printf("memset failed after %d iterations\n",iterations);
				int j;
				for(j = 0; j < N; j++)
					printf("%d\n",dst[j]);
				abort();
			}
		}

		memcpy(dst,src,N * sizeof(int));
		for(i = 0; i < N; i++)
		{
			if(dst[i] != i)
			{
				printf("memcpy failed after %d iterations\n",iterations);
				int j;
				for(j = 0; j < N; j++)
					printf("%d\n",dst[j]);
				abort();
			}
		}
	}

	printf("Tests passed after %d iterations\n",iterations);
}

Annotation number 2: results for slava
Pasted by: slyrus
When:2 years, 1 month ago
Share:Tweet this! | http://paste.lisp.org/+VL0#2
Paste contents:
Raw Source | Display As
memcpy failed after 36757157 iterations
0
1
0
3
Abort trap

Annotation number 1: updated test case
Pasted by: slava
When:2 years, 1 month ago
Share:Tweet this! | http://paste.lisp.org/+VL0#1
Paste contents:
Raw Source | Display As
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <strings.h>
#include <sys/time.h>

void dummy_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{
	/* no-op */
}

void init_signal_handler(void)
{
	struct sigaction profile_sigaction;
	memset(&profile_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&profile_sigaction.sa_mask);
	profile_sigaction.sa_sigaction = dummy_signal_handler;
	profile_sigaction.sa_flags = SA_SIGINFO;
	sigaction(SIGALRM,&profile_sigaction,NULL);
}

void init_interval_timer(void)
{
	struct itimerval timerval;
	timerval.it_interval.tv_sec = 0;
	timerval.it_interval.tv_usec = 10 * 1000;
	timerval.it_value = timerval.it_interval;
	setitimer(ITIMER_REAL,&timerval,NULL);
}

static int N;

int main(int argc, char **argv)
{
	N = 4;

	int *src = calloc(20,N);
	int *dst = calloc(20,N);

	int i;
	for(i = 0; i < N; i++) src[i] = i;

	init_signal_handler();
	init_interval_timer();

	int iterations;

#define MAX_ITERATIONS 100000000

	for(iterations = 0; iterations < MAX_ITERATIONS; iterations++)
	{
		memset(dst,0,N * sizeof(int));
		for(i = 0; i < N; i++)
		{
			if(dst[i] != 0)
			{
				printf("memset failed after %d iterations\n",iterations);
				int j;
				for(j = 0; j < N; j++)
					printf("%d\n",dst[j]);
				abort();
			}
		}

		memcpy(dst,src,N * sizeof(int));
		for(i = 0; i < N; i++)
		{
			if(dst[i] != i)
			{
				printf("memcpy failed after %d iterations\n",iterations);
				int j;
				for(j = 0; j < N; j++)
					printf("%d\n",dst[j]);
				abort();
			}
		}
	}

	printf("Tests passed after %d iterations\n",iterations);
}

Colorize as:
Show Line Numbers
Index of paste annotations: 3 | 2 | 1

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.