diff mbox series

Fix formatting of fixed-point numbers to not skip zeros

Message ID 20190110214346.8054-1-u.kleine-koenig@pengutronix.de (mailing list archive)
State Superseded
Headers show
Series Fix formatting of fixed-point numbers to not skip zeros | expand

Commit Message

Uwe Kleine-König Jan. 10, 2019, 9:43 p.m. UTC
When a timestamp that represents 1.00001 is converted to (for example)
seconds and microseconds this results in seconds=1 and useconds=10. To
format that into a string requires the format %lu.%06lu to yield
"1.000010". Some code parts used %lu.%lu however which results in "1.10"
which is wrong.

This was noticed because I failed to find a significant location in a trace
provided by a colleague as the reported timestamp was wrong :-|

This change fixes all occurrences of this problem found by
$(grep -E '\.%[^0s]').
---
 kernel-shark-qt/src/KsTraceGraph.cpp | 10 +++++-----
 python/event-viewer.py               |  4 ++--
 python/tracecmd.py                   |  2 +-
 3 files changed, 8 insertions(+), 8 deletions(-)

Comments

Steven Rostedt Jan. 10, 2019, 9:48 p.m. UTC | #1
On Thu, 10 Jan 2019 22:43:46 +0100
Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote:

> When a timestamp that represents 1.00001 is converted to (for example)
> seconds and microseconds this results in seconds=1 and useconds=10. To
> format that into a string requires the format %lu.%06lu to yield
> "1.000010". Some code parts used %lu.%lu however which results in "1.10"
> which is wrong.

Thanks Uwe!

Yordan, can you review this patch and give an Acked-by or Reviewed-by
tag?

Thanks!

-- Steve

