recursive_kill_bug.cpp revision 12855:588919e0e4aa
110259SAndrew.Bardsley@arm.com/*****************************************************************************
210259SAndrew.Bardsley@arm.com
310259SAndrew.Bardsley@arm.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
410259SAndrew.Bardsley@arm.com  more contributor license agreements.  See the NOTICE file distributed
510259SAndrew.Bardsley@arm.com  with this work for additional information regarding copyright ownership.
610259SAndrew.Bardsley@arm.com  Accellera licenses this file to you under the Apache License, Version 2.0
710259SAndrew.Bardsley@arm.com  (the "License"); you may not use this file except in compliance with the
810259SAndrew.Bardsley@arm.com  License.  You may obtain a copy of the License at
910259SAndrew.Bardsley@arm.com
1010259SAndrew.Bardsley@arm.com    http://www.apache.org/licenses/LICENSE-2.0
1110259SAndrew.Bardsley@arm.com
1210259SAndrew.Bardsley@arm.com  Unless required by applicable law or agreed to in writing, software
1310259SAndrew.Bardsley@arm.com  distributed under the License is distributed on an "AS IS" BASIS,
1410259SAndrew.Bardsley@arm.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1510259SAndrew.Bardsley@arm.com  implied.  See the License for the specific language governing
1610259SAndrew.Bardsley@arm.com  permissions and limitations under the License.
1710259SAndrew.Bardsley@arm.com
1810259SAndrew.Bardsley@arm.com *****************************************************************************/
1910259SAndrew.Bardsley@arm.com
2010259SAndrew.Bardsley@arm.com// recursive_kill_bug.cpp -- test for
2110259SAndrew.Bardsley@arm.com//
2210259SAndrew.Bardsley@arm.com//  Original Author: John Aynsley, Doulus
2310259SAndrew.Bardsley@arm.com//
2410259SAndrew.Bardsley@arm.com// MODIFICATION LOG - modifiers, enter your name, affiliation, date and
2510259SAndrew.Bardsley@arm.com//
2610259SAndrew.Bardsley@arm.com
2710259SAndrew.Bardsley@arm.com//
2810259SAndrew.Bardsley@arm.com
2910259SAndrew.Bardsley@arm.com#define SC_INCLUDE_DYNAMIC_PROCESSES
3010259SAndrew.Bardsley@arm.com
3110259SAndrew.Bardsley@arm.com#include <systemc>
3210259SAndrew.Bardsley@arm.com
3310259SAndrew.Bardsley@arm.comusing namespace sc_core;
3410259SAndrew.Bardsley@arm.comusing std::cout;
3510259SAndrew.Bardsley@arm.comusing std::endl;
3610259SAndrew.Bardsley@arm.com
3710259SAndrew.Bardsley@arm.comstruct Top: sc_module
3810259SAndrew.Bardsley@arm.com{
3910259SAndrew.Bardsley@arm.com  Top(sc_module_name _name)
4010259SAndrew.Bardsley@arm.com  {
4110259SAndrew.Bardsley@arm.com    SC_THREAD(control);
4210259SAndrew.Bardsley@arm.com
4310259SAndrew.Bardsley@arm.com    SC_METHOD(caller);
4410259SAndrew.Bardsley@arm.com      sensitive << ev;
4510259SAndrew.Bardsley@arm.com      dont_initialize();
4610259SAndrew.Bardsley@arm.com      caller_handle = sc_get_current_process_handle();
4710259SAndrew.Bardsley@arm.com
4810259SAndrew.Bardsley@arm.com    SC_THREAD(target);
4910259SAndrew.Bardsley@arm.com      target_handle = sc_get_current_process_handle();
5010259SAndrew.Bardsley@arm.com
5110259SAndrew.Bardsley@arm.com    count = 0;
5210259SAndrew.Bardsley@arm.com    f0 = f1 = f2 = f3 = f4 = f5 = f6 = f7 = f8 = f9 = 0;
5310259SAndrew.Bardsley@arm.com  }
5410259SAndrew.Bardsley@arm.com
5510259SAndrew.Bardsley@arm.com  struct bomb
5610259SAndrew.Bardsley@arm.com  {
5710259SAndrew.Bardsley@arm.com    sc_process_handle h;
5810259SAndrew.Bardsley@arm.com
5910259SAndrew.Bardsley@arm.com    bomb(sc_process_handle _h)
6010259SAndrew.Bardsley@arm.com    {
6110259SAndrew.Bardsley@arm.com      h = _h;
6210259SAndrew.Bardsley@arm.com    }
6310259SAndrew.Bardsley@arm.com
6410259SAndrew.Bardsley@arm.com    ~bomb()
6510259SAndrew.Bardsley@arm.com    {
6610259SAndrew.Bardsley@arm.com      h.kill();
6710259SAndrew.Bardsley@arm.com    }
6810259SAndrew.Bardsley@arm.com  };
6910259SAndrew.Bardsley@arm.com
7010259SAndrew.Bardsley@arm.com  sc_process_handle caller_handle;
7110259SAndrew.Bardsley@arm.com  sc_process_handle target_handle;
7210259SAndrew.Bardsley@arm.com  int count;
7310259SAndrew.Bardsley@arm.com  int f0, f1, f2, f3, f4, f5, f6, f7, f8, f9;
7410259SAndrew.Bardsley@arm.com  sc_event ev;
7510259SAndrew.Bardsley@arm.com
7610259SAndrew.Bardsley@arm.com  void control()
7710259SAndrew.Bardsley@arm.com  {
7810259SAndrew.Bardsley@arm.com    count = 0;
7910259SAndrew.Bardsley@arm.com    wait(10, SC_NS);
8010259SAndrew.Bardsley@arm.com
8110259SAndrew.Bardsley@arm.com    count = 1;
8210259SAndrew.Bardsley@arm.com    ev.notify();
8310259SAndrew.Bardsley@arm.com  }
8410259SAndrew.Bardsley@arm.com
8510259SAndrew.Bardsley@arm.com  void caller()
8610259SAndrew.Bardsley@arm.com  {
8710259SAndrew.Bardsley@arm.com    f0 = 1;
8810259SAndrew.Bardsley@arm.com    target_handle.kill();
8910259SAndrew.Bardsley@arm.com    sc_assert( false );  // FAILS !!!!!!
9010259SAndrew.Bardsley@arm.com  }
9110259SAndrew.Bardsley@arm.com
9210259SAndrew.Bardsley@arm.com  void target()
9310259SAndrew.Bardsley@arm.com  {
9410259SAndrew.Bardsley@arm.com    bomb local_obj(caller_handle);
9510259SAndrew.Bardsley@arm.com    sc_assert( count == 0 );
9610259SAndrew.Bardsley@arm.com    f1 = 1;
9710259SAndrew.Bardsley@arm.com    try {
9810259SAndrew.Bardsley@arm.com      wait(20, SC_NS);
9910259SAndrew.Bardsley@arm.com    }
10010259SAndrew.Bardsley@arm.com    catch (const sc_unwind_exception& e) {
10110259SAndrew.Bardsley@arm.com      sc_assert( count == 1 );
10210259SAndrew.Bardsley@arm.com      sc_assert( sc_time_stamp() == sc_time(10, SC_NS) );
10310259SAndrew.Bardsley@arm.com      f2 = 1;
10410259SAndrew.Bardsley@arm.com      throw e;
10510259SAndrew.Bardsley@arm.com    }
10610259SAndrew.Bardsley@arm.com  }
10710259SAndrew.Bardsley@arm.com
10810259SAndrew.Bardsley@arm.com  SC_HAS_PROCESS(Top);
10910259SAndrew.Bardsley@arm.com};
11010259SAndrew.Bardsley@arm.com
11110259SAndrew.Bardsley@arm.comint sc_main(int argc, char* argv[])
11210259SAndrew.Bardsley@arm.com{
11310259SAndrew.Bardsley@arm.com  Top top("top");
11410259SAndrew.Bardsley@arm.com
11510259SAndrew.Bardsley@arm.com  sc_start();
11610259SAndrew.Bardsley@arm.com
11710259SAndrew.Bardsley@arm.com  sc_assert( top.f0 );
11810259SAndrew.Bardsley@arm.com  sc_assert( top.f1 );
11910259SAndrew.Bardsley@arm.com  sc_assert( top.f2 );
12010259SAndrew.Bardsley@arm.com
12110259SAndrew.Bardsley@arm.com  cout << endl << "Success" << endl;
12210259SAndrew.Bardsley@arm.com  return 0;
12310259SAndrew.Bardsley@arm.com}
12410259SAndrew.Bardsley@arm.com
12510259SAndrew.Bardsley@arm.com