Skip to content

Commit

Permalink
glib: add patch to improve gsocket performance
Browse files Browse the repository at this point in the history
  • Loading branch information
nacho committed Sep 10, 2024
1 parent b7f9ed3 commit b66db11
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
From cfdb60d11d353b2dce440edd54cfaac84f7356ab Mon Sep 17 00:00:00 2001
From: Silvio Lazzeretti <silvio.lazzeretti@gmail.com>
Date: Thu, 22 Aug 2024 09:16:34 +0200
Subject: [PATCH] gsocket windows: check event before calling
WSAEnumNetworkEvents

The WSAEnumNetworkEvents API is called every time the socket
needs to be checked for status changes. Doing this in an application
with several sockets could generate a high cpu usage since
this call is done for each socket at each iteration of the main loop.
Since there is also a WSAEvent that gets signaled when there is
a change in the status of the socket, checking its status and
calling the WSAEnumNetworkEvents API only if the event is signaled,
can reduce the overall cpu usage.
---
gio/gsocket.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/gio/gsocket.c b/gio/gsocket.c
index ccb5958f7..c36ca62f4 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -4107,9 +4107,8 @@ update_condition_unlocked (GSocket *socket)
GIOCondition condition;

if (!socket->priv->closed &&
- WSAEnumNetworkEvents (socket->priv->fd,
- socket->priv->event,
- &events) == 0)
+ (WSAWaitForMultipleEvents (1, &socket->priv->event, FALSE, 0, FALSE) == WSA_WAIT_EVENT_0) &&
+ (WSAEnumNetworkEvents (socket->priv->fd, socket->priv->event, &events) == 0))
{
socket->priv->current_events |= events.lNetworkEvents;
if (events.lNetworkEvents & FD_WRITE &&
--
2.40.0.windows.1

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
From cfdb60d11d353b2dce440edd54cfaac84f7356ab Mon Sep 17 00:00:00 2001
From: Silvio Lazzeretti <silvio.lazzeretti@gmail.com>
Date: Thu, 22 Aug 2024 09:16:34 +0200
Subject: [PATCH] gsocket windows: check event before calling
WSAEnumNetworkEvents

The WSAEnumNetworkEvents API is called every time the socket
needs to be checked for status changes. Doing this in an application
with several sockets could generate a high cpu usage since
this call is done for each socket at each iteration of the main loop.
Since there is also a WSAEvent that gets signaled when there is
a change in the status of the socket, checking its status and
calling the WSAEnumNetworkEvents API only if the event is signaled,
can reduce the overall cpu usage.
---
gio/gsocket.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/gio/gsocket.c b/gio/gsocket.c
index ccb5958f7..c36ca62f4 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -4107,9 +4107,8 @@ update_condition_unlocked (GSocket *socket)
GIOCondition condition;

if (!socket->priv->closed &&
- WSAEnumNetworkEvents (socket->priv->fd,
- socket->priv->event,
- &events) == 0)
+ (WSAWaitForMultipleEvents (1, &socket->priv->event, FALSE, 0, FALSE) == WSA_WAIT_EVENT_0) &&
+ (WSAEnumNetworkEvents (socket->priv->fd, socket->priv->event, &events) == 0))
{
socket->priv->current_events |= events.lNetworkEvents;
if (events.lNetworkEvents & FD_WRITE &&
--
2.40.0.windows.1

2 changes: 2 additions & 0 deletions gvsbuild/projects/glib.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def __init__(self):
],
patches=[
"001-glib-package-installation-directory.patch",
"0001-gsocket-windows-check-event-before-calling-WSAEnumNe.patch",
],
)
self.add_param("-Dman-pages=disabled")
Expand Down Expand Up @@ -70,6 +71,7 @@ def __init__(self):
dependencies=["glib-base"],
patches=[
"001-glib-package-installation-directory.patch",
"0001-gsocket-windows-check-event-before-calling-WSAEnumNe.patch",
],
)
self.add_param("-Dman-pages=disabled")
Expand Down

0 comments on commit b66db11

Please sign in to comment.