-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmail_driver.c
More file actions
185 lines (148 loc) · 5.67 KB
/
mail_driver.c
File metadata and controls
185 lines (148 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*
mail_driver.c
Mail System Simulator
7-15-2016
Neil McGlohon
*/
//The C driver file for a ROSS model
//This file includes:
// - an initialization function for each LP type
// - a forward event function for each LP type
// - a reverse event function for each LP type
// - a finalization function for each LP type
//Includes
#include "mail.h"
//--------------Mail box stuff-------------
void mailbox_init (mailbox_state *s, tw_lp *lp)
{
// tw_stime core_rng = tw_rand_unif(&lp->rng[g_tw_nRNG_per_lp-1]);
// printf("%d: init core rng = %.5f\n", lp->gid, core_rng);
int self = lp->gid;
// init state data
s->num_letters_recvd = 0;
int i;
for(i = 0; i < LET_PER_MAILBOX; i++)
{
// tw_event *e = tw_event_new(self,tw_rand_exponential(lp->rng, MEAN_MAILBOX_WAIT),lp);
// tw_stime ts = 1;
// tw_stime ts = tw_rand_exponential(lp->rng, MEAN_MAILBOX_WAIT) + lookahead;
tw_stime ts = tw_rand_exponential(lp->rng, MEAN_MAILBOX_WAIT) + 1;
tw_event *e = tw_event_new(self,ts,lp);
letter *let = tw_event_data(e);
let->sender = self;
let->final_dest = self;
tw_event_send(e);
}
}
void mailbox_prerun(mailbox_state *s, tw_lp *lp)
{
int self = lp->gid;
tw_lpid assigned_post_office = get_assigned_post_office_LID(lp->gid);
// printf("%d: I am a mailbox assigned to PO %llu\n",self,assigned_post_office);
}
void mailbox_event_handler(mailbox_state *s, tw_bf *bf, letter *in_msg, tw_lp *lp)
{
int self = lp->gid;
tw_lpid final_dest;
tw_lpid next_dest;
// unsigned int ttl_lps = tw_nnodes() * g_tw_npe * nlp_per_pe;
// dest = tw_rand_integer(lp->rng, 0, ttl_lps - 1);
final_dest = tw_rand_integer(lp->rng, 0, total_mailboxes - 1);
//Next destination from a mailbox is its assigned post office
tw_lpid assigned_post_office = get_assigned_post_office_LID(lp->gid);
next_dest = get_post_office_GID(assigned_post_office);
// // initialize the bit field
// *(int *) bf = (int) 0;
s->num_letters_recvd++;
//schedule a new letter
// tw_event *e = tw_event_new(self,tw_rand_exponential(lp->rng, MEAN_MAILBOX_WAIT),lp);
// tw_stime ts = 1;
// tw_stime ts = tw_rand_exponential(lp->rng, mean) + lookahead + (tw_stime)(lp->gid % (unsigned int)g_tw_ts_end);
// tw_stime ts = tw_rand_exponential(lp->rng, MEAN_MAILBOX_WAIT) + lookahead;
tw_stime ts = tw_rand_exponential(lp->rng, MEAN_MAILBOX_WAIT) + 1;
tw_event *e = tw_event_new(next_dest,ts,lp);
letter *let = tw_event_data(e);
let->sender = self;
let->final_dest = final_dest;
let->next_dest = next_dest;
tw_event_send(e);
s->num_letters_sent++;
}
void mailbox_RC_event_handler(mailbox_state *s, tw_bf *bf, letter *in_msg, tw_lp *lp)
{
tw_rand_reverse_unif(lp->rng);
tw_rand_reverse_unif(lp->rng);
s->num_letters_recvd--;
s->num_letters_sent--;
}
void mailbox_final(mailbox_state *s, tw_lp *lp)
{
int self = lp->gid;
printf("Mailbox %d: S:%d R:%d messages\n", self, s->num_letters_sent, s->num_letters_recvd);
// printf("rng count %d\n",lp->core_rng->count);
// tw_rand_reverse_unif(&lp->rng[g_tw_nRNG_per_lp-1]);
// tw_stime core_rng = tw_rand_unif(&lp->rng[g_tw_nRNG_per_lp-1]);
// printf("%d: final core rng = %.5f\n", lp->gid, core_rng);
}
// void mailbox_commit(state * s, tw_bf * bf, letter * m, tw_lp * lp)
// {
// }
//-------------Post office stuff-------------
void post_office_init (post_office_state *s, tw_lp *lp)
{
int self = lp->gid;
// init state data
s->num_letters_recvd = 0;
}
void post_office_prerun (post_office_state *s, tw_lp *lp)
{
int self = lp->gid;
// printf("%d: I am a post office\n",self);
}
void post_office_event_handler(post_office_state *s, tw_bf *bf, letter *in_msg, tw_lp *lp)
{
int self = lp->gid;
tw_lpid final_dest;
tw_lpid next_dest;
s->num_letters_recvd++;
//Determine: Are you the post office that is to deliver the message or do you need to route it to another one
int assigned_post_office_gid = get_assigned_post_office_GID(in_msg-> final_dest);
if(self == assigned_post_office_gid) //You are the post office to deliver the message
{
final_dest = in_msg -> final_dest;
next_dest = in_msg -> final_dest;
// tw_stime ts = tw_rand_exponential(lp->rng, MEAN_PO_PROCESS_WAIT) + lookahead;
tw_stime ts = tw_rand_exponential(lp->rng, MEAN_PO_PROCESS_WAIT) + 5;
tw_event *e = tw_event_new(next_dest,ts,lp);
letter *let = tw_event_data(e);
let->sender = self;
let->final_dest = final_dest;
let->next_dest = next_dest;
tw_event_send(e);
}
else //You need to route it to another post offifce
{
final_dest = in_msg -> final_dest;
next_dest = assigned_post_office_gid;
// tw_stime ts = tw_rand_exponential(lp->rng, MEAN_PO_PROCESS_WAIT) + lookahead;
tw_stime ts = tw_rand_exponential(lp->rng, MEAN_PO_PROCESS_WAIT) + 5;
tw_event *e = tw_event_new(next_dest,ts,lp);
letter *let = tw_event_data(e);
let->sender = self;
let->final_dest = final_dest;
let->next_dest = next_dest;
tw_event_send(e);
}
s->num_letters_sent++;
}
void post_office_RC_event_handler(post_office_state *s, tw_bf *bf, letter *in_msg, tw_lp *lp)
{
s->num_letters_sent--;
tw_rand_reverse_unif(lp->rng);
s->num_letters_recvd--;
}
void post_office_final(post_office_state *s, tw_lp *lp)
{
int self = lp->gid;
printf("Post Office %d: S:%d R:%d messages\n", self,s->num_letters_sent, s->num_letters_recvd);
}