• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt/router/gdb/sim/testsuite/sim/cris/c/
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
15void err (const char *s)
16{
17  perror (s);
18  abort ();
19}
20
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