/*
 *  Copyright (C) 2004 Aleksandar Colovic
 *
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 */

#include <pthread.h>
#include <iostream>
#include <unistd.h>

using namespace std;

class T
{
public:
  T(const char* pstrThread): m_strThread(pstrThread) {}
  ~T() {cout << m_strThread << " : destructor called!" << endl;}
private:
  string m_strThread;
};

void* doWork(void* pArg)
{
  T t("First thread");
  pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0);
  sleep(10);
  return 0;
}

void* doWork2(void* pArg)
{
  T t("Second thread");
  pthread_exit(0);
  return 0;
}

void* doWork3(void* pArg)
{	
  try
  {
    T t("Third thread");
    pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0);
    sleep(10);
  }
  catch(...)
  {
    cout << "Exception handler called!" << endl;
    throw;
  }
  return 0;
}

int main(int argc, char* const argv[])
{
  pthread_t hThread1;
  pthread_create(&hThread1, 0, &doWork, 0);
  pthread_cancel(hThread1);
  pthread_join(hThread1, 0);
  
  pthread_t hThread2;
  pthread_create(&hThread2, 0, &doWork2, 0);
  pthread_join(hThread2, 0);
  
  pthread_t hThread3;
  pthread_create(&hThread3, 0, &doWork3, 0);
  pthread_cancel(hThread3);
  pthread_join(hThread3, 0);
  
  return 0;
};

