xcb: avoid unnecessary InternAtom requests

QXcbConnection::internAtom() creates the atom if it does not exist. The
lifetime of an atom is not tied to the interning client. Atoms remain
defined until server reset (lost connection, restart).

So create the atom once via QXcbConnection::initializeAllAtoms(), and
later fetch the atom value from local array, instead of repeating
InternAtom requests.

Change-Id: I3cae21895febad6e5daf8c32e72612202baaad64
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
bb10
Gatis Paeglis 2018-08-03 15:00:39 +02:00
parent b9a0276a79
commit 0e63111416
5 changed files with 18 additions and 12 deletions

View File

@ -832,7 +832,7 @@ xcb_generic_event_t *QXcbClipboard::waitForClipboardEvent(xcb_window_t window, i
}
// process other clipboard events, since someone is probably requesting data from us
auto clipboardAtom = connection()->internAtom("CLIPBOARD");
auto clipboardAtom = atom(QXcbAtom::CLIPBOARD);
e = connection()->checkEvent([clipboardAtom](xcb_generic_event_t *event, int type) {
xcb_atom_t selection = XCB_ATOM_NONE;
if (type == XCB_SELECTION_REQUEST)

View File

@ -1964,6 +1964,10 @@ static const char * xcb_atomnames = {
"_COMPIZ_DECOR_DELETE_PIXMAP\0"
"_COMPIZ_TOOLKIT_ACTION\0"
"_GTK_LOAD_ICONTHEMES\0"
"AT_SPI_BUS\0"
"EDID\0"
"EDID_DATA\0"
"XFree86_DDC_EDID1_RAWDATA\0"
// \0\0 terminates loop.
};

View File

@ -295,6 +295,12 @@ namespace QXcbAtom {
_COMPIZ_TOOLKIT_ACTION,
_GTK_LOAD_ICONTHEMES,
AT_SPI_BUS,
EDID,
EDID_DATA,
XFree86_DDC_EDID1_RAWDATA,
NAtoms
};
}

View File

@ -408,7 +408,7 @@ void *QXcbNativeInterface::atspiBus()
QXcbIntegration *integration = static_cast<QXcbIntegration *>(QGuiApplicationPrivate::platformIntegration());
QXcbConnection *defaultConnection = integration->defaultConnection();
if (defaultConnection) {
xcb_atom_t atspiBusAtom = defaultConnection->internAtom("AT_SPI_BUS");
auto atspiBusAtom = defaultConnection->atom(QXcbAtom::AT_SPI_BUS);
auto reply = Q_XCB_REPLY(xcb_get_property, defaultConnection->xcb_connection(),
false, defaultConnection->rootWindow(),
atspiBusAtom, XCB_ATOM_STRING, 0, 128);

View File

@ -906,16 +906,12 @@ QByteArray QXcbScreen::getEdid() const
return result;
// Try a bunch of atoms
xcb_atom_t atom = connection()->internAtom("EDID");
result = getOutputProperty(atom);
if (result.isEmpty()) {
atom = connection()->internAtom("EDID_DATA");
result = getOutputProperty(atom);
}
if (result.isEmpty()) {
atom = connection()->internAtom("XFree86_DDC_EDID1_RAWDATA");
result = getOutputProperty(atom);
}
result = getOutputProperty(atom(QXcbAtom::EDID));
if (result.isEmpty())
result = getOutputProperty(atom(QXcbAtom::EDID_DATA));
if (result.isEmpty())
result = getOutputProperty(atom(QXcbAtom::XFree86_DDC_EDID1_RAWDATA));
return result;
}