Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Xin Wang
codes-dev
Commits
642d84d5
Commit
642d84d5
authored
May 13, 2016
by
Misbah Mubarak
Browse files
Merging slimfly with codes master
parents
db56bd38
a2f3680b
Changes
13
Expand all
Hide whitespace changes
Inline
Side-by-side
codes/model-net-lp.h
View file @
642d84d5
...
...
@@ -22,6 +22,7 @@ extern "C" {
#include
"model-net.h"
#include
"model-net-sched.h"
#include
"net/dragonfly.h"
#include
"net/slimfly.h"
#include
"net/loggp.h"
#include
"net/simplenet-upd.h"
#include
"net/simplep2p.h"
...
...
@@ -120,12 +121,13 @@ typedef struct model_net_base_msg {
typedef
struct
model_net_wrap_msg
{
msg_header
h
;
union
{
model_net_base_msg
m_base
;
// base lp
terminal_message
m_dfly
;
// dragonfly
loggp_message
m_loggp
;
// loggp
sn_message
m_snet
;
// simplenet
sp_message
m_sp2p
;
// simplep2p
nodes_message
m_torus
;
// torus
model_net_base_msg
m_base
;
// base lp
terminal_message
m_dfly
;
// dragonfly
slim_terminal_message
m_slim
;
// slimfly
loggp_message
m_loggp
;
// loggp
sn_message
m_snet
;
// simplenet
sp_message
m_sp2p
;
// simplep2p
nodes_message
m_torus
;
// torus
// add new ones here
}
msg
;
}
model_net_wrap_msg
;
...
...
codes/model-net.h
View file @
642d84d5
...
...
@@ -60,6 +60,7 @@ typedef struct mn_stats mn_stats;
X(SIMPLENET, "modelnet_simplenet", "simplenet", &simplenet_method)\
X(SIMPLEP2P, "modelnet_simplep2p", "simplep2p", &simplep2p_method)\
X(TORUS, "modelnet_torus", "torus", &torus_method)\
X(SLIMFLY, "modelnet_slimfly", "slimfly", &slimfly_method)\
X(DRAGONFLY, "modelnet_dragonfly", "dragonfly", &dragonfly_method)\
X(DRAGONFLY_ROUTER, "modelnet_dragonfly_router", "dragonfly_router", &dragonfly_router_method)\
X(LOGGP, "modelnet_loggp", "loggp", &loggp_method)\
...
...
codes/net/slimfly.h
0 → 100644
View file @
642d84d5
/*
* Copyright (C) 2014 University of Chicago.
* See COPYRIGHT notice in top-level directory.
*
*/
#ifndef SLIMFLY_H
#define SLIMFLY_H
#include
<ross.h>
typedef
struct
slim_terminal_message
slim_terminal_message
;
/* this message is used for both dragonfly compute nodes and routers */
struct
slim_terminal_message
{
/* magic number */
int
magic
;
/* flit travel start time*/
tw_stime
travel_start_time
;
/* packet ID of the flit */
unsigned
long
long
packet_ID
;
/* event type of the flit */
short
type
;
/* category: comes from codes */
char
category
[
CATEGORY_NAME_MAX
];
/* final destination LP ID, this comes from codes can be a server or any other LP type*/
tw_lpid
final_dest_gid
;
/*sending LP ID from CODES, can be a server or any other LP type */
tw_lpid
sender_lp
;
tw_lpid
sender_mn_lp
;
// source modelnet id
/* destination terminal ID of the dragonfly */
tw_lpid
dest_terminal_id
;
/* source terminal ID of the dragonfly */
unsigned
int
src_terminal_id
;
/* local LP ID to calculate the radix of the sender node/router */
unsigned
int
local_id
;
/* message originating router id */
unsigned
int
origin_router_id
;
/* number of hops traversed by the packet */
short
my_N_hop
;
short
my_l_hop
,
my_g_hop
;
short
saved_channel
;
/* Intermediate LP ID from which this message is coming */
unsigned
int
intm_lp_id
;
short
new_vc
;
short
saved_vc
;
/* last hop of the message, can be a terminal, local router or global router */
short
last_hop
;
/* For routing */
int
intm_group_id
;
int
intm_router_id
;
int
chunk_id
;
uint64_t
packet_size
;
uint64_t
message_id
;
uint64_t
total_size
;
int
saved_remote_esize
;
int
remote_event_size_bytes
;
int
local_event_size_bytes
;
// For buffer message
short
vc_index
;
int
sender_radix
;
int
output_chan
;
model_net_event_return
event_rc
;
int
is_pull
;
uint64_t
pull_size
;
/* for reverse computation */
short
path_type
;
tw_stime
saved_available_time
;
tw_stime
saved_avg_time
;
tw_stime
saved_credit_time
;
tw_stime
saved_collective_init_time
;
tw_stime
saved_hist_start_time
;
tw_stime
msg_start_time
;
short
saved_completed_chunks
;
int
saved_hist_num
;
int
saved_occupancy
;
/* for reverse computation of a node's fan in*/
int
saved_fan_nodes
;
tw_lpid
sender_svr
;
/* LP ID of the sending node, has to be a network node in the dragonfly */
tw_lpid
sender_node
;
tw_lpid
next_stop
;
struct
sfly_qhash_entry
*
saved_hash
;
};
#endif
/* end of include guard: DRAGONFLY_H */
/*
* Local variables:
* c-indent-level: 4
* c-basic-offset: 4
* End:
*
* vim: ft=c ts=8 sts=4 sw=4 expandtab
*/
src/Makefile.subdir
View file @
642d84d5
...
...
@@ -80,6 +80,7 @@ nobase_include_HEADERS = \
codes/model-net-sched.h
\
codes/model-net-inspect.h
\
codes/net/dragonfly.h
\
codes/net/slimfly.h
\
codes/net/loggp.h
\
codes/net/simplenet-upd.h
\
codes/net/simplep2p.h
\
...
...
@@ -139,6 +140,7 @@ src_libcodes_a_SOURCES = \
src/networks/model-net/simplenet-upd.c
\
src/networks/model-net/torus.c
\
src/networks/model-net/dragonfly.c
\
src/networks/model-net/slimfly.c
\
src/networks/model-net/loggp.c
\
src/networks/model-net/simplep2p.c
\
src/networks/model-net/model-net-lp.c
\
...
...
@@ -148,6 +150,7 @@ src_libcodes_a_SOURCES = \
src/network-workloads/model-net-mpi-wrklds.c
\
src/network-workloads/model-net-mpi-replay.c
\
src/network-workloads/model-net-synthetic.c
\
src/network-workloads/model-net-synthetic-slimfly.c
\
src/network-workloads/model-net-dumpi-traces-dump.c
...
...
@@ -169,6 +172,7 @@ bin_PROGRAMS += src/network-workloads/model-net-mpi-replay
bin_PROGRAMS
+=
src/network-workloads/model-net-mpi-wrklds
bin_PROGRAMS
+=
src/network-workloads/model-net-dumpi-traces-dump
bin_PROGRAMS
+=
src/network-workloads/model-net-synthetic
bin_PROGRAMS
+=
src/network-workloads/model-net-synthetic-slimfly
src_workload_codes_workload_dump_SOURCES
=
\
...
...
@@ -178,6 +182,7 @@ src_network_workloads_model_net_mpi_replay_SOURCES = src/network-workloads/model
src_network_workloads_model_net_mpi_wrklds_SOURCES
=
src/network-workloads/model-net-mpi-wrklds.c
src_network_workloads_model_net_synthetic_SOURCES
=
src/network-workloads/model-net-synthetic.c
src_network_workloads_model_net_synthetic_slimfly_SOURCES
=
src/network-workloads/model-net-synthetic-slimfly.c
src_network_workloads_model_net_dumpi_traces_dump_SOURCES
=
src/network-workloads/model-net-dumpi-traces-dump.c
#bin_PROGRAMS += src/network-workload/codes-nw-test
...
...
src/network-workloads/conf/modelnet-synthetic-slimfly-min.conf
0 → 100644
View file @
642d84d5
LPGROUPS
{
MODELNET_GRP
{
repetitions
=
"50"
;
server
=
"3"
;
modelnet_slimfly
=
"3"
;
slimfly_router
=
"1"
;
}
}
PARAMS
{
packet_size
=
"256"
;
modelnet_order
=(
"slimfly"
);
# scheduler options
modelnet_scheduler
=
"fcfs"
;
chunk_size
=
"256"
;
# modelnet_scheduler="round-robin";
num_vcs
=
"4"
;
num_routers
=
"5"
;
num_terminals
=
"3"
;
global_channels
=
"5"
;
local_channels
=
"2"
;
generator_set_X
=(
"1"
,
"4"
);
# : Subgraph 0 generator set
generator_set_X_prime
=(
"2"
,
"3"
);
# : Subgraph 1 generator set
local_vc_size
=
"25600"
;
global_vc_size
=
"25600"
;
cn_vc_size
=
"25600"
;
local_bandwidth
=
"9.0"
;
global_bandwidth
=
"9.0"
;
cn_bandwidth
=
"9.0"
;
router_delay
=
"0"
;
link_delay
=
"0"
;
message_size
=
"512"
;
routing
=
"minimal"
;
}
src/network-workloads/model-net-synthetic-slimfly.c
0 → 100644
View file @
642d84d5
/*
* Copyright (C) 2015 University of Chicago.
* See COPYRIGHT notice in top-level directory.
*
*/
/*
* The test program generates some synthetic traffic patterns for the model-net network models.
* currently it only support the dragonfly network model uniform random and nearest neighbor traffic patterns.
*/
#include
"codes/model-net.h"
#include
"codes/lp-io.h"
#include
"codes/codes.h"
#include
"codes/codes_mapping.h"
#include
"codes/configuration.h"
#include
"codes/lp-type-lookup.h"
#define PAYLOAD_SZ 256
#define LP_CONFIG_NM (model_net_lp_config_names[SLIMFLY])
#define PRINT_WORST_CASE_MATCH 0
#define PARAMS_LOG 1
FILE
*
slimfly_results_log_2
=
NULL
;
FILE
*
slimfly_ross_csv_log
=
NULL
;
static
int
net_id
=
0
;
static
int
num_routers
=
0
;
static
int
num_servers
=
0
;
static
int
offset
=
2
;
static
int
traffic
=
1
;
static
double
arrival_time
=
1000
.
0
;
static
double
load
=
0
.
0
;
//percent utilization of each terminal's uplink when sending messages
static
double
MEAN_INTERVAL
=
0
.
0
;
int
this_packet_size
=
0
;
double
this_global_bandwidth
=
0
.
0
;
double
this_link_delay
=
0
;
int
*
worst_dest
;
//Array mapping worst case destination for each router
int
num_terminals
;
int
total_routers
;
/* whether to pull instead of push */
static
int
do_pull
=
0
;
static
int
num_servers_per_rep
=
0
;
static
int
num_routers_per_grp
=
0
;
static
int
num_nodes_per_grp
=
0
;
static
int
num_reps
=
0
;
static
int
num_groups
=
0
;
static
int
num_nodes
=
0
;
typedef
struct
svr_msg
svr_msg
;
typedef
struct
svr_state
svr_state
;
/* global variables for codes mapping */
static
char
group_name
[
MAX_NAME_LENGTH
];
static
char
lp_type_name
[
MAX_NAME_LENGTH
];
static
int
group_index
,
lp_type_index
,
rep_id
,
offset
;
/* type of events */
enum
svr_event
{
KICKOFF
,
/* kickoff event */
REMOTE
,
/* remote event */
LOCAL
/* local event */
};
/* type of synthetic traffic */
enum
TRAFFIC
{
UNIFORM
=
1
,
/* sends message to a randomly selected node */
WORST_CASE
=
2
,
NEAREST_GROUP
=
3
,
/* sends message to the node connected to the neighboring router */
NEAREST_NEIGHBOR
=
4
/* sends message to the next node (potentially connected to the same router) */
};
struct
svr_state
{
int
msg_sent_count
;
/* requests sent */
int
msg_recvd_count
;
/* requests recvd */
int
local_recvd_count
;
/* number of local messages received */
tw_stime
start_ts
;
/* time that we started sending requests */
tw_stime
end_ts
;
/* time that we ended sending requests */
};
struct
svr_msg
{
enum
svr_event
svr_event_type
;
tw_lpid
src
;
/* source of this request or ack */
int
incremented_flag
;
/* helper for reverse computation */
};
static
void
svr_init
(
svr_state
*
ns
,
tw_lp
*
lp
);
static
void
svr_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
);
static
void
svr_rev_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
);
static
void
svr_finalize
(
svr_state
*
ns
,
tw_lp
*
lp
);
tw_lptype
svr_lp
=
{
(
init_f
)
svr_init
,
(
pre_run_f
)
NULL
,
(
event_f
)
svr_event
,
(
revent_f
)
svr_rev_event
,
(
final_f
)
svr_finalize
,
(
map_f
)
codes_mapping
,
sizeof
(
svr_state
),
};
const
tw_optdef
app_opt
[]
=
{
TWOPT_GROUP
(
"Model net synthetic traffic "
),
TWOPT_UINT
(
"traffic"
,
traffic
,
"UNIFORM RANDOM=1, NEAREST NEIGHBOR=2 "
),
TWOPT_STIME
(
"arrival_time"
,
arrival_time
,
"INTER-ARRIVAL TIME"
),
TWOPT_STIME
(
"load"
,
load
,
"percentage of packet inter-arrival rate to simulate"
),
TWOPT_END
()
};
const
tw_lptype
*
svr_get_lp_type
()
{
return
(
&
svr_lp
);
}
static
void
svr_add_lp_type
()
{
lp_type_register
(
"server"
,
svr_get_lp_type
());
}
/* convert GiB/s and bytes to ns */
static
tw_stime
bytes_to_ns
(
uint64_t
bytes
,
double
GB_p_s
)
{
tw_stime
time
;
/* bytes to GB */
time
=
((
double
)
bytes
)
/
(
1024
.
0
*
1024
.
0
*
1024
.
0
);
/* MB to s */
time
=
time
/
GB_p_s
;
/* s to ns */
time
=
time
*
1000
.
0
*
1000
.
0
*
1000
.
0
;
return
(
time
);
}
/** Latest implementation of function to return an array mapping each router with it's corresponding worst-case router pair
* @param[in/out] *worst_dest Router ID to send all messages to
*/
void
init_worst_case_mapping
(
int
*
worst_dest
)
{
int
i
,
j
,
k
;
int
r1
,
r2
;
//Routers to be paired
for
(
k
=
0
;
k
<
2
;
k
++
)
{
for
(
j
=
0
;
j
<
num_routers_per_grp
-
1
;
j
+=
2
)
{
for
(
i
=
0
;
i
<
num_routers_per_grp
;
i
++
)
{
r1
=
i
+
j
*
num_routers_per_grp
+
k
*
num_routers_per_grp
*
num_routers_per_grp
;
r2
=
i
+
(
j
+
1
)
*
num_routers_per_grp
+
k
*
num_routers_per_grp
*
num_routers_per_grp
;
worst_dest
[
r1
]
=
r2
;
worst_dest
[
r2
]
=
r1
;
// printf("%d->%d, %d->%d\n",r1,worst_dest[r1],r2,worst_dest[r2]);
}
}
}
j
=
num_routers_per_grp
-
1
;
for
(
i
=
0
;
i
<
num_routers_per_grp
;
i
++
)
{
r1
=
i
+
j
*
num_routers_per_grp
+
0
*
num_routers_per_grp
*
num_routers_per_grp
;
r2
=
i
+
j
*
num_routers_per_grp
+
1
*
num_routers_per_grp
*
num_routers_per_grp
;
worst_dest
[
r1
]
=
r2
;
worst_dest
[
r2
]
=
r1
;
// printf("%d->%d, %d->%d\n",r1,worst_dest[r1],r2,worst_dest[r2]);
}
}
static
void
issue_event
(
svr_state
*
ns
,
tw_lp
*
lp
)
{
tw_event
*
e
;
svr_msg
*
m
;
tw_stime
kickoff_time
;
/* each server sends a dummy event to itself that will kick off the real
* simulation
*/
const
char
*
anno
;
configuration_get_value_int
(
&
config
,
"PARAMS"
,
"packet_size"
,
NULL
,
&
this_packet_size
);
if
(
!
this_packet_size
)
{
this_packet_size
=
0
;
fprintf
(
stderr
,
"Packet size not specified, setting to %d
\n
"
,
this_packet_size
);
exit
(
0
);
}
configuration_get_value_double
(
&
config
,
"PARAMS"
,
"global_bandwidth"
,
NULL
,
&
this_global_bandwidth
);
if
(
!
this_global_bandwidth
)
{
this_global_bandwidth
=
4
.
7
;
fprintf
(
stderr
,
"Bandwidth of global channels not specified, setting to %lf
\n
"
,
this_global_bandwidth
);
}
/* configuration_get_value_double(&config, "PARAMS", "link_delay", anno, &this_link_delay);
if(!this_link_delay) {
this_link_delay = 0;
fprintf(stderr, "Link Delay not specified, setting to %lf\n", this_link_delay);
}
*/
if
(
arrival_time
!=
0
)
{
MEAN_INTERVAL
=
arrival_time
;
}
if
(
load
!=
0
)
{
MEAN_INTERVAL
=
bytes_to_ns
(
this_packet_size
,
load
*
this_global_bandwidth
)
+
this_link_delay
;
}
/* skew each kickoff event slightly to help avoid event ties later on */
kickoff_time
=
g_tw_lookahead
+
MEAN_INTERVAL
+
tw_rand_exponential
(
lp
->
rng
,
(
double
)
MEAN_INTERVAL
/
100
);
e
=
tw_event_new
(
lp
->
gid
,
kickoff_time
,
lp
);
m
=
tw_event_data
(
e
);
m
->
svr_event_type
=
KICKOFF
;
tw_event_send
(
e
);
}
static
void
svr_init
(
svr_state
*
ns
,
tw_lp
*
lp
)
{
issue_event
(
ns
,
lp
);
return
;
}
static
void
handle_kickoff_rev_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
)
{
ns
->
msg_sent_count
--
;
model_net_event_rc
(
net_id
,
lp
,
PAYLOAD_SZ
);
}
static
void
handle_kickoff_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
)
{
char
anno
[
MAX_NAME_LENGTH
];
tw_lpid
local_dest
=
-
1
,
global_dest
=
-
1
;
svr_msg
*
m_local
=
malloc
(
sizeof
(
svr_msg
));
svr_msg
*
m_remote
=
malloc
(
sizeof
(
svr_msg
));
m_local
->
svr_event_type
=
LOCAL
;
m_local
->
src
=
lp
->
gid
;
memcpy
(
m_remote
,
m_local
,
sizeof
(
svr_msg
));
m_remote
->
svr_event_type
=
REMOTE
;
assert
(
net_id
==
SLIMFLY
);
/* only supported for dragonfly model right now. */
ns
->
start_ts
=
tw_now
(
lp
);
// codes_mapping_get_lp_info(lp->gid, group_name, &group_index, lp_type_name, &lp_type_index, anno, &rep_id, &offset);
codes_mapping_get_lp_info
(
lp
->
gid
,
group_name
,
&
group_index
,
lp_type_name
,
&
lp_type_index
,
anno
,
&
rep_id
,
&
offset
);
/* in case of uniform random traffic, send to a random destination. */
if
(
traffic
==
UNIFORM
)
{
local_dest
=
tw_rand_integer
(
lp
->
rng
,
0
,
num_nodes
-
1
);
// printf("\n LP %ld sending to %d ", lp->gid, local_dest);
}
else
if
(
traffic
==
WORST_CASE
)
{
// Assign the global router ID
// TODO: be annotation-aware
int
num_lps
=
codes_mapping_get_lp_count
(
group_name
,
1
,
LP_CONFIG_NM
,
anno
,
0
);
int
src_terminal_id
=
(
rep_id
*
num_lps
)
+
offset
;
// s->router_id=(int)s->terminal_id / (s->params->num_routers/2);
int
src_router_id
=
src_terminal_id
/
(
num_lps
);
int
dst_router_id
=
worst_dest
[
src_router_id
];
// dst_lp = tw_rand_integer(lp->rng, total_routers + num_terminals*dst_router_id, total_routers + num_terminals*(dst_router_id+1)-1);
// local_dest = total_routers + num_terminals*dst_router_id + (src_terminal_id % num_terminals);
local_dest
=
num_lps
*
dst_router_id
+
(
src_terminal_id
%
num_terminals
);
// printf("packet path initialized. src_term:%d src_router:%d dest_router:%d dest_term:%d\n",src_terminal_id, src_router_id, dst_router_id, (int)local_dest);
}
else
if
(
traffic
==
NEAREST_GROUP
)
{
local_dest
=
(
rep_id
*
2
+
offset
+
num_nodes_per_grp
)
%
num_nodes
;
// printf("\n LP %ld sending to %ld num nodes %d ", rep_id * 2 + offset, local_dest, num_nodes);
}
else
if
(
traffic
==
NEAREST_NEIGHBOR
)
{
local_dest
=
(
rep_id
*
2
+
offset
+
2
)
%
num_nodes
;
// printf("\n LP %ld sending to %ld num nodes %d ", rep_id * 2 + offset, local_dest, num_nodes);
}
//printf("1local_dest:%d global_dest:%d num_nodes:%d\n", local_dest, global_dest, num_nodes);
assert
(
local_dest
<
num_nodes
);
codes_mapping_get_lp_id
(
group_name
,
lp_type_name
,
anno
,
1
,
local_dest
/
num_servers_per_rep
,
local_dest
%
num_servers_per_rep
,
&
global_dest
);
//printf("2local_dest:%d global_dest:%d num_nodes:%d\n", local_dest, global_dest, num_nodes);
ns
->
msg_sent_count
++
;
model_net_event
(
net_id
,
"test"
,
global_dest
,
PAYLOAD_SZ
,
0
.
0
,
sizeof
(
svr_msg
),
(
const
void
*
)
m_remote
,
sizeof
(
svr_msg
),
(
const
void
*
)
m_local
,
lp
);
issue_event
(
ns
,
lp
);
return
;
}
static
void
handle_remote_rev_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
)
{
ns
->
msg_recvd_count
--
;
}
static
void
handle_remote_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
)
{
ns
->
msg_recvd_count
++
;
}
static
void
handle_local_rev_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
)
{
ns
->
local_recvd_count
--
;
}
static
void
handle_local_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
)
{
ns
->
local_recvd_count
++
;
}
/* convert ns to seconds */
static
tw_stime
ns_to_s
(
tw_stime
ns
)
{
return
(
ns
/
(
1000
.
0
*
1000
.
0
*
1000
.
0
));
}
/* convert seconds to ns */
static
tw_stime
s_to_ns
(
tw_stime
ns
)
{
return
(
ns
*
(
1000
.
0
*
1000
.
0
*
1000
.
0
));
}
int
index_mine
=
0
;
static
void
svr_finalize
(
svr_state
*
ns
,
tw_lp
*
lp
)
{
ns
->
end_ts
=
tw_now
(
lp
);
// printf("server %d server %llu recvd %d bytes in %f seconds, %f MiB/s sent_count %d recvd_count %d local_count %d \n", index_mine++,(unsigned long long)lp->gid, PAYLOAD_SZ*ns->msg_recvd_count, ns_to_s(ns->end_ts-ns->start_ts),
// ((double)(PAYLOAD_SZ*ns->msg_sent_count)/(double)(1024*1024)/ns_to_s(ns->end_ts-ns->start_ts)), ns->msg_sent_count, ns->msg_recvd_count, ns->local_recvd_count);
return
;
}
static
void
svr_rev_event
(
svr_state
*
ns
,
tw_bf
*
b
,
svr_msg
*
m
,
tw_lp
*
lp
)
{
switch
(
m
->
svr_event_type
)
{
case
REMOTE
:
handle_remote_rev_event
(
ns
,
b
,
m
,
lp
);
break
;
case
LOCAL
:
handle_local_rev_event
(
ns
,
b
,
m
,
lp
);
break
;