external/gpgmepp/macos-tdf152524.patch |   38 +++++++++++++++++++++++++++++----
 1 file changed, 34 insertions(+), 4 deletions(-)

New commits:
commit b0656e6ca668a0719fbcb71b6d46c68093dda470
Author:     Patrick Luby <[email protected]>
AuthorDate: Thu Feb 8 09:54:20 2024 -0500
Commit:     Patrick Luby <[email protected]>
CommitDate: Thu Feb 8 18:58:29 2024 +0100

    tdf#152524 use dispatch_async() instead of dispatch_sync()
    
    Commit 839cf255e2670fdf8e974af38432aacf63be4e90 used dispatch_sync()
    but, unfortunately, libdispatch will not create a new thread for the
    queue. dispatch_async_and_wait() also doesn't necessary run the queue
    in a separate thread so use dispatch_async() and block and wait for
    the libdispatch task to complete.
    
    Change-Id: I8babad30caa8a188483ddf4f62bae35f5b888dc8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163122
    Reviewed-by: Caolán McNamara <[email protected]>
    Tested-by: Jenkins
    Reviewed-by: Patrick Luby <[email protected]>

diff --git a/external/gpgmepp/macos-tdf152524.patch 
b/external/gpgmepp/macos-tdf152524.patch
index a69fbd1cf139..ad6fbf8fe9cb 100644
--- a/external/gpgmepp/macos-tdf152524.patch
+++ b/external/gpgmepp/macos-tdf152524.patch
@@ -1,17 +1,18 @@
 --- src/posix-io.c     2023-02-01 11:50:48
 +++ src/posix-io.c     2024-02-05 19:16:00
-@@ -62,6 +62,10 @@
+@@ -62,6 +62,11 @@
  # endif
  #endif
  #include <sys/socket.h>
 +
 +#if HAVE_MACOS_SYSTEM
 +#include <dispatch/dispatch.h>
++#include <pthread.h>
 +#endif
  
  #include "util.h"
  #include "priv-io.h"
-@@ -517,12 +521,50 @@
+@@ -517,12 +522,79 @@
  }
  
  
@@ -38,18 +39,47 @@
 +       * run in a sequential queue in a non-main thread.  */
 +      static dispatch_queue_t queue = NULL;
 +      if (!queue)
-+              queue = dispatch_queue_create ("gpgmepp",
++              queue = dispatch_queue_create ("gpgmeppforkandexec",
 +                                             DISPATCH_QUEUE_CONCURRENT);
 +      if (!queue)
 +              return -1;
 +
 +      __block int ret = -1;
-+      dispatch_sync(queue, ^{
++      __block int done = false;
++      __block pthread_mutex_t waitlock = PTHREAD_MUTEX_INITIALIZER;
++      __block pthread_cond_t waitcond = PTHREAD_COND_INITIALIZER;
++
++      if (pthread_mutex_lock(&waitlock))
++              return -1;
++
++      /* Use dispatch_async() to force the queue to run in a separate
++       * thread.  */
++      dispatch_async(queue, ^{
++              if (pthread_mutex_lock(&waitlock))
++              {
++                      done = true;
++                      pthread_cond_signal(&waitcond);
++                      return;
++              }
++
 +              ret = _gpgme_io_spawn_macos (path, argv, flags,
 +                                           fd_list, atfork,
 +                                           atforkvalue, r_pid);
++
++              done = true;
++              pthread_cond_signal(&waitcond);
++              pthread_mutex_unlock(&waitlock);
 +      });
 +
++      /* dispatch_async_and_wait() doesn't necessarily force the queue
++       * to run in a separate thread so block and until the task has
++       * finished.  */
++      if (!done)
++              pthread_cond_wait(&waitcond, &waitlock);
++      pthread_cond_destroy(&waitcond);
++      pthread_mutex_unlock(&waitlock);
++      pthread_mutex_destroy(&waitlock);
++
 +      return ret;
 +}
 +

Reply via email to