Forward a log message to a plugin.
174{
175 MsgBuff *theMsg;
176 char *fence, *freeMsg, *msgText;
177 int dwords, msgLen = 0;
178 bool doPost = false;
179
180
181
182 for (
int i = 0; i < iovcnt; i++) msgLen +=
iov[i].iov_len;
183
184
185
186 if (doSync)
187 {char *mbP, mbuff[syncBSZ];
188 if (msgLen >= syncBSZ) msgLen = CopyTrunc(mbuff,
iov, iovcnt);
189 else {mbP = mbuff;
190 for (int i = 0; i < iovcnt; i++)
191 {memcpy(mbP,
iov[i].iov_base,
iov[i].iov_len);
192 mbP +=
iov[i].iov_len;
193 }
194 *mbP = 0;
195 }
196 (*piLogger)(mtime, tID, mbuff, msgLen);
197 return logDone;
198 }
199
200
201
202 msgMutex.Lock();
203
204
205
206 if (msgLen > maxMsgLen)
207 {todLost = mtime;
208 numLost++;
209 msgMutex.UnLock();
210 return logDone;
211 }
212
213
214
215
216
217 dwords = msgLen+8 + sizeof(MsgBuff);
218 if (numLost) dwords += sizeof(MsgBuff);
219 dwords = dwords/8;
220
221
222
223
224
225
226
227 if (pendMsg)
228 {freeMsg = lastMsg + ((MsgBuff *)lastMsg)->buffsz*8;
229 fence = (lastMsg >= pendMsg ? buffEnd : pendMsg);
230 } else {
231 freeMsg = buffBeg;
232 fence = buffEnd;
233 lastMsg = 0;
234 doPost = true;
235 }
236
237
238
239
240 if ((freeMsg + (dwords*8)) > fence)
241 {todLost = mtime;
242 numLost++;
243 msgMutex.UnLock();
244 return logDone;
245 }
246
247
248
249
250 if (numLost)
251 {theMsg = (MsgBuff *)freeMsg;
252 theMsg->msgtod = mtime;
253 theMsg->tID = tID;
254 theMsg->buffsz = mbDwords;
255 theMsg->msglen = -numLost;
256 if (lastMsg) ((MsgBuff *)lastMsg)->next = freeMsg - buffOrg;
257 lastMsg = freeMsg;
258 freeMsg += msgOff;
259 }
260
261
262
263 theMsg = (MsgBuff *)freeMsg;
264 theMsg->msgtod = mtime;
265 theMsg->tID = tID;
266 theMsg->next = 0;
267 theMsg->buffsz = dwords;
268 theMsg->msglen = msgLen;
269 if (lastMsg) ((MsgBuff *)lastMsg)->next = freeMsg - buffOrg;
270 lastMsg = freeMsg;
271
272
273
274 msgText = freeMsg + msgOff;
275 for (int i = 0; i < iovcnt; i++)
276 {memcpy(msgText,
iov[i].iov_base,
iov[i].iov_len);
277 msgText +=
iov[i].iov_len;
278 }
279 *msgText = 0;
280
281
282
283
284
285
286 if (doPost) pendMsg = freeMsg;
287 msgMutex.UnLock();
288 if (doPost) msgAlert.Post();
289 return logDone;
290}