#include <stdio.h>
#include <math.h>
#include <tmp/libpq-fe.h>
#include <tmp/pqthreads.h>

#define N_THREADS 2
#define SLEEP_SECS 3

char *prog_name = "<>";
char *dbName = "";
char *dbHost = "";
char *dbPort = "";
LOCK_T done_lock;
COND_T done_cond;
int n_done = 0;

void *
run_test(void *junk_arg)
{
  int n_groups, n_tuples, n_fields;
  double p, di, f;
  int thread_no = (int)junk_arg;

  printf("thread # %d running [" THREAD_PRINTF_FMT "]\n",  thread_no,
	 THREAD_PRINTF_ARG(pthread_self()));

  PQsetconnection(dbName, dbHost, dbPort);
  PQfinish();

  printf("thread#%d sleeping for %d seconds...\n", SLEEP_SECS, thread_no);
  sleep(SLEEP_SECS);

  printf("thread#%d trying again.\n",thread_no);

  PQsetconnection(dbName, dbHost, dbPort);
  PQfinish();

  printf("thread#%d OK\n", thread_no);
  GET_LOCK(done_lock);
  n_done++;
  REL_LOCK(done_lock);
  SIGNAL_COND(done_cond);

  return (void *)0;
}

main(argc, argv)
     int argc;
     char **argv;
{
  extern char *PQhost, *PQport;
  THREAD_T t1,t2;
  int k_stat;

  INIT_LOCK(done_lock);
  INIT_COND(done_cond);

  PQhost = ((dbHost = getenv("DATABASE_HOST"))? dbHost : (dbHost = "paneer.ndim.edrc.cmu.edu"));
  PQport = ((dbPort = getenv("DATABASE_PORT"))? dbPort : (dbPort = "3740"));

  prog_name = argv[0];

  printf("%s - multiple simultaneous connects to the same database\n\n",
	 prog_name);

  dbName = getenv("DATABASE_NAME");
  if (!dbName)
    dbName = getenv("USER");

  FORK_THREAD(t1, run_test, (void *)1);
  FORK_THREAD(t2, run_test, (void *)2);
  printf("two threads forked.\n");

  while ((k_stat = WAIT_COND(done_cond, done_lock)) == 0) {
    if (n_done == N_THREADS)
      break;
    REL_LOCK(done_lock);
  }
  if (k_stat != 0) {
    perror("WAIT_COND");
    exit(1);
  }
  printf("%s FINISHED\n", prog_name);
  exit(0);
}
