/* Common definition for tst-cancel4_* tests.

   Copyright (C) 2016-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <pthread.h>

#include <support/check.h>
#include <support/xthread.h>
#include <support/xunistd.h>

/* Pipe descriptors.  */
static int fds[2];

/* Temporary file descriptor, to be closed after each round.  */
static int tempfd = -1;
static int tempfd2 = -1;
/* Name of temporary file to be removed after each round.  */
static char *tempfname;
/* Temporary message queue.  */
static int tempmsg = -1;

/* Often used barrier for two threads.  */
static pthread_barrier_t b2;

/* The WRITE_BUFFER_SIZE value needs to be chosen such that if we set
   the socket send buffer size to '1', a write of this size on that
   socket will block.

   The Linux kernel imposes a minimum send socket buffer size which
   has changed over the years.  As of Linux 3.10 the value is:

     2 * (2048 + SKB_DATA_ALIGN(sizeof(struct sk_buff)))

   which is attempting to make sure that with standard MTUs,
   TCP can always queue up at least 2 full sized packets.

   Furthermore, there is logic in the socket send paths that
   will allow one more packet (of any size) to be queued up as
   long as some socket buffer space remains.   Blocking only
   occurs when we try to queue up a new packet and the send
   buffer space has already been fully consumed.

   Therefore we must set this value to the largest possible value of
   the formula above (and since it depends upon the size of "struct
   sk_buff", it is dependent upon machine word size etc.) plus some
   slack space.  */

#define WRITE_BUFFER_SIZE 16384

/* Cleanup handling test.  */
static int cl_called;

static void
cl (void *arg)
{
  ++cl_called;
}

/* Named pipe used to check for blocking open.  It should be closed
   after the cancellation handling.  */
static char fifoname[] = "/tmp/tst-cancel4-fifo-XXXXXX";
static int fifofd;

static void
__attribute__ ((used))
cl_fifo (void *arg)
{
  ++cl_called;

  unlink (fifoname);
  close (fifofd);
  fifofd = -1;
}

struct cancel_tests
{
  const char *name;
  void *(*tf) (void *);
  int nb;
  int only_early;
};
#define ADD_TEST(name, nbar, early) { #name, tf_##name, nbar, early }
