@@ -70,14 +70,15 @@ typedef struct listenerNode{
70
70
71
71
typedef struct {
72
72
char * base ;
73
- size_t pos ;
73
+ int pos ;
74
+ int nchar ;
74
75
} buffer_t ;
75
76
76
77
static struct {
77
78
/* const after errlogInit() */
78
- size_t maxMsgSize ;
79
+ int maxMsgSize ;
79
80
/* alloc size of both buffer_t::base */
80
- size_t bufSize ;
81
+ int bufSize ;
81
82
int errlogInitFailed ;
82
83
83
84
epicsMutexId listenerLock ;
@@ -98,8 +99,8 @@ static struct {
98
99
99
100
/* A loop counter maintained by errlogThread. */
100
101
epicsUInt32 flushSeq ;
101
- size_t nFlushers ;
102
- size_t nLost ;
102
+ unsigned long nFlushers ;
103
+ unsigned long nLost ;
103
104
104
105
/* 'log' and 'print' combine to form a double buffer. */
105
106
buffer_t * log ;
@@ -125,9 +126,14 @@ char* msgbufAlloc(void)
125
126
126
127
errlogInit (0 );
127
128
epicsMutexMustLock (pvt .msgQueueLock ); /* matched in msgbufCommit() */
128
- if (pvt .bufSize - pvt .log -> pos >= 1 + pvt .maxMsgSize ) {
129
+ if (pvt .bufSize - pvt .log -> pos - pvt . log -> nchar >= 1 + pvt .maxMsgSize ) {
129
130
/* there is enough space for the worst cast */
130
131
ret = pvt .log -> base + pvt .log -> pos ;
132
+ if (pvt .log -> nchar ) {
133
+ /* append to last message */
134
+ return ret + 1 + pvt .log -> nchar ;
135
+ }
136
+ /* new message */
131
137
ret [0 ] = ERL_STATE_WRITE ;
132
138
ret ++ ;
133
139
}
@@ -140,39 +146,44 @@ char* msgbufAlloc(void)
140
146
}
141
147
142
148
static
143
- size_t msgbufCommit (size_t nchar , int localEcho )
149
+ int msgbufCommit (int nchar , int localEcho )
144
150
{
145
151
int isOkToBlock = epicsThreadIsOkToBlock ();
146
152
int wasEmpty = pvt .log -> pos == 0 ;
147
153
int atExit = pvt .atExit ;
148
- char * start = pvt .log -> base + pvt .log -> pos ;
154
+ char * start = pvt .log -> base + pvt .log -> pos + pvt . log -> nchar ;
149
155
150
156
/* nchar returned by snprintf() is >= maxMsgSize when truncated */
151
157
if (nchar >= pvt .maxMsgSize ) {
152
158
const char * trunc = "<<TRUNCATED>>\n" ;
153
- nchar = pvt .maxMsgSize - 1u ;
159
+ nchar = pvt .maxMsgSize - 1 ;
154
160
155
- strcpy (start + 1u + nchar - strlen (trunc ), trunc );
156
- /* assert(strlen(start+1u )==nchar); */
161
+ strcpy (start + 1 + nchar - strlen (trunc ), trunc );
162
+ /* assert(strlen(start+1 )==nchar); */
157
163
}
158
164
159
- start [1u + nchar ] = '\0' ;
165
+ start [1 + nchar ] = '\0' ;
160
166
161
167
if (localEcho && isOkToBlock && atExit ) {
162
168
/* errlogThread is not running, so we print directly
163
169
* and then abandon the buffer.
164
170
*/
165
171
fprintf (pvt .console , "%s" , start );
166
172
173
+ } else if (start [nchar ] != '\n' ) {
174
+ /* incomplete message, prepare to append */
175
+ pvt .log -> nchar += nchar ;
176
+
167
177
} else {
168
- start [ 0u ] = ERL_STATE_READY | (localEcho ? ERL_LOCALECHO : 0 );
178
+ pvt . log -> base [ pvt . log -> pos ] = ERL_STATE_READY | (localEcho ? ERL_LOCALECHO : 0 );
169
179
170
- pvt .log -> pos += 1u + nchar + 1u ;
180
+ pvt .log -> pos += 1 + pvt .log -> nchar + nchar + 1 ;
181
+ pvt .log -> nchar = 0 ;
171
182
}
172
183
173
184
epicsMutexUnlock (pvt .msgQueueLock ); /* matched in msgbufAlloc() */
174
185
175
- if (wasEmpty && !atExit )
186
+ if (wasEmpty && !atExit && ! pvt . log -> nchar )
176
187
epicsEventMustTrigger (pvt .waitForWork );
177
188
178
189
if (localEcho && isOkToBlock && !atExit )
@@ -185,7 +196,7 @@ static
185
196
void errlogSequence (void )
186
197
{
187
198
int wakeNext = 0 ;
188
- size_t seq ;
199
+ epicsUInt32 seq ;
189
200
190
201
if (pvt .atExit )
191
202
return ;
@@ -203,7 +214,7 @@ void errlogSequence(void)
203
214
}
204
215
205
216
pvt .nFlushers -- ;
206
- wakeNext = pvt .nFlushers != 0u ;
217
+ wakeNext = pvt .nFlushers != 0 ;
207
218
epicsMutexUnlock (pvt .msgQueueLock );
208
219
209
220
if (wakeNext )
@@ -234,22 +245,19 @@ int isATTY(FILE* fp)
234
245
static
235
246
int isATTY (FILE * fp )
236
247
{
248
+ #ifdef ENABLE_VIRTUAL_TERMINAL_PROCESSING
237
249
HANDLE hand = NULL ;
238
250
DWORD mode = 0 ;
239
251
if (fp == stdout )
240
252
hand = GetStdHandle (STD_OUTPUT_HANDLE );
241
253
else if (fp == stderr )
242
254
hand = GetStdHandle (STD_ERROR_HANDLE );
243
- #ifdef ENABLE_VIRTUAL_TERMINAL_PROCESSING
244
255
if (hand && GetConsoleMode (hand , & mode )) {
245
256
(void )SetConsoleMode (hand , mode |ENABLE_VIRTUAL_TERMINAL_PROCESSING );
246
- mode = 0u ;
257
+ mode = 0 ;
247
258
if (GetConsoleMode (hand , & mode ) && (mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING ))
248
259
return 1 ;
249
260
}
250
- #else
251
- (void )hand ;
252
- (void )mode ;
253
261
#endif
254
262
return 0 ;
255
263
}
@@ -263,7 +271,7 @@ void errlogStripANSI(char *msg);
263
271
264
272
void errlogStripANSI (char * msg )
265
273
{
266
- size_t pos = 0 , shift = 0 ;
274
+ int pos = 0 , shift = 0 ;
267
275
268
276
while (1 ) {
269
277
char c = msg [pos ];
@@ -517,8 +525,8 @@ static void errlogExitHandler(void *raw)
517
525
}
518
526
519
527
struct initArgs {
520
- size_t bufsize ;
521
- size_t maxMsgSize ;
528
+ int bufsize ;
529
+ int maxMsgSize ;
522
530
};
523
531
524
532
static void errlogInitPvt (void * arg )
@@ -616,7 +624,7 @@ static void errlogThread(void)
616
624
while (!pvt .atExit ) {
617
625
pvt .flushSeq ++ ;
618
626
619
- if (pvt .log -> pos == 0u ) {
627
+ if (pvt .log -> pos == 0 ) {
620
628
int wakeFlusher = pvt .nFlushers != 0 ;
621
629
epicsMutexUnlock (pvt .msgQueueLock );
622
630
if (wakeFlusher )
@@ -626,10 +634,10 @@ static void errlogThread(void)
626
634
627
635
} else {
628
636
/* snapshot and swap buffers for use while unlocked */
629
- size_t nLost = pvt .nLost ;
637
+ unsigned long nLost = pvt .nLost ;
630
638
FILE * console = pvt .toConsole ? pvt .console : NULL ;
631
639
int ttyConsole = pvt .ttyConsole ;
632
- size_t pos = 0u ;
640
+ int pos = 0 ;
633
641
buffer_t * print ;
634
642
635
643
{
@@ -638,49 +646,49 @@ static void errlogThread(void)
638
646
pvt .print = print = temp ;
639
647
}
640
648
641
- pvt .nLost = 0u ;
649
+ pvt .nLost = 0 ;
642
650
epicsMutexUnlock (pvt .msgQueueLock );
643
651
644
652
while (pos < print -> pos ) {
645
653
listenerNode * plistenerNode ;
646
654
char * base = print -> base + pos ;
647
- size_t mlen = epicsStrnLen (base + 1u , pvt .bufSize - pos );
655
+ int mlen = ( int ) epicsStrnLen (base + 1 , pvt .bufSize - pos );
648
656
int stripped = 0 ;
649
657
650
658
if ((base [0 ]& ERL_STATE_MASK ) != ERL_STATE_READY || mlen >=pvt .bufSize - pos ) {
651
- fprintf (stderr , "Logic Error: errlog buffer corruption. %02x, %zu \n" ,
659
+ fprintf (stderr , "Logic Error: errlog buffer corruption. %02x, %u \n" ,
652
660
(unsigned )base [0 ], mlen );
653
661
/* try to reset and recover */
654
662
break ;
655
663
}
656
664
657
665
if (base [0 ]& ERL_LOCALECHO && console ) {
658
666
if (!ttyConsole ) {
659
- errlogStripANSI (base + 1u );
667
+ errlogStripANSI (base + 1 );
660
668
stripped = 1 ;
661
669
}
662
- fprintf (console , "%s" , base + 1u );
670
+ fprintf (console , "%s" , base + 1 );
663
671
}
664
672
665
673
if (!stripped )
666
- errlogStripANSI (base + 1u );
674
+ errlogStripANSI (base + 1 );
667
675
668
676
epicsMutexMustLock (pvt .listenerLock );
669
677
plistenerNode = (listenerNode * )ellFirst (& pvt .listenerList );
670
678
while (plistenerNode ) {
671
- (* plistenerNode -> listener )(plistenerNode -> pPrivate , base + 1u );
679
+ (* plistenerNode -> listener )(plistenerNode -> pPrivate , base + 1 );
672
680
plistenerNode = (listenerNode * )ellNext (& plistenerNode -> node );
673
681
}
674
682
epicsMutexUnlock (pvt .listenerLock );
675
683
676
- pos += 1u + mlen + 1u ;
684
+ pos += 1 + mlen + 1 ;
677
685
}
678
686
679
687
memset (print -> base , 0 , pvt .bufSize );
680
- print -> pos = 0u ;
688
+ print -> pos = 0 ;
681
689
682
690
if (nLost && console )
683
- fprintf (console , "errlog: lost %zu messages\n" , nLost );
691
+ fprintf (console , "errlog: lost %lu messages\n" , nLost );
684
692
685
693
if (console )
686
694
fflush (console );
0 commit comments