blob: a9dbeec6ca4043b1c86af24411650873bb09891e [file] [log] [blame]
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include "posixtest.h"
/*
* Copyright (c) 2002, Intel Corporation. All rights reserved.
* Created by: rolla.n.selbak REMOVE-THIS AT intel DOT com
* This file is licensed under the GPL license. For the full content
* of this license, see the COPYING file at the top level of this
* source tree.
* Test that the sigwait() function. If no signal in 'set' is pending at the
* time of the call, the thread shall be suspended until one or more becomes
* pending.
* 1) Block a signal from delivery.
* 2) Call sigwait()
* 3) Raise the signal.
* 4) Verify this process will return when the signal is sent.
*/
int main()
{
sigset_t newmask, pendingset;
int sig;
struct timeval tv_ref, tv_cur;
/* Empty set of blocked signals */
if (sigemptyset(&newmask) == -1 || sigemptyset(&pendingset) == -1)
{
printf("Error in sigemptyset()\n");
return PTS_UNRESOLVED;
}
/* Add SIGALRM to the set of blocked signals */
if (sigaddset(&newmask, SIGALRM) == -1)
{
perror("Error in sigaddset()\n");
return PTS_UNRESOLVED;
}
/* Block SIGALRM */
if (sigprocmask(SIG_SETMASK, &newmask, NULL) == -1)
{
printf("Error in sigprocmask()\n");
return PTS_UNRESOLVED;
}
/* Read clock */
if (gettimeofday(&tv_ref, NULL) != 0)
{
printf("Failed to get time of day");
return PTS_UNRESOLVED;
}
/* SIGALRM will be sent in 5 seconds */
alarm(3);
/* Call sigwait. It should wait for 5 seconds and then move
* along the rest of the process when it received the SIGALRM */
if (sigwait(&newmask, &sig) != 0)
{
printf("Error in sigwait()\n");
return PTS_UNRESOLVED;
}
/* Re-read clock */
if (gettimeofday(&tv_cur, NULL) != 0)
{
printf("Failed to get time of day");
return PTS_UNRESOLVED;
}
/* Check the operation was blocking until the signal was generated */
if (tv_cur.tv_sec - tv_ref.tv_sec < 2)
{
printf("The operation lasted less than 3 seconds!\n");
return PTS_FAIL;
}
/* If we get here, then the process was suspended until
* SIGALRM was raised. */
printf("Test PASSED\n");
return PTS_PASS;
}