/* Check that TRT happens for pipe corner cases (for our definition of TRT). #progos: linux #xerror: #output: Terminating simulation due to writing pipe * from one single thread\n #output: program stopped with signal 4 (*).\n */ #include #include #include #include #include #include #include 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); }