00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SST_CPUNICEVENT_H
00022 #define SST_CPUNICEVENT_H
00023
00024 #include <cstring>
00025
00026 #include "sst/core/compEvent.h"
00027
00028 namespace SST {
00029
00030
00031 #define CPUNICEVNET_MAX_PARAMS (64)
00032
00033 class CPUNicEvent : public CompEvent {
00034 public:
00035 CPUNicEvent() : CompEvent() {
00036 params_present= false;
00037 params_len= 0;
00038 routine= -1;
00039 payload_len= 0;
00040 payload_present= false;
00041 hops= 0;
00042 }
00043
00044
00045 std::vector<uint8_t>route;
00046 SimTime_t router_delay;
00047 int hops;
00048
00049
00050 uint64_t msg_match_bits;
00051 uint64_t buf;
00052 uint32_t msg_len;
00053
00054
00055 inline void AttachParams(const void *input, int len) {
00056 if (len > CPUNICEVNET_MAX_PARAMS) {
00057 _ABORT(CPUNicEvent, "Only have room for %d bytes!!\n", CPUNICEVNET_MAX_PARAMS);
00058 }
00059 params_present= true;
00060 params_len= len;
00061 std::memcpy(event_params, input, len);
00062 }
00063
00064 inline void DetachParams(void *output, int *len) {
00065 if (!params_present) {
00066 _ABORT(CPUNicEvent, "No params present!\n");
00067 }
00068 if (*len > CPUNICEVNET_MAX_PARAMS) {
00069 _ABORT(CPUNicEvent, "Can't detach %d bytes. Only have %d bytes (%d max) of params!!\n",
00070 *len, params_len, CPUNICEVNET_MAX_PARAMS);
00071 }
00072 if ((int) params_len > *len) {
00073 _ABORT(CPUNicEvent, "Have %d bytes of params, but user only wants %d!\n",
00074 params_len, *len);
00075 }
00076
00077 std::memcpy(output, event_params, params_len);
00078 *len= params_len;
00079 }
00080
00081 inline void SetRoutine(int r) {
00082 routine= r;
00083 }
00084
00085 inline int GetRoutine(void) {
00086 return routine;
00087 }
00088
00089
00090
00091
00092 inline void AttachPayload(const char *payload, int len) {
00093 if (payload_present) {
00094 _ABORT(NicEvent, "Payload data already present!\n");
00095 }
00096 payload_present= true;
00097 msg_payload.reserve(len);
00098 payload_len= len;
00099 msg_payload.insert(msg_payload.end(), payload, payload + len);
00100 }
00101
00102 inline void DetachPayload(void *output, int *len) {
00103 if (!payload_present) {
00104 _ABORT(CPUNicEvent, "No payload present!\n");
00105 }
00106 if (*len > payload_len) {
00107 _ABORT(CPUNicEvent, "Have %d bytes of payload, but user wants %d!\n",
00108 payload_len, *len);
00109 }
00110
00111 std::memcpy(output, &msg_payload[0], payload_len);
00112 *len= payload_len;
00113 }
00114
00115 inline int GetPayloadLen(void) {
00116 return payload_len;
00117 }
00118
00119
00120 private:
00121 bool params_present;
00122 int routine;
00123 unsigned int params_len;
00124 uint8_t event_params[CPUNICEVNET_MAX_PARAMS];
00125 std::vector<uint8_t>msg_payload;
00126 bool payload_present;
00127 int payload_len;
00128
00129 friend class boost::serialization::access;
00130 template<class Archive>
00131 void serialize(Archive & ar, const unsigned int version )
00132 {
00133 boost::serialization::base_object<CompEvent>(*this);
00134 ar & BOOST_SERIALIZATION_NVP(route);
00135 ar & BOOST_SERIALIZATION_NVP(router_delay);
00136 ar & BOOST_SERIALIZATION_NVP(hops);
00137 ar & BOOST_SERIALIZATION_NVP(msg_match_bits);
00138 ar & BOOST_SERIALIZATION_NVP(msg_len);
00139 ar & BOOST_SERIALIZATION_NVP(event_params);
00140 ar & BOOST_SERIALIZATION_NVP(routine);
00141 ar & BOOST_SERIALIZATION_NVP(params_len);
00142 ar & BOOST_SERIALIZATION_NVP(params_present);
00143 ar & BOOST_SERIALIZATION_NVP(payload_len);
00144 ar & BOOST_SERIALIZATION_NVP(msg_payload);
00145 ar & BOOST_SERIALIZATION_NVP(payload_present);
00146 }
00147 };
00148 }
00149
00150 #endif // SST_CPUNICEVENT_H