// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build (linux && amd64) || (freebsd && amd64)
// +build linux,amd64 freebsd,amd64

package main

// Test that an external C thread that is calling malloc can be hit
// with SIGCHLD signals. This used to fail when built with the race
// detector, because in that case the signal handler would indirectly
// call the C malloc function.

/*
#include <errno.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sched.h>
#include <unistd.h>

#define ALLOCERS 100
#define SIGNALERS 10

static void* signalThread(void* p) {
	pthread_t* pt = (pthread_t*)(p);
	int i, j;

	for (i = 0; i < 100; i++) {
		for (j = 0; j < ALLOCERS; j++) {
			if (pthread_kill(pt[j], SIGCHLD) < 0) {
				return NULL;
			}
		}
		usleep(1);
	}
	return NULL;
}

#define CALLS 100

static void* mallocThread(void* p) {
	int i;
	void *a[CALLS];

	for (i = 0; i < ALLOCERS; i++) {
		sched_yield();
	}
	for (i = 0; i < CALLS; i++) {
		a[i] = malloc(i);
	}
	for (i = 0; i < CALLS; i++) {
		free(a[i]);
	}
	return NULL;
}

void runRaceSignalThread() {
	int i;
	pthread_t m[ALLOCERS];
	pthread_t s[SIGNALERS];

	for (i = 0; i < ALLOCERS; i++) {
		pthread_create(&m[i], NULL, mallocThread, NULL);
	}
	for (i = 0; i < SIGNALERS; i++) {
		pthread_create(&s[i], NULL, signalThread, &m[0]);
	}
	for (i = 0; i < SIGNALERS; i++) {
		pthread_join(s[i], NULL);
	}
	for (i = 0; i < ALLOCERS; i++) {
		pthread_join(m[i], NULL);
	}
}
*/
import "C"

import (
	"fmt"
	"os"
	"time"
)

func init() {
	register("CgoRaceSignal", CgoRaceSignal)
}

func CgoRaceSignal() {
	// The failure symptom is that the program hangs because of a
	// deadlock in malloc, so set an alarm.
	go func() {
		time.Sleep(5 * time.Second)
		fmt.Println("Hung for 5 seconds")
		os.Exit(1)
	}()

	C.runRaceSignalThread()
	fmt.Println("OK")
}