> 
> This was noticed because I failed to find a significant location in a trace
> provided by a colleague as the reported timestamp was wrong :-|
> 
> This change fixes all occurrences of this problem found by
> $(grep -E '\.%[^0s]').
> ---
>  kernel-shark-qt/src/KsTraceGraph.cpp | 10 +++++-----
>  python/event-viewer.py               |  4 ++--
>  python/tracecmd.py                   |  2 +-
>  3 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/kernel-shark-qt/src/KsTraceGraph.cpp b/kernel-shark-qt/src/KsTraceGraph.cpp
> index 462918f8a37a..844c79494e9b 100644
> --- a/kernel-shark-qt/src/KsTraceGraph.cpp
> +++ b/kernel-shark-qt/src/KsTraceGraph.cpp
> @@ -279,7 +279,7 @@ void KsTraceGraph::_resetPointer(uint64_t ts, int cpu, int pid)
>  	QString pointer;
>  
>  	kshark_convert_nano(ts, &sec, &usec);
> -	pointer.sprintf("%lu.%lu", sec, usec);
> +	pointer.sprintf("%lu.%06lu", sec, usec);
>  	_labelP2.setText(pointer);
>  
>  	if (pid > 0 && cpu >= 0) {
> @@ -315,7 +315,7 @@ void KsTraceGraph::_setPointerInfo(size_t i)
>  	uint64_t sec, usec;
>  
>  	kshark_convert_nano(e->ts, &sec, &usec);
> -	pointer.sprintf("%lu.%lu", sec, usec);
> +	pointer.sprintf("%lu.%06lu", sec, usec);
>  	_labelP2.setText(pointer);
>  
>  	comm.append("-");
> @@ -601,17 +601,17 @@ void KsTraceGraph::_updateTimeLegends()
>  	QString tMin, tMid, tMax;
>  
>  	kshark_convert_nano(_glWindow.model()->histo()->min, &sec, &usec);
> -	tMin.sprintf("%lu.%lu", sec, usec);
> +	tMin.sprintf("%lu.%06lu", sec, usec);
>  	_labelXMin.setText(tMin);
>  
>  	tsMid = (_glWindow.model()->histo()->min +
>  		 _glWindow.model()->histo()->max) / 2;
>  	kshark_convert_nano(tsMid, &sec, &usec);
> -	tMid.sprintf("%lu.%lu", sec, usec);
> +	tMid.sprintf("%lu.%06lu", sec, usec);
>  	_labelXMid.setText(tMid);
>  
>  	kshark_convert_nano(_glWindow.model()->histo()->max, &sec, &usec);
> -	tMax.sprintf("%lu.%lu", sec, usec);
> +	tMax.sprintf("%lu.%06lu", sec, usec);
>  	_labelXMax.setText(tMax);
>  }
>  
> diff --git a/python/event-viewer.py b/python/event-viewer.py
> index 651761a083c9..3a082b81fc3d 100755
> --- a/python/event-viewer.py
> +++ b/python/event-viewer.py
> @@ -203,8 +203,8 @@ class EventView(gtk.TreeView):
>              return False
>  
>          if data == "ts":
> -            cell.set_property("markup", "%d.%d" % (ev.ts/1000000000,
> -                                                   ev.ts%1000000000))
> +            cell.set_property("markup", "%d.%09d" % (ev.ts/1000000000,
> +                                                     ev.ts%1000000000))
>              data_func_cnt = data_func_cnt + 1
>              if app:
>                  app.inc_data_func()
> diff --git a/python/tracecmd.py b/python/tracecmd.py
> index 1267941aa388..f551a1489e25 100644
> --- a/python/tracecmd.py
> +++ b/python/tracecmd.py
> @@ -62,7 +62,7 @@ class Event(object, DictMixin):
>          self._format = format
>  
>      def __str__(self):
> -        return "%d.%d CPU%d %s: pid=%d comm=%s type=%d" % \
> +        return "%d.%09d CPU%d %s: pid=%d comm=%s type=%d" % \
>                 (self.ts/1000000000, self.ts%1000000000, self.cpu, self.name,
>                  self.num_field("common_pid"), self.comm, self.type)
>
Yordan Karadzhov Jan. 11, 2019, 9:09 a.m. UTC | #2
On 10.01.19 г. 23:48 ч., Steven Rostedt wrote:
> On Thu, 10 Jan 2019 22:43:46 +0100
> Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote:
> 
>> When a timestamp that represents 1.00001 is converted to (for example)
>> seconds and microseconds this results in seconds=1 and useconds=10. To
>> format that into a string requires the format %lu.%06lu to yield
>> "1.000010". Some code parts used %lu.%lu however which results in "1.10"
>> which is wrong.
> 
> Thanks Uwe!
> 
> Yordan, can you review this patch and give an Acked-by or Reviewed-by
> tag?
> 

Very well spotted.

Reviewed-by: Yordan Karadzhov <ykaradzhov@vmware.com>

Just one minor thing, please sign the patch.

Thanks a lot!
Yordan


