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

#include <assert.h>
#include <pthread.h>
#include <stdatomic.h>
#include <stdio.h>
#include <unistd.h>
#include <zircon/syscalls.h>

#include <zxtest/zxtest.h>

static pthread_key_t tsd_key;
static pthread_key_t tsd_key_dtor;
static atomic_int dtor_count = ATOMIC_VAR_INIT(0);

void dtor(void* unused) { atomic_fetch_add(&dtor_count, 1); }

static void test_tls(int thread_no) {
  int value1 = thread_no;
  int value2 = thread_no + 10;
  EXPECT_EQ(pthread_setspecific(tsd_key, &value1), 0, "Error while setting tls value");
  EXPECT_EQ(pthread_setspecific(tsd_key_dtor, &value2), 0, "Error while setting tls value");
  zx_nanosleep(zx_deadline_after(ZX_MSEC(100)));
  int* v = pthread_getspecific(tsd_key);
  EXPECT_EQ(*v, value1, "wrong TLS value for key");
  v = pthread_getspecific(tsd_key_dtor);
  EXPECT_EQ(*v, value2, "wrong TLS value for key_dtor");
  printf("tls_test completed for thread: %d\n", thread_no);
}

static void* do_work(void* arg) {
  printf("do_work for thread: %d\n", *(int*)arg);
  test_tls(*(int*)arg);
  return NULL;
}

TEST(PthreadTls, PthreadTls) {
  ASSERT_EQ(pthread_key_create(&tsd_key, NULL), 0, "Error during key creation");
  ASSERT_EQ(pthread_key_create(&tsd_key_dtor, dtor), 0, "Error during key creation");

  atomic_store(&dtor_count, 0);
  int expected_dtor_count = 0;

  // Run this 20 times for sanity check
  for (int i = 1; i <= 20; i++) {
    int main_thread = 1, thread_1 = i * 2, thread_2 = i * 2 + 1;

    pthread_t thread2, thread3;

    printf("creating thread: %d\n", thread_1);
    pthread_create(&thread2, NULL, do_work, &thread_1);

    printf("creating thread: %d\n", thread_2);
    pthread_create(&thread3, NULL, do_work, &thread_2);

    test_tls(main_thread);

    printf("joining thread: %d\n", thread_1);
    pthread_join(thread2, NULL);

    printf("joining thread: %d\n", thread_2);
    pthread_join(thread3, NULL);

    expected_dtor_count += 2;
    ASSERT_EQ(atomic_load(&dtor_count), expected_dtor_count, "dtors not run");
  }
}
