@@ -214,7 +214,6 @@ fn counter_source(out_path: &str) -> String {
214214#define SYS_open 2
215215#define SYS_nanosleep 35
216216#define SYS_lseek 8
217- #define SYS_ftruncate 77
218217#define O_WRONLY 1
219218#define O_CREAT 0100
220219#define O_TRUNC 01000
@@ -230,12 +229,14 @@ void _start(void){{
230229 struct ts t; t.sec = 0; t.nsec = 20000000;
231230 for(;;){{
232231 i++;
233- int p = 0; unsigned long v = i; char tmp[24]; int k=0;
234- if(v==0){{ tmp[k++]='0'; }} while(v){{ tmp[k++]='0'+(v%10); v/=10; }}
235- while(k>0){{ buf[p++]=tmp[--k]; }} buf[p++]='\n';
232+ // Publish the counter atomically: one fixed-width, zero-padded 21-byte
233+ // overwrite (20 digits + newline) at offset 0, never truncating. A reader
234+ // therefore always sees a complete, parseable value, never an empty file.
235+ unsigned long v = i; int d;
236+ for(d = 19; d >= 0; d--){{ buf[d] = '0' + (v % 10); v /= 10; }}
237+ buf[20] = '\n';
236238 sys3(SYS_lseek, fd, 0, 0);
237- sys3(SYS_ftruncate, fd, 0, 0);
238- sys3(SYS_write, fd, (long)buf, p);
239+ sys3(SYS_write, fd, (long)buf, 21);
239240 sys3(SYS_nanosleep, (long)&t, 0, 0);
240241 }}
241242}}
0 commit comments