> Thanks!
> 
> -- Steve
> 
>>
>> This was noticed because I failed to find a significant location in a trace
>> provided by a colleague as the reported timestamp was wrong :-|
>>
>> This change fixes all occurrences of this problem found by
>> $(grep -E '\.%[^0s]').
>> ---
>>   kernel-shark-qt/src/KsTraceGraph.cpp | 10 +++++-----
>>   python/event-viewer.py               |  4 ++--
>>   python/tracecmd.py                   |  2 +-
>>   3 files changed, 8 insertions(+), 8 deletions(-)
>>
>> diff --git a/kernel-shark-qt/src/KsTraceGraph.cpp b/kernel-shark-qt/src/KsTraceGraph.cpp
>> index 462918f8a37a..844c79494e9b 100644
>> --- a/kernel-shark-qt/src/KsTraceGraph.cpp
>> +++ b/kernel-shark-qt/src/KsTraceGraph.cpp
>> @@ -279,7 +279,7 @@ void KsTraceGraph::_resetPointer(uint64_t ts, int cpu, int pid)
>>   	QString pointer;
>>   
>>   	kshark_convert_nano(ts, &sec, &usec);
>> -	pointer.sprintf("%lu.%lu", sec, usec);
>> +	pointer.sprintf("%lu.%06lu", sec, usec);
>>   	_labelP2.setText(pointer);
>>   
>>   	if (pid > 0 && cpu >= 0) {
>> @@ -315,7 +315,7 @@ void KsTraceGraph::_setPointerInfo(size_t i)
>>   	uint64_t sec, usec;
>>   
>>   	kshark_convert_nano(e->ts, &sec, &usec);
>> -	pointer.sprintf("%lu.%lu", sec, usec);
>> +	pointer.sprintf("%lu.%06lu", sec, usec);
>>   	_labelP2.setText(pointer);
>>   
>>   	comm.append("-");
>> @@ -601,17 +601,17 @@ void KsTraceGraph::_updateTimeLegends()
>>   	QString tMin, tMid, tMax;
>>   
>>   	kshark_convert_nano(_glWindow.model()->histo()->min, &sec, &usec);
>> -	tMin.sprintf("%lu.%lu", sec, usec);
>> +	tMin.sprintf("%lu.%06lu", sec, usec);
>>   	_labelXMin.setText(tMin);
>>   
>>   	tsMid = (_glWindow.model()->histo()->min +
>>   		 _glWindow.model()->histo()->max) / 2;
>>   	kshark_convert_nano(tsMid, &sec, &usec);
>> -	tMid.sprintf("%lu.%lu", sec, usec);
>> +	tMid.sprintf("%lu.%06lu", sec, usec);
>>   	_labelXMid.setText(tMid);
>>   
>>   	kshark_convert_nano(_glWindow.model()->histo()->max, &sec, &usec);
>> -	tMax.sprintf("%lu.%lu", sec, usec);
>> +	tMax.sprintf("%lu.%06lu", sec, usec);
>>   	_labelXMax.setText(tMax);
>>   }
>>   
>> diff --git a/python/event-viewer.py b/python/event-viewer.py
>> index 651761a083c9..3a082b81fc3d 100755
>> --- a/python/event-viewer.py
>> +++ b/python/event-viewer.py
>> @@ -203,8 +203,8 @@ class EventView(gtk.TreeView):
>>               return False
>>   
>>           if data == "ts":
>> -            cell.set_property("markup", "%d.%d" % (ev.ts/1000000000,
>> -                                                   ev.ts%1000000000))
>> +            cell.set_property("markup", "%d.%09d" % (ev.ts/1000000000,
>> +                                                     ev.ts%1000000000))
>>               data_func_cnt = data_func_cnt + 1
>>               if app:
>>                   app.inc_data_func()
>> diff --git a/python/tracecmd.py b/python/tracecmd.py
>> index 1267941aa388..f551a1489e25 100644
>> --- a/python/tracecmd.py
>> +++ b/python/tracecmd.py
>> @@ -62,7 +62,7 @@ class Event(object, DictMixin):
>>           self._format = format
>>   
>>       def __str__(self):
>> -        return "%d.%d CPU%d %s: pid=%d comm=%s type=%d" % \
>> +        return "%d.%09d CPU%d %s: pid=%d comm=%s type=%d" % \
>>                  (self.ts/1000000000, self.ts%1000000000, self.cpu, self.name,
>>                   self.num_field("common_pid"), self.comm, self.type)
>>   
>
Uwe Kleine-König Jan. 11, 2019, 9:24 a.m. UTC | #3
Hello Yordan,

On Fri, Jan 11, 2019 at 09:09:19AM +0000, Yordan Karadzhov wrote:
> On 10.01.19 г. 23:48 ч., Steven Rostedt wrote:
> > On Thu, 10 Jan 2019 22:43:46 +0100
> > Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote:
> > 
> >> When a timestamp that represents 1.00001 is converted to (for example)
> >> seconds and microseconds this results in seconds=1 and useconds=10. To
> >> format that into a string requires the format %lu.%06lu to yield
> >> "1.000010". Some code parts used %lu.%lu however which results in "1.10"
> >> which is wrong.
> > 
> > Thanks Uwe!
> > 
> > Yordan, can you review this patch and give an Acked-by or Reviewed-by
> > tag?
> 
> Very well spotted.
> 
> Reviewed-by: Yordan Karadzhov <ykaradzhov@vmware.com>
> 
> Just one minor thing, please sign the patch.

It was a conscious decision to not sign-off the patch as it isn't
formalized for trace-cmd what a Signed-off-by-line would mean.

So if you insist on this formalism, I suggest you formalize it first :-)

Best regards
Uwe
Steven Rostedt Jan. 11, 2019, 2:29 p.m. UTC | #4
On Fri, 11 Jan 2019 10:24:20 +0100
Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote:

> Hello Yordan,
> 
> On Fri, Jan 11, 2019 at 09:09:19AM +0000, Yordan Karadzhov wrote:
> > On 10.01.19 г. 23:48 ч., Steven Rostedt wrote:  
> > > On Thu, 10 Jan 2019 22:43:46 +0100
> > > Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote:
> > >   
> > >> When a timestamp that represents 1.00001 is converted to (for example)
> > >> seconds and microseconds this results in seconds=1 and useconds=10. To
> > >> format that into a string requires the format %lu.%06lu to yield
> > >> "1.000010". Some code parts used %lu.%lu however which results in "1.10"
> > >> which is wrong.  
> > > 
> > > Thanks Uwe!
> > > 
> > > Yordan, can you review this patch and give an Acked-by or Reviewed-by
> > > tag?  
> > 
> > Very well spotted.
> > 
> > Reviewed-by: Yordan Karadzhov <ykaradzhov@vmware.com>
> > 
> > Just one minor thing, please sign the patch.  

Nice catch.

> 
> It was a conscious decision to not sign-off the patch as it isn't
> formalized for trace-cmd what a Signed-off-by-line would mean.
> 
> So if you insist on this formalism, I suggest you formalize it first :-)

You're the first one to mention this, and I never even thought about
it. It means the same thing as a Signed-off-by means for the Linux
kernel.

I can copy the text of the DCO and place it into a file called
DCO if that makes you feel better. Could you resend with a
Signed-off-by and I'll add your patch along with the file with the text
below. Take this email as an official declaration of the sign off
meaning.

-- Steve

(Copied from the Linux Kernel's Documentation/process/submitting-patches.rst)

Sign your work - the Developer's Certificate of Origin
------------------------------------------------------

To improve tracking of who did what, especially with patches that can
percolate to their final resting place in the kernel through several
layers of maintainers, we've introduced a "sign-off" procedure on
patches that are being emailed around.

The sign-off is a simple line at the end of the explanation for the
patch, which certifies that you wrote it or otherwise have the right to
pass it on as an open-source patch.  The rules are pretty simple: if you
can certify the below:

Developer's Certificate of Origin 1.1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

By making a contribution to this project, I certify that:

        (a) The contribution was created in whole or in part by me and I
            have the right to submit it under the open source license
            indicated in the file; or

        (b) The contribution is based upon previous work that, to the best
            of my knowledge, is covered under an appropriate open source
            license and I have the right under that license to submit that
            work with modifications, whether created in whole or in part
            by me, under the same open source license (unless I am
            permitted to submit under a different license), as indicated
            in the file; or

        (c) The contribution was provided directly to me by some other
            person who certified (a), (b) or (c) and I have not modified
            it.

        (d) I understand and agree that this project and the contribution
            are public and that a record of the contribution (including all
            personal information I submit with it, including my sign-off) is
            maintained indefinitely and may be redistributed consistent with
            this project or the open source license(s) involved.

then you just add a line saying::

        Signed-off-by: Random J Developer <random@developer.example.org>

using your real name (sorry, no pseudonyms or anonymous contributions.)

Some people also put extra tags at the end.  They'll just be ignored for
now, but you can do this to mark internal company procedures or just
point out some special detail about the sign-off.
diff mbox series

Patch

diff --git a/kernel-shark-qt/src/KsTraceGraph.cpp b/kernel-shark-qt/src/KsTraceGraph.cpp
index 462918f8a37a..844c79494e9b 100644
--- a/kernel-shark-qt/src/KsTraceGraph.cpp
+++ b/kernel-shark-qt/src/KsTraceGraph.cpp
@@ -279,7 +279,7 @@  void KsTraceGraph::_resetPointer(uint64_t ts, int cpu, int pid)
 	QString pointer;
 
 	kshark_convert_nano(ts, &sec, &usec);
-	pointer.sprintf("%lu.%lu", sec, usec);
+	pointer.sprintf("%lu.%06lu", sec, usec);
 	_labelP2.setText(pointer);
 
 	if (pid > 0 && cpu >= 0) {
@@ -315,7 +315,7 @@  void KsTraceGraph::_setPointerInfo(size_t i)
 	uint64_t sec, usec;
 
 	kshark_convert_nano(e->ts, &sec, &usec);
-	pointer.sprintf("%lu.%lu", sec, usec);
+	pointer.sprintf("%lu.%06lu", sec, usec);
 	_labelP2.setText(pointer);
 
 	comm.append("-");
@@ -601,17 +601,17 @@  void KsTraceGraph::_updateTimeLegends()
 	QString tMin, tMid, tMax;
 
 	kshark_convert_nano(_glWindow.model()->histo()->min, &sec, &usec);
-	tMin.sprintf("%lu.%lu", sec, usec);
+	tMin.sprintf("%lu.%06lu", sec, usec);
 	_labelXMin.setText(tMin);
 
 	tsMid = (_glWindow.model()->histo()->min +
 		 _glWindow.model()->histo()->max) / 2;
 	kshark_convert_nano(tsMid, &sec, &usec);
-	tMid.sprintf("%lu.%lu", sec, usec);
+	tMid.sprintf("%lu.%06lu", sec, usec);
 	_labelXMid.setText(tMid);
 
 	kshark_convert_nano(_glWindow.model()->histo()->max, &sec, &usec);
-	tMax.sprintf("%lu.%lu", sec, usec);
+	tMax.sprintf("%lu.%06lu", sec, usec);
 	_labelXMax.setText(tMax);
 }
 
diff --git a/python/event-viewer.py b/python/event-viewer.py
index 651761a083c9..3a082b81fc3d 100755
--- a/python/event-viewer.py
+++ b/python/event-viewer.py
@@ -203,8 +203,8 @@  class EventView(gtk.TreeView):
             return False
 
         if data == "ts":
-            cell.set_property("markup", "%d.%d" % (ev.ts/1000000000,
-                                                   ev.ts%1000000000))
+            cell.set_property("markup", "%d.%09d" % (ev.ts/1000000000,
+                                                     ev.ts%1000000000))
             data_func_cnt = data_func_cnt + 1
             if app:
                 app.inc_data_func()
diff --git a/python/tracecmd.py b/python/tracecmd.py
index 1267941aa388..f551a1489e25 100644
--- a/python/tracecmd.py
+++ b/python/tracecmd.py
@@ -62,7 +62,7 @@  class Event(object, DictMixin):
         self._format = format
 
     def __str__(self):
-        return "%d.%d CPU%d %s: pid=%d comm=%s type=%d" % \
+        return "%d.%09d CPU%d %s: pid=%d comm=%s type=%d" % \
                (self.ts/1000000000, self.ts%1000000000, self.cpu, self.name,
                 self.num_field("common_pid"), self.comm, self.type)