112855Sgabeblack@google.com//----------------------------------------------------------------------
212855Sgabeblack@google.com//   Copyright 2009 Cadence Design Systems, Inc.
312855Sgabeblack@google.com//   All Rights Reserved Worldwide
412855Sgabeblack@google.com//----------------------------------------------------------------------
512855Sgabeblack@google.com
612855Sgabeblack@google.com#include <systemc.h>
712855Sgabeblack@google.com
812855Sgabeblack@google.comclass my_exception {
912855Sgabeblack@google.compublic:
1012855Sgabeblack@google.com  my_exception(const char* s) : s_(s) { }
1112855Sgabeblack@google.com  const char* message() { return s_.c_str(); }
1212855Sgabeblack@google.comprotected:
1312855Sgabeblack@google.com  std::string s_;
1412855Sgabeblack@google.com};
1512855Sgabeblack@google.com
1612855Sgabeblack@google.comSC_MODULE(top) {
1712855Sgabeblack@google.compublic:
1812855Sgabeblack@google.com  SC_CTOR(top) {
1912855Sgabeblack@google.com    SC_THREAD(victim);
2012855Sgabeblack@google.com    h = sc_get_current_process_handle();
2112855Sgabeblack@google.com    SC_THREAD(perpetrator);
2212855Sgabeblack@google.com  }
2312855Sgabeblack@google.com
2412855Sgabeblack@google.com  void victim() {
2512855Sgabeblack@google.com    try {
2612855Sgabeblack@google.com      cerr << sc_time_stamp() << ": starting victim thread" << endl;
2712855Sgabeblack@google.com      ::sc_core::wait(100, SC_NS);
2812855Sgabeblack@google.com    }
2912855Sgabeblack@google.com    catch (my_exception& x) {
3012855Sgabeblack@google.com      cerr << sc_time_stamp() << ": in victim thread, caught exception "
3112855Sgabeblack@google.com           << x.message() << ", exiting" << endl;
3212855Sgabeblack@google.com      return;
3312855Sgabeblack@google.com    }
3412855Sgabeblack@google.com  }
3512855Sgabeblack@google.com
3612855Sgabeblack@google.com  void perpetrator() {
3712855Sgabeblack@google.com    wait(10, SC_NS);
3812855Sgabeblack@google.com    cerr << sc_time_stamp()
3912855Sgabeblack@google.com         << ": in perpetrator throwing exception in victim "
4012855Sgabeblack@google.com         << endl;
4112855Sgabeblack@google.com    h.throw_it(my_exception("from pepetrator"));
4212855Sgabeblack@google.com    cerr << sc_time_stamp()
4312855Sgabeblack@google.com         << ": in perpetrator after throwing exception in victim "
4412855Sgabeblack@google.com         << endl;
4512855Sgabeblack@google.com  }
4612855Sgabeblack@google.com
4712855Sgabeblack@google.comprotected:
4812855Sgabeblack@google.com  sc_process_handle h;
4912855Sgabeblack@google.com};
5012855Sgabeblack@google.com
5112855Sgabeblack@google.comint sc_main (int argc, char *argv[])
5212855Sgabeblack@google.com{
5312855Sgabeblack@google.com  top t("top");
5412855Sgabeblack@google.com  sc_start();
5512855Sgabeblack@google.com  return 0;
5612855Sgabeblack@google.com}
5712855Sgabeblack@google.com
58