00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#ifndef WEEVIL_WEEVIL_H
00027
#define WEEVIL_WEEVIL_H
00028
00029
#include <iostream>
00030
#include <map>
00031
#include <set>
00032
#include <siena/ssim.h>
00033
#include <siena/tprocess.h>
00034
#include <string>
00035
00039 namespace weevil
00040 {
00044 class WeevilGen :
public ssim::Sim
00045 {
00046
static std::map<std::string,ssim::ProcessId> m_id2pid;
00047
static std::map<ssim::ProcessId,std::string> m_pid2id;
00048
00049
public:
00050
00051
00052
static void add_process(
const std::string&
id, ssim::ProcessId pid )
00053 {
00054 m_id2pid.insert( make_pair(
id, pid ) );
00055 m_pid2id.insert( make_pair( pid,
id ) );
00056 }
00057
00060
static void broadcast_event(
const ssim::Event* event, ssim::Time lag = 0 );
00061
00062
00063
00064
00065
static ssim::ProcessId id2pid(
const std::string&
id );
00066
00067
00068
00069
00070
static const std::string& pid2id( ssim::ProcessId pid );
00071
00074
static void self_signal_event(
const ssim::Event* event, ssim::Time lag = 0 );
00075
00078
static void signal_event(
const std::string&
id,
const ssim::Event* event, ssim::Time lag = 0 );
00079 };
00080
00085 class WeevilActor
00086 {
00087 std::string m_id;
00088 ssim::ProcessId m_pid;
00089
00090
public:
00091
00092
00093
void id(
const std::string&
id )
00094 { m_id =
id; }
00095
00096
00097
00098
const std::string& id()
const
00099
{
return m_id; }
00100
00101
00102
00103
void pid( ssim::ProcessId pid )
00104 { m_pid = pid; }
00105
00106
00107
00108 ssim::ProcessId pid()
const
00109
{
return m_pid; }
00110
00113 void workload_output(
const char* body )
const
00114
{ std::cout <<
"event(" << ssim::Sim::clock() <<
"," << m_id <<
"," << body <<
")" << std::endl; }
00115 };
00116
00120 class WeevilProcess :
public ssim::Process,
public weevil::
WeevilActor
00121 {
00122
public:
00123
00124
00125
WeevilProcess() : Process() {}
00126 };
00127
00131 class WeevilTProcess :
public ssim::TProcess,
public weevil::
WeevilActor
00132 {
00133
public:
00134
00135
00136
WeevilTProcess() : TProcess() {}
00137
00140 static const ssim::Event *
wait_for_event(ssim::Time timeout = ssim::INIT_TIME)
00141 {
00142
return ssim::TProcess::wait_for_event(timeout);
00143 }
00144 };
00145
00149 class KillerProcess :
public ssim::Process
00150 {
00151
private:
00152
unsigned int m_delay;
00153
public:
00154
KillerProcess(
unsigned int delay )
00155 : m_delay( delay ) {}
00156
00157
void init()
00158 {
00159 ssim::Sim::set_stop_time( m_delay );
00160 }
00161 };
00162 };
00163
00164
#endif