URL
https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk
Subversion Repositories openrisc_me
[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.1/] [sim/] [testsuite/] [sim/] [cris/] [c/] [pipe5.c] - Rev 227
Compare with Previous | Blame | View Log
/* Check that TRT happens for pipe corner cases (for our definition of TRT). #notarget: cris*-*-elf #xerror: #output: Terminating simulation due to writing pipe * from one single thread\n #output: program stopped with signal 4.\n */ #include <stddef.h> #include <signal.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <limits.h> void err (const char *s) { perror (s); abort (); } int main (void) { int pip[2]; int pipemax; char *buf; if (pipe (pip) != 0) err ("pipe"); #ifdef PIPE_MAX pipemax = PIPE_MAX; #else pipemax = fpathconf (pip[1], _PC_PIPE_BUF); #endif if (pipemax <= 0) { fprintf (stderr, "Bad pipemax %d\n", pipemax); abort (); } /* Writing an inordinate amount to the pipe. */ buf = calloc (100 * pipemax, 1); if (buf == NULL) err ("calloc"); /* The following doesn't trig on host; writing more than PIPE_MAX to a pipe with no reader makes the program hang. Neither does it trig on target: we don't want to emulate the "hanging" (which would happen with *any* amount written to a pipe with no reader if we'd support it - but we don't). Better to abort the simulation with a suitable message. */ if (write (pip[1], buf, 100 * pipemax) != -1 || errno != EFBIG) err ("write mucho"); printf ("pass\n"); exit (0); }