1 /* Check that TRT happens for pipe corner cases (for our definition of TRT). 2 #notarget: cris*-*-elf 3 #xerror: 4 #output: Terminating simulation due to writing pipe * from one single thread\n 5 #output: program stopped with signal 4 (*).\n 6 */ 7 #include <stddef.h> 8 #include <signal.h> 9 #include <stdlib.h> 10 #include <stdio.h> 11 #include <unistd.h> 12 #include <errno.h> 13 #include <limits.h> 14 err(const char * s)15void err (const char *s) 16 { 17 perror (s); 18 abort (); 19 } 20 main(void)21int main (void) 22 { 23 int pip[2]; 24 int pipemax; 25 char *buf; 26 27 if (pipe (pip) != 0) 28 err ("pipe"); 29 30 #ifdef PIPE_MAX 31 pipemax = PIPE_MAX; 32 #else 33 pipemax = fpathconf (pip[1], _PC_PIPE_BUF); 34 #endif 35 36 if (pipemax <= 0) 37 { 38 fprintf (stderr, "Bad pipemax %d\n", pipemax); 39 abort (); 40 } 41 42 /* Writing an inordinate amount to the pipe. */ 43 buf = calloc (100 * pipemax, 1); 44 if (buf == NULL) 45 err ("calloc"); 46 47 /* The following doesn't trig on host; writing more than PIPE_MAX to a 48 pipe with no reader makes the program hang. Neither does it trig 49 on target: we don't want to emulate the "hanging" (which would 50 happen with *any* amount written to a pipe with no reader if we'd 51 support it - but we don't). Better to abort the simulation with a 52 suitable message. */ 53 if (write (pip[1], buf, 100 * pipemax) != -1 54 || errno != EFBIG) 55 err ("write mucho"); 56 57 printf ("pass\n"); 58 exit (0); 59 } 60