00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WEEVIL_WEEVIL_H
00023 #define WEEVIL_WEEVIL_H
00024
00025 #include <iostream>
00026 #include <map>
00027 #include <set>
00028 #include <siena/ssim.h>
00029 #include <siena/tprocess.h>
00030 #include <string>
00031
00035 namespace weevil
00036 {
00040 class WeevilGen : public ssim::Sim
00041 {
00042 static std::map<std::string,ssim::ProcessId> m_id2pid;
00043 static std::map<ssim::ProcessId,std::string> m_pid2id;
00044
00045 public:
00046
00047
00048 static void add_process( const std::string& id, ssim::ProcessId pid )
00049 {
00050 m_id2pid.insert( make_pair( id, pid ) );
00051 m_pid2id.insert( make_pair( pid, id ) );
00052 }
00053
00056 static void broadcast_event( const ssim::Event* event, ssim::Time lag = 0 );
00057
00058
00059
00060
00061 static ssim::ProcessId id2pid( const std::string& id );
00062
00063
00064
00065
00066 static const std::string& pid2id( ssim::ProcessId pid );
00067
00070 static void self_signal_event( const ssim::Event* event, ssim::Time lag = 0 );
00071
00074 static void signal_event( const std::string& id, const ssim::Event* event, ssim::Time lag = 0 );
00075 };
00076
00081 class WeevilActor
00082 {
00083 std::string m_id;
00084 ssim::ProcessId m_pid;
00085
00086 public:
00087
00088
00089 void id( const std::string& id )
00090 { m_id = id; }
00091
00092
00093
00094 const std::string& id() const
00095 { return m_id; }
00096
00097
00098
00099 void pid( ssim::ProcessId pid )
00100 { m_pid = pid; }
00101
00102
00103
00104 ssim::ProcessId pid() const
00105 { return m_pid; }
00106
00109 void workload_output( const char* msg, const char* condition, const char* variable ) const
00110 { std::cout << "event(" << ssim::Sim::clock() << "," << m_id << "," << msg << "," << condition << "," << variable << ")" << std::endl; }
00111 };
00112
00116 class WeevilProcess : public ssim::Process, public weevil::WeevilActor
00117 {
00118 public:
00119
00120
00121 WeevilProcess() : Process() {}
00122 };
00123
00127 class WeevilTProcess : public ssim::TProcess, public weevil::WeevilActor
00128 {
00129 public:
00130
00131
00132 WeevilTProcess() : TProcess() {}
00133
00136 static const ssim::Event * wait_for_event(ssim::Time timeout = ssim::INIT_TIME)
00137 {
00138 return ssim::TProcess::wait_for_event(timeout);
00139 }
00140 };
00141
00145 class KillerProcess : public ssim::Process
00146 {
00147 private:
00148 unsigned int m_delay;
00149 public:
00150 KillerProcess( unsigned int delay )
00151 : m_delay( delay ) {}
00152
00153 void init()
00154 {
00155 ssim::Sim::set_stop_time( m_delay );
00156 }
00157 };
00158 };
00159
00160 #endif