This introduces a mini-state-"machine" to handle RunControl states
Intialized->[Starting->Running->Stopping->Stopped->]*->Finished.
Needing time between trying to start and getting feedback is nowadays
the normal setup for all remote targets as well as for most local tools.
Making that the default for all runs simplifies the code and provides an
opportunity to (a) fix some currently wrong reports of "stopped
immediately" and (b) to remove target-specific (WinRT) or tool-specific
(Valgrind, GammaRay) state members doing essentially the same.
Change-Id: I7f52fee41144188ee8389e922fdc265f8c0a6459
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
If we pop an event from the stack, then it should be the same type we
pushed earlier.
Change-Id: If4389cb57fa8996b3772fefca92d27c33dc35c65
Task-number: QTCREATORBUG-17885
Reviewed-by: hjk <hjk@qt.io>
If many events start or end at the same time, the parser would confuse
their order, resulting in meaningless statistics.
Change-Id: I05f94e694c16d6c22b6e937c2f979ce572a068d1
Task-number: QTCREATORBUG-17885
Reviewed-by: hjk <hjk@qt.io>
In pathological cases we might get event types without any calls.
Change-Id: Id5c9f02c95b60fe49a7cbbac511c3727ade71db0
Task-number: QTCREATORBUG-17885
Reviewed-by: hjk <hjk@qt.io>
The text marks are added to the document from their ctor. The document
then uses the widthFactor to calculate the space needed for them. If the
widthFactor is only set afterwards, the calculated space is wrong.
Change-Id: Ic7d24f99cc78d1bf084b2b1cfdf6b955496072f3
Task-number: QTCREATORBUG-17833
Reviewed-by: hjk <hjk@qt.io>
This patch adds the missing include statements for QRegExp.
Change-Id: Ibb03b929940adb84ae190b5090cb6b88653cc14c
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Provide protected methods in RunControl to handle the notification
of when the RunControl starts and stops. Use these helpers to
move the isRunning() method into the RunConfiguration itself instead
of reimplementing it everywhere.
Change-Id: Ia8de42f7a6a14a049870d4e7fcb9af6756c2caa4
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
There is no need to keep them separate as the data model is not
accessed from the outside anymore. This removes a lot of indirection.
Change-Id: I91da4dfa816295300c8cfcca22430d5c5b3298c0
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
We keep it private to QmlProfilerModelManager and proxy the last few
methods that were directly called on the model. This enables us to
remove the QmlProfilerDataModel class by integrating what is left of it
into QmlProfilerModelManagerPrivate in a next step.
Change-Id: Ie9b4e03fb286e5a0040374d00b7b26f810426278
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
The inserting of events into the buffer is not the bottleneck here.
The book keeping is probably more expensive than just always using
all the events contained in a chuck from the file for one batch.
Change-Id: I75a936fdf9e3a1d9675b44d67b98f14594f87ffd
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
If we cannot open a temporary file to cache a trace or retrieve a
previously cached trace, the QML profiler won't work correctly. Show
an error in this case.
Change-Id: I468d74d9c33033b9ad19501bccbd69a9fe164fed
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
* Clear the trace and send the loadingFinished() signal when loading
fails or is canceled. loadingFinished() re-enables the UI, which is
in fact important.
* Check more consistently for whether the operation was canceled and
add a separate signal for that.
* When saving fails or is canceled, remove the half-written file.
* Don't try to guess the number of events for progress reporting when
saving. Use the event timestamps and start/end time instead.
* Properly initialize the progress range in all cases.
* Drop the bool return value from the load methods. Nobody uses that.
* Send loadFinished() only after loading a file, not every time we
reach the Done state.
Change-Id: I507f11c667e20534ea335e84798de11aa06fb6f2
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
foreach() is slow in hot loops like these. Also, by moving frequently
used children to the front we reduce the effort to find them in
further iterations.
Change-Id: Ib5dceb82511fdd1cb59c50e1ab2485f5035fbef8
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
The total time taken for a program should be the sum of durations of
events on the bottom of the stack. This is also what the flame graph
model does, and it results in useful percentages for total and self
times.
Recursion still has to be accounted for when showing the total time of
a specific event type, but we mark events with recursive calls and
show the time and percentage of recursion in the tooltip. As we already
showed binding loops on bindings and signal handlers before, this
integrates nicely.
Change-Id: Id4654e314bf86ce8bd06ceaaf93a67187c629adc
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
The text marks are little labels next to the lines in the editor
that tell you how much of total run time was spent in the
respective QML/JS construct during the last profiling session.
This is similar to what the valgrind profiler does.
We add the text marks only when the documents are loaded into an
editor. This keeps the number of text marks manageable. Multiple
events on a single line are shown using a tooltip.
Task-number: QTCREATORBUG-17757
Change-Id: Ie38b8ab880a718a1ef72ef343d84070ab34bc5bc
Reviewed-by: hjk <hjk@qt.io>
There is no line 0, so if the document is already open, the editor
won't move to the beginning. Use line 1 instead, so that we jump to the
location of the corresponding text mark.
Change-Id: I0c5605d2d48b02d73dd97ddc87a527cf1b5dba8f
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
We never do anything useful with it. This relieves us from the need to
keep the manager around in the QML model and decouples them.
Change-Id: If58fc147b86b07f533aeaaa896f3416d4c0ef6bb
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This is the place where we need it most. In addition, this allows us to
use the DetailsRewriter's cache also on gotoSourceLocation.
Change-Id: I14e0f11ba7c8a2a3888b2e8439a375068b36e29a
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This is the logical place to do it. Adding the event first to the QML
model and then passing it back to the manager in order to have it
dispatched to the other models is somewhat backwards.
Change-Id: I64b1cb38f97331b62d83fa5ae49b9b2690810d40
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Both wrap the corresponding Qt class, but make sure all temporary files
or directories are created inside a "master temporary directory".
Change-Id: I55461be507c828c965224c02863ea5ed9bbf9498
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Since the cache size is not given for individual file events anymore,
the test should only check it for the events in row 1.
Change-Id: Idfc7ec90ab8da214f4eedce36dd3b84fb00ed553
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
... instead of guessing it. This is more robust.
Change-Id: I4855b78da23cb1caefa3a7a95bfa60c5733b32c5
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
For traces that start at a high timestamp, we want the timestamps to
still have some meaning. Without context the formatter will only
print something like "5h 25m" for all of them, which is not very
useful.
Change-Id: I7ec37659083f967c9ed03a843f6b7c9430214670
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This tests that the file name is correctly stored in the model and it
removes the detour via the model manager.
Change-Id: Icc592b6383edcb18bfe31a81eb7ae0736a4f5508
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
There is no need to keep empty events at the bottom.
Change-Id: I072b50329a9f277005cbfa45350c060abd7e7a36
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
... and make the default size 0, rather than -1. Showing cache sizes
for individual pixmaps doesn't make much sense as other pixmaps might
get loaded at the same time.
Task-number: QTCREATORBUG-17424
Change-Id: Iead21c21d87b454ef03961d22119e0f5351d11ea
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
No need to invent a new name for the same thing.
Change-Id: I370ec7be9c762642ae35e4f7a60ff9f5eb8ae3fe
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
They should bei in line with how we call the event types in other
places.
Change-Id: Id6a5a42bdf745d6827deeca713a0e78c5fae4783
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
And then, drop some methods we don't need anymore.
Change-Id: I057bdc012072abddca2df83918ee9a0460f78611
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
There is not need to constantly loop all the requests. We can simply
hash them by file name. Also, we only need one container for file names
and requests, and we don't need to construct a QTextStream, just to do
QString::mid(), and the connecting and disconnecting to/from the QML
code model needs to be centralized.
Change-Id: I6a887f3375f0534e4b8fab6613882038ea4ddf43
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
It's internal, so we don't need to hide it behind a d pointer.
Change-Id: Ib5b7ac790a1c143414a7ed11e06a5d8a9464de55
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
We should use it for all time printing instead of duplicating the code
everywhere.
Change-Id: I530baa31fd7044aefce6201fec0ab27c99a61a1d
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>