forked from qt-creator/qt-creator
QmlProfiler: Support server generated event type IDs
This way we only have to transmit the location and data events once per type, not once per event. Change-Id: Ic6ab9619824764fc8b3abf09c7b58200eda2a198 Reviewed-by: Milian Wolff <milian.wolff@kdab.com> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
@@ -71,7 +71,7 @@ public:
|
|||||||
|
|
||||||
void sendRecordingStatus(int engineId);
|
void sendRecordingStatus(int engineId);
|
||||||
bool updateFeatures(ProfileFeature feature);
|
bool updateFeatures(ProfileFeature feature);
|
||||||
int resolveType(const QmlEventType &type);
|
int resolveType(const QmlTypedEvent &type);
|
||||||
int resolveStackTop();
|
int resolveStackTop();
|
||||||
void processCurrentEvent();
|
void processCurrentEvent();
|
||||||
|
|
||||||
@@ -88,19 +88,31 @@ public:
|
|||||||
// Reuse the same event, so that we don't have to constantly reallocate all the data.
|
// Reuse the same event, so that we don't have to constantly reallocate all the data.
|
||||||
QmlTypedEvent currentEvent;
|
QmlTypedEvent currentEvent;
|
||||||
QHash<QmlEventType, int> eventTypeIds;
|
QHash<QmlEventType, int> eventTypeIds;
|
||||||
|
QHash<qint64, int> serverTypeIds;
|
||||||
QStack<QmlTypedEvent> rangesInProgress;
|
QStack<QmlTypedEvent> rangesInProgress;
|
||||||
};
|
};
|
||||||
|
|
||||||
int QmlProfilerTraceClientPrivate::resolveType(const QmlEventType &type)
|
int QmlProfilerTraceClientPrivate::resolveType(const QmlTypedEvent &event)
|
||||||
{
|
{
|
||||||
QHash<QmlEventType, int>::ConstIterator it = eventTypeIds.constFind(type);
|
|
||||||
|
|
||||||
int typeIndex = -1;
|
int typeIndex = -1;
|
||||||
if (it != eventTypeIds.constEnd()) {
|
if (event.serverTypeId != 0) {
|
||||||
typeIndex = it.value();
|
QHash<qint64, int>::ConstIterator it = serverTypeIds.constFind(event.serverTypeId);
|
||||||
|
|
||||||
|
if (it != serverTypeIds.constEnd()) {
|
||||||
|
typeIndex = it.value();
|
||||||
|
} else {
|
||||||
|
typeIndex = model->addEventType(event.type);
|
||||||
|
serverTypeIds[event.serverTypeId] = typeIndex;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
typeIndex = model->addEventType(type);
|
QHash<QmlEventType, int>::ConstIterator it = eventTypeIds.constFind(event.type);
|
||||||
eventTypeIds[type] = typeIndex;
|
|
||||||
|
if (it != eventTypeIds.constEnd()) {
|
||||||
|
typeIndex = it.value();
|
||||||
|
} else {
|
||||||
|
typeIndex = model->addEventType(event.type);
|
||||||
|
eventTypeIds[event.type] = typeIndex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return typeIndex;
|
return typeIndex;
|
||||||
}
|
}
|
||||||
@@ -115,7 +127,7 @@ int QmlProfilerTraceClientPrivate::resolveStackTop()
|
|||||||
if (typeIndex >= 0)
|
if (typeIndex >= 0)
|
||||||
return typeIndex;
|
return typeIndex;
|
||||||
|
|
||||||
typeIndex = resolveType(typedEvent.type);
|
typeIndex = resolveType(typedEvent);
|
||||||
typedEvent.event.setTypeIndex(typeIndex);
|
typedEvent.event.setTypeIndex(typeIndex);
|
||||||
model->addEvent(typedEvent.event);
|
model->addEvent(typedEvent.event);
|
||||||
return typeIndex;
|
return typeIndex;
|
||||||
@@ -149,7 +161,7 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent()
|
|||||||
rangesInProgress.top().type.location = currentEvent.type.location;
|
rangesInProgress.top().type.location = currentEvent.type.location;
|
||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
int typeIndex = resolveType(currentEvent.type);
|
int typeIndex = resolveType(currentEvent);
|
||||||
currentEvent.event.setTypeIndex(typeIndex);
|
currentEvent.event.setTypeIndex(typeIndex);
|
||||||
model->addEvent(currentEvent.event);
|
model->addEvent(currentEvent.event);
|
||||||
break;
|
break;
|
||||||
@@ -161,8 +173,10 @@ void QmlProfilerTraceClientPrivate::sendRecordingStatus(int engineId)
|
|||||||
{
|
{
|
||||||
QmlDebug::QPacket stream(q->connection()->currentDataStreamVersion());
|
QmlDebug::QPacket stream(q->connection()->currentDataStreamVersion());
|
||||||
stream << recording << engineId; // engineId -1 is OK. It means "all of them"
|
stream << recording << engineId; // engineId -1 is OK. It means "all of them"
|
||||||
if (recording)
|
if (recording) {
|
||||||
stream << requestedFeatures << flushInterval;
|
stream << requestedFeatures << flushInterval;
|
||||||
|
stream << true; // yes, we support type IDs
|
||||||
|
}
|
||||||
q->sendMessage(stream.data());
|
q->sendMessage(stream.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,6 +260,7 @@ void QmlProfilerTraceClient::setRequestedFeatures(quint64 features)
|
|||||||
d->currentEvent.type.message = DebugMessage;
|
d->currentEvent.type.message = DebugMessage;
|
||||||
d->currentEvent.type.rangeType = MaximumRangeType;
|
d->currentEvent.type.rangeType = MaximumRangeType;
|
||||||
d->currentEvent.type.detailType = type;
|
d->currentEvent.type.detailType = type;
|
||||||
|
d->currentEvent.serverTypeId = 0;
|
||||||
d->processCurrentEvent();
|
d->processCurrentEvent();
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ QDataStream &operator>>(QDataStream &stream, QmlTypedEvent &event)
|
|||||||
event.type.data.clear();
|
event.type.data.clear();
|
||||||
event.type.location.filename.clear();
|
event.type.location.filename.clear();
|
||||||
event.type.location.line = event.type.location.column = -1;
|
event.type.location.line = event.type.location.column = -1;
|
||||||
|
event.serverTypeId = 0;
|
||||||
|
|
||||||
switch (messageType) {
|
switch (messageType) {
|
||||||
case Event: {
|
case Event: {
|
||||||
@@ -147,10 +148,12 @@ QDataStream &operator>>(QDataStream &stream, QmlTypedEvent &event)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RangeStart: {
|
case RangeStart: {
|
||||||
// read and ignore binding type
|
if (!stream.atEnd()) {
|
||||||
if (rangeType == Binding && !stream.atEnd()) {
|
qint64 typeId;
|
||||||
qint32 bindingType;
|
stream >> typeId;
|
||||||
stream >> bindingType;
|
if (stream.status() == QDataStream::Ok)
|
||||||
|
event.serverTypeId = typeId;
|
||||||
|
// otherwise it's the old binding type of 4 bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
event.type.message = MaximumMessage;
|
event.type.message = MaximumMessage;
|
||||||
@@ -166,16 +169,21 @@ QDataStream &operator>>(QDataStream &stream, QmlTypedEvent &event)
|
|||||||
event.type.rangeType = rangeType;
|
event.type.rangeType = rangeType;
|
||||||
event.event.setRangeStage(RangeData);
|
event.event.setRangeStage(RangeData);
|
||||||
event.type.detailType = -1;
|
event.type.detailType = -1;
|
||||||
|
if (!stream.atEnd())
|
||||||
|
stream >> event.serverTypeId;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RangeLocation: {
|
case RangeLocation: {
|
||||||
stream >> event.type.location.filename
|
stream >> event.type.location.filename
|
||||||
>> static_cast<qint32 &>(event.type.location.line);
|
>> static_cast<qint32 &>(event.type.location.line);
|
||||||
|
|
||||||
if (!stream.atEnd())
|
if (!stream.atEnd()) {
|
||||||
stream >> static_cast<qint32 &>(event.type.location.column);
|
stream >> static_cast<qint32 &>(event.type.location.column);
|
||||||
else
|
if (!stream.atEnd())
|
||||||
|
stream >> event.serverTypeId;
|
||||||
|
} else {
|
||||||
event.type.location.column = -1;
|
event.type.location.column = -1;
|
||||||
|
}
|
||||||
|
|
||||||
event.type.message = MaximumMessage;
|
event.type.message = MaximumMessage;
|
||||||
event.type.rangeType = rangeType;
|
event.type.rangeType = rangeType;
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ struct QmlTypedEvent
|
|||||||
{
|
{
|
||||||
QmlEvent event;
|
QmlEvent event;
|
||||||
QmlEventType type;
|
QmlEventType type;
|
||||||
|
qint64 serverTypeId = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
QDataStream &operator>>(QDataStream &stream, QmlTypedEvent &event);
|
QDataStream &operator>>(QDataStream &stream, QmlTypedEvent &event);
|
||||||
|
|||||||
Reference in New Issue
Block a user