Blame nptl/tst-cancel4-common.h

Packit Service 82fcde
/* Common definition for tst-cancel4_* tests.
Packit Service 82fcde
Packit Service 82fcde
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <pthread.h>
Packit Service 82fcde
Packit Service 82fcde
#include <support/check.h>
Packit Service 82fcde
#include <support/xthread.h>
Packit Service 82fcde
#include <support/xunistd.h>
Packit Service 82fcde
Packit Service 82fcde
/* Pipe descriptors.  */
Packit Service 82fcde
static int fds[2];
Packit Service 82fcde
Packit Service 82fcde
/* Temporary file descriptor, to be closed after each round.  */
Packit Service 82fcde
static int tempfd = -1;
Packit Service 82fcde
static int tempfd2 = -1;
Packit Service 82fcde
/* Name of temporary file to be removed after each round.  */
Packit Service 82fcde
static char *tempfname;
Packit Service 82fcde
/* Temporary message queue.  */
Packit Service 82fcde
static int tempmsg = -1;
Packit Service 82fcde
Packit Service 82fcde
/* Often used barrier for two threads.  */
Packit Service 82fcde
static pthread_barrier_t b2;
Packit Service 82fcde
Packit Service 82fcde
/* The WRITE_BUFFER_SIZE value needs to be chosen such that if we set
Packit Service 82fcde
   the socket send buffer size to '1', a write of this size on that
Packit Service 82fcde
   socket will block.
Packit Service 82fcde
Packit Service 82fcde
   The Linux kernel imposes a minimum send socket buffer size which
Packit Service 82fcde
   has changed over the years.  As of Linux 3.10 the value is:
Packit Service 82fcde
Packit Service 82fcde
     2 * (2048 + SKB_DATA_ALIGN(sizeof(struct sk_buff)))
Packit Service 82fcde
Packit Service 82fcde
   which is attempting to make sure that with standard MTUs,
Packit Service 82fcde
   TCP can always queue up at least 2 full sized packets.
Packit Service 82fcde
Packit Service 82fcde
   Furthermore, there is logic in the socket send paths that
Packit Service 82fcde
   will allow one more packet (of any size) to be queued up as
Packit Service 82fcde
   long as some socket buffer space remains.   Blocking only
Packit Service 82fcde
   occurs when we try to queue up a new packet and the send
Packit Service 82fcde
   buffer space has already been fully consumed.
Packit Service 82fcde
Packit Service 82fcde
   Therefore we must set this value to the largest possible value of
Packit Service 82fcde
   the formula above (and since it depends upon the size of "struct
Packit Service 82fcde
   sk_buff", it is dependent upon machine word size etc.) plus some
Packit Service 82fcde
   slack space.  */
Packit Service 82fcde
Packit Service 82fcde
#define WRITE_BUFFER_SIZE 16384
Packit Service 82fcde
Packit Service 82fcde
/* Set the send buffer of socket S to 1 byte so any send operation
Packit Service 82fcde
   done with WRITE_BUFFER_SIZE bytes will force syscall blocking.  */
Packit Service 82fcde
static void
Packit Service 82fcde
set_socket_buffer (int s)
Packit Service 82fcde
{
Packit Service 82fcde
  int val = 1;
Packit Service 82fcde
  socklen_t len = sizeof(val);
Packit Service 82fcde
Packit Service 82fcde
  TEST_VERIFY_EXIT (setsockopt (s, SOL_SOCKET, SO_SNDBUF, &val,
Packit Service 82fcde
		    sizeof(val)) == 0);
Packit Service 82fcde
  TEST_VERIFY_EXIT (getsockopt (s, SOL_SOCKET, SO_SNDBUF, &val, &len) == 0);
Packit Service 82fcde
  TEST_VERIFY_EXIT (val < WRITE_BUFFER_SIZE);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Cleanup handling test.  */
Packit Service 82fcde
static int cl_called;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
cl (void *arg)
Packit Service 82fcde
{
Packit Service 82fcde
  ++cl_called;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Named pipe used to check for blocking open.  It should be closed
Packit Service 82fcde
   after the cancellation handling.  */
Packit Service 82fcde
static char fifoname[] = "/tmp/tst-cancel4-fifo-XXXXXX";
Packit Service 82fcde
static int fifofd;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
__attribute__ ((used))
Packit Service 82fcde
cl_fifo (void *arg)
Packit Service 82fcde
{
Packit Service 82fcde
  ++cl_called;
Packit Service 82fcde
Packit Service 82fcde
  unlink (fifoname);
Packit Service 82fcde
  close (fifofd);
Packit Service 82fcde
  fifofd = -1;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
struct cancel_tests
Packit Service 82fcde
{
Packit Service 82fcde
  const char *name;
Packit Service 82fcde
  void *(*tf) (void *);
Packit Service 82fcde
  int nb;
Packit Service 82fcde
  int only_early;
Packit Service 82fcde
};
Packit Service 82fcde
#define ADD_TEST(name, nbar, early) { #name, tf_##name, nbar, early }