@@ -25,15 +25,20 @@ struct writer_impl {
2525static  void 
2626get_trace_ (struct  writer_impl  * impl )
2727{
28-     if  (coldtrace_writes_disabled ())
29-         return ;
3028    assert (impl -> initd );
3129    if  (impl -> buffer ) {
3230        return ;
3331    }
34-     impl -> enumerator     =  0 ;
35-     impl -> size           =  coldtrace_get_trace_size ();
36-     impl -> offset         =  0 ;
32+ 
33+     impl -> size        =  coldtrace_get_trace_size ();
34+     impl -> offset      =  0 ;
35+     impl -> enumerator  =  0 ;
36+ 
37+     if  (coldtrace_writes_disabled ()) {
38+         impl -> buffer  =  malloc (impl -> size );
39+         return ;
40+     }
41+ 
3742    const  char  * pattern  =  coldtrace_get_file_pattern ();
3843    char  file_name [strlen (pattern ) +  20 ];
3944    sprintf (file_name , pattern , impl -> tid , impl -> enumerator );
@@ -59,10 +64,19 @@ get_trace_(struct writer_impl *impl)
5964static  void 
6065new_trace_ (struct  writer_impl  * impl )
6166{
62-     if  (coldtrace_writes_disabled ())
67+     if  (coldtrace_writes_disabled ()) {
68+         size_t  trace_size  =  coldtrace_get_trace_size ();
69+         if  (impl -> size  !=  trace_size ) {
70+             impl -> size  =  trace_size ;
71+             free (impl -> buffer );
72+             impl -> buffer  =  malloc (impl -> size );
73+         }
74+         impl -> offset  =  0 ;
6375        return ;
76+     }
6477    coldtrace_writer_close (impl -> buffer , impl -> offset , impl -> tid );
6578    munmap (impl -> buffer , impl -> size );
79+ 
6680    impl -> enumerator  =  (impl -> enumerator  +  1 ) % coldtrace_get_max ();
6781    impl -> size        =  coldtrace_get_trace_size ();
6882    impl -> offset      =  0 ;
@@ -83,15 +97,12 @@ new_trace_(struct writer_impl *impl)
8397
8498
8599DICE_HIDE  void  * 
86- coldtrace_writer_reserve (struct  coldtrace_writer  * ct , size_t  size )
100+ coldtrace_writer_reserve (struct  coldtrace_writer  * writer , size_t  size )
87101{
88-     if  (coldtrace_writes_disabled ())
89-         return  NULL ;
90- 
91-     struct  writer_impl  * impl  =  (struct  writer_impl  * )ct ;
102+     struct  writer_impl  * impl  =  (struct  writer_impl  * )writer ;
92103    get_trace_ (impl );
93-     if  (impl -> buffer  ==  MAP_FAILED ) {
94-         return  false ;
104+     if  (impl -> buffer  ==  MAP_FAILED   ||   impl -> buffer   ==   NULL ) {
105+         return  NULL ;
95106    }
96107
97108    // check if size of trace was reduced 
@@ -130,6 +141,9 @@ coldtrace_writer_fini(struct coldtrace_writer *ct)
130141    if  (!impl -> initd )
131142        return ;
132143    coldtrace_writer_close (impl -> buffer , impl -> offset , impl -> tid );
144+ 
145+     if  (coldtrace_writes_disabled ())
146+         free (impl -> buffer );
133147}
134148
135149
0 commit comments