MCPcopy Create free account
hub / github.com/apache/trafficserver / RecMessageMarshal_Realloc

Function RecMessageMarshal_Realloc

src/records/RecMessage.cc:72–157  ·  view source on GitHub ↗

------------------------------------------------------------------------- RecMessageMarshal_Realloc -------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

70// RecMessageMarshal_Realloc
71//-------------------------------------------------------------------------
72RecMessage *
73RecMessageMarshal_Realloc(RecMessage *msg, const RecRecord *record)
74{
75 int msg_ele_size;
76 int rec_name_len = -1;
77 int rec_data_str_len = -1;
78 int rec_data_def_str_len = -1;
79 int rec_cfg_chk_len = -1;
80 RecMessageEleHdr *ele_hdr;
81 RecRecord *r;
82 char *p;
83
84 // find out how much space we need
85 msg_ele_size = sizeof(RecMessageEleHdr) + sizeof(RecRecord);
86 if (record->name) {
87 rec_name_len = strlen(record->name) + 1;
88 msg_ele_size += rec_name_len;
89 }
90 if (record->data_type == RECD_STRING) {
91 if (record->data.rec_string) {
92 rec_data_str_len = strlen(record->data.rec_string) + 1;
93 msg_ele_size += rec_data_str_len;
94 }
95 if (record->data_default.rec_string) {
96 rec_data_def_str_len = strlen(record->data_default.rec_string) + 1;
97 msg_ele_size += rec_data_def_str_len;
98 }
99 }
100 if (REC_TYPE_IS_CONFIG(record->rec_type) && (record->config_meta.check_expr)) {
101 rec_cfg_chk_len = strlen(record->config_meta.check_expr) + 1;
102 msg_ele_size += rec_cfg_chk_len;
103 }
104 // XXX: this is NOT 8 byte alignment
105 // msg_ele_size = 5;
106 // (msg_ele_size + 7) & ~7 == 5 !!!
107 // msg_ele_size = (msg_ele_size + 7) & ~7; // 8 byte alignment
108
109 msg_ele_size = INK_ALIGN_DEFAULT(msg_ele_size); // 8 byte alignment
110 // get some space in our buffer
111 while (msg->o_end - msg->o_write < msg_ele_size) {
112 int realloc_size = (msg->o_end - msg->o_start) * 2;
113 msg = static_cast<RecMessage *>(ats_realloc(msg, sizeof(RecMessageHdr) + realloc_size));
114 msg->o_end = msg->o_start + realloc_size;
115 }
116 ele_hdr = reinterpret_cast<RecMessageEleHdr *>(reinterpret_cast<char *>(msg) + msg->o_write);
117 // The following memset() is pretty CPU intensive, replacing it with something
118 // like the below would reduce CPU usage a fair amount. /leif.
119 // *((char*)msg + msg->o_write) = 0;
120 memset(reinterpret_cast<char *>(msg) + msg->o_write, 0, msg->o_end - msg->o_write);
121 msg->o_write += msg_ele_size;
122
123 // store the record
124 ele_hdr->magic = REC_MESSAGE_ELE_MAGIC;
125 ele_hdr->o_next = msg->o_write;
126 p = reinterpret_cast<char *>(ele_hdr) + sizeof(RecMessageEleHdr);
127 memcpy(p, record, sizeof(RecRecord));
128 r = reinterpret_cast<RecRecord *>(p);
129 p += sizeof(RecRecord);

Callers 1

RecSyncStatsFileFunction · 0.85

Calls 3

ats_reallocFunction · 0.85
memsetFunction · 0.85
memcpyFunction · 0.50

Tested by

no test coverage detected