Made crypto operations faster. gpgol-0.10.17
authorWerner Koch <wk@gnupg.org>
Fri, 14 Nov 2008 08:40:20 +0000 (08:40 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 14 Nov 2008 08:40:20 +0000 (08:40 +0000)
ChangeLog
NEWS
configure.ac
po/de.po
po/sv.po
src/ChangeLog
src/dialogs.rc
src/engine-assuan.c
src/engine.c
src/olflange-dlgs.cpp

index 5306e15..5909f79 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-11-14  Werner Koch  <wk@g10code.com>
+
+       Release 0.10.17.
+
 2008-11-11  Werner Koch  <wk@g10code.com>
 
        Release 0.10.16.
diff --git a/NEWS b/NEWS
index d4076f5..6306842 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,11 @@
+Noteworthy changes for version 0.10.17 (2008-11-14)
+===================================================
+
+ * Minor cleanups.
+
+ * All operations are now somewhat faster.
+
+
 Noteworthy changes for version 0.10.16 (2008-11-11)
 ===================================================
 
index 72cc848..ee472eb 100644 (file)
@@ -16,7 +16,7 @@ min_automake_version="1.9.4"
 # Remember to change the version number immediately *after* a release.
 # Set my_issvn to "yes" for non-released code.  Remember to run an
 # "svn up" and "autogen.sh" right before creating a distribution.
-m4_define([my_version], [0.10.16])
+m4_define([my_version], [0.10.17])
 m4_define([my_issvn], [no])
 
 m4_define([svn_revision], m4_esyscmd([echo -n $( (svn info 2>/dev/null \
index 7d6ade1..85bc6ad 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GpgOL 0.10.0\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2008-11-10 18:05+0100\n"
+"POT-Creation-Date: 2008-11-14 08:48+0100\n"
 "PO-Revision-Date: 2008-11-11 18:15+0100\n"
 "Last-Translator: Werner Koch <wk@gnupg.org>\n"
 "Language-Team: de\n"
@@ -48,7 +48,7 @@ msgstr "GpgOL - Sichern der entschlüsselten Anlage"
 msgid "Debug output (for analysing problems)"
 msgstr "Debugausgabe (zur Problemanalyse)"
 
-#: src/engine.c:428
+#: src/engine.c:392
 msgid ""
 "The user interface server is not available or could not be started in time.  "
 "You may want to try again."
@@ -56,13 +56,13 @@ msgstr ""
 "Die GnuPG Benutzeroberfläche \"Kleopatra\" konnte nicht gefunden oder "
 "rechtzeitig gestartet werden.  Sie sollten es noch einmal versuchen."
 
-#: src/engine.c:431 src/engine.c:441 src/ext-commands.cpp:774
+#: src/engine.c:395 src/engine.c:405 src/ext-commands.cpp:774
 #: src/ext-commands.cpp:795 src/ext-commands.cpp:800 src/main.c:682
 #: src/main.c:688 src/message.cpp:320
 msgid "GpgOL"
 msgstr "GpgOL"
 
-#: src/engine.c:437
+#: src/engine.c:401
 msgid ""
 "The user interface server is not available or does not work.  Using an "
 "internal user interface.\n"
@@ -543,10 +543,6 @@ msgstr "S/MIME per Voreinstellung verwenden"
 msgid "Message receiving"
 msgstr "Lesen von Nachrichten"
 
-#: src/olflange-dlgs.cpp:54
-msgid "Also decrypt in preview window"
-msgstr "Auch im Vorschaufenster entschlüsseln"
-
 #: src/olflange-dlgs.cpp:55
 msgid "Show HTML view if possible"
 msgstr "HTML Darstellung anzeigen wenn möglich"
@@ -781,6 +777,9 @@ msgstr "PGP/MIME Prüfungsresultat"
 msgid "S/MIME Verification Result"
 msgstr "S/MIME Prüfungsresultat"
 
+#~ msgid "Also decrypt in preview window"
+#~ msgstr "Auch im Vorschaufenster entschlüsseln"
+
 #~ msgid "&Decrypt and verify message"
 #~ msgstr "Entschlüsseln/Prüfen der Nachricht"
 
index 1793287..d1b584c 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GPGol\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2008-11-10 18:05+0100\n"
+"POT-Creation-Date: 2008-11-14 08:48+0100\n"
 "PO-Revision-Date: 2006-12-12 23:52+0100\n"
 "Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -48,19 +48,19 @@ msgstr "GPG - Spara dekrypterad bilaga"
 msgid "Debug output (for analysing problems)"
 msgstr ""
 
-#: src/engine.c:428
+#: src/engine.c:392
 msgid ""
 "The user interface server is not available or could not be started in time.  "
 "You may want to try again."
 msgstr ""
 
-#: src/engine.c:431 src/engine.c:441 src/ext-commands.cpp:774
+#: src/engine.c:395 src/engine.c:405 src/ext-commands.cpp:774
 #: src/ext-commands.cpp:795 src/ext-commands.cpp:800 src/main.c:682
 #: src/main.c:688 src/message.cpp:320
 msgid "GpgOL"
 msgstr ""
 
-#: src/engine.c:437
+#: src/engine.c:401
 msgid ""
 "The user interface server is not available or does not work.  Using an "
 "internal user interface.\n"
@@ -502,10 +502,6 @@ msgstr ""
 msgid "Message receiving"
 msgstr ""
 
-#: src/olflange-dlgs.cpp:54
-msgid "Also decrypt in preview window"
-msgstr ""
-
 #: src/olflange-dlgs.cpp:55
 msgid "Show HTML view if possible"
 msgstr ""
index 81de742..aea998c 100644 (file)
@@ -1,3 +1,18 @@
+2008-11-14  Werner Koch  <wk@g10code.com>
+
+       * dialogs.rc: Remove preview-decrypt check button.
+       * olflange-dlgs.cpp (set_labels): Ditto.
+
+2008-11-13  Werner Koch  <wk@g10code.com>
+
+       * engine.c (FILTER_BUFFER_SIZE): Increase from 4k to 128k.
+       (switch_threads, clear_switch_threads): Remove.
+       (engine_filter): Pulse event only if anything happened.  Break
+       loop if input data has been put completely into the buffer.  Add a
+       short delay for an idle loop.
+       * engine-assuan.c (work_item_s): Increase buffer from 1k to 8k.
+       (switch_threads, clear_switch_threads): Remove.
+
 2008-11-10  Werner Koch  <wk@g10code.com>
 
        * engine.c (engine_init): Allow the user to try again if the
        * message.cpp (message_decrypt): Save a signature verification
        result.
        * mimeparser.c (mime_decrypt): Implement verification of included
-       signatrues.  This feature got lost during the removal of nested
+       signatures.  This feature got lost during the removal of nested
        crypto operations.
 
 2008-08-04  Werner Koch  <wk@g10code.com>
index f1ce3fe..6b00caf 100644 (file)
@@ -72,19 +72,21 @@ BEGIN
 
     /* Receive options box.  */
     GROUPBOX        "recv-options", IDC_G_RECV,
-                    9, 104, 250, 47
+                    9, 104, 250, 36
 
-    CONTROL         "preview-decrypt", IDC_PREVIEW_DECRYPT,
-                    "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
-                    24, 114, 215, 10
+  /* We have no reliable way to detect the preview window, thus we
+     don't show this option.  */
+/*     CONTROL         "preview-decrypt", IDC_PREVIEW_DECRYPT, */
+/*                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP, */
+/*                     24, 114, 215, 10 */
 
     CONTROL         "prefer-html", IDC_PREFER_HTML,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
-                    24, 125, 215, 10
+                    24, 114, 215, 10
  
     CONTROL         "body-as-attachment", IDC_BODY_AS_ATTACHMENT,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
-                    24, 136, 215, 10
+                    24, 125, 215, 10
  
     /* Stuff below the group boxes.  */
     LTEXT           "GpgOL by g10 Code GmbH", IDC_STATIC, 
index e6352f1..f904021 100644 (file)
@@ -111,9 +111,7 @@ struct work_item_s
                                     the item is removed from the
                                     queue.  */
   OVERLAPPED ov;     /* The overlapped info structure.  */
-  char buffer[1024]; /* The buffer used by ReadFile or WriteFile.  */
-
-  ULONG switch_counter; /* Used by switch_threads.  */
+  char buffer[8192]; /* The buffer used by ReadFile or WriteFile.  */
 };
 
 
@@ -662,38 +660,6 @@ attach_thread_input (DWORD other_tid)
 #endif /* not used.  */
 
 
-/* This is a wraper around SwitchToThread, a syscall we unfortunately
-   need due to the lack of an sophisticated event system.  The wrapper
-   calls SwitchToThread but after a couple of immediate folliwing
-   switches, it introduces a short delays.  */
-static void
-switch_threads (work_item_t item)
-{
-  ULONG count;
-
-  count = InterlockedExchangeAdd (&item->switch_counter, 1);
-  if (count > 5)
-    {
-      /* Tried too often without success.  Use Sleep until
-         clear_switch_threads has been called.  */
-      InterlockedExchange (&item->switch_counter, 5);
-      SleepEx (60, TRUE); 
-    }
-  else if (!SwitchToThread ())
-    {
-      /* No runable other thread: Fall asleep. */
-      SleepEx (8, TRUE);
-    }
-}
-
-/* Call this fucntion if some action has been done.  */
-static void
-clear_switch_threads (work_item_t item)
-{
-  InterlockedExchange (&item->switch_counter, 0);
-}
-
-
 
 \f
 /* Helper to write to the callback.  */
@@ -733,9 +699,10 @@ write_to_callback (work_item_t item, DWORD nbytes)
     }
 }
 
-/* Helper for async_worker_thread.  Returns true if the item's handle
-   needs to be put on the wait list.  This is called with the worker
-   mutex hold. */
+/* Helper for async_worker_thread: Read data from the server and pass
+   it on to the caller.  Returns true if the item's handle needs to be
+   put on the wait list.  This is called with the worker mutex
+   hold. */
 static int
 worker_start_read (work_item_t item)
 {
@@ -781,8 +748,9 @@ worker_start_read (work_item_t item)
   return retval;
 }
 
-/* Result checking helper for async_worker_thread.  This is called with
-   the worker mutex hold.  */
+/* Result checking helper for async_worker_thread:  Take data from the
+   server and pass it on to the caller.  This is called with the
+   worker mutex hold.  */
 static void
 worker_check_read (work_item_t item, DWORD nbytes)
 {
@@ -815,12 +783,10 @@ worker_start_write (work_item_t item)
           if (debug_ioworker_extra)
             log_debug ("%s:%s: [%s:%p] EAGAIN received from callback",
                        SRCNAME, __func__, item->name, item->hd);
-          switch_threads (item);
           retval = 1;
         }
       else
         {
-          clear_switch_threads (item);
           log_error ("%s:%s: [%s:%p] error reading from callback: %s",
                      SRCNAME, __func__, item->name, item->hd,strerror (errno));
           item->got_error = 1;
@@ -828,7 +794,6 @@ worker_start_write (work_item_t item)
     }
   else if (!nread)
     {
-      clear_switch_threads (item);
       if (debug_ioworker)
         log_debug ("%s:%s: [%s:%p] EOF received from callback",
                    SRCNAME, __func__, item->name, item->hd);
@@ -836,7 +801,6 @@ worker_start_write (work_item_t item)
     }
   else 
     {                  
-      clear_switch_threads (item);
       if (WriteFile (item->hd, item->buffer, nread, &nbytes, &item->ov))
         {
           if (nbytes < nread)
@@ -1095,7 +1059,7 @@ async_worker_thread (void *dummy)
             {
               /* An overlapped I/O result is available.  Check that
                  the returned number of bytes are plausible and clear
-                 the I/O pending flag of this work item.  For a read
+                 the I/O pending flag of this work item.  For a read
                  item worker_check_read forwards the received data to
                  the caller.  */
               if (item->writing)
index 74024ef..cb8cd67 100644 (file)
@@ -34,7 +34,7 @@
 #include "engine-assuan.h"
 
 
-#define FILTER_BUFFER_SIZE 4096
+#define FILTER_BUFFER_SIZE (128*1024)
 
 
 #define TRACEPOINT() do { log_debug ("%s:%s:%d: tracepoint\n", \
@@ -106,9 +106,6 @@ struct engine_filter_s
      engine_encrypt_start.  */
   struct engine_assuan_encstate_s *encstate;
 
-  /* Counter used to optimize voluntary thread switching. */
-  ULONG switch_counter;
-
   /* Optional data to be passed to the backend to help the server
      display a useful title and to associate operations with one OL
      task.  */
@@ -210,36 +207,6 @@ release_filter (engine_filter_t filter)
 }
 
 
-/* This is a wraper around SwitchToThread, a syscall we unfortunately
-   need due to the lack of an sophisticated event system.  The wrapper
-   calls SwitchToThread but after a couple of immediate folliwing
-   switches, it introduces a short delays.  */
-static void
-switch_threads (engine_filter_t filter)
-{
-  ULONG count;
-
-  count = InterlockedExchangeAdd (&filter->switch_counter, 1);
-  if (count > 5)
-    {
-      InterlockedExchange (&filter->switch_counter, 5);
-      SleepEx (50, TRUE); 
-    }
-  else if (!SwitchToThread ())
-    {
-      /* No runable other thread: Fall asleep. */
-      SleepEx (5, TRUE);
-    }
-}
-
-/* Call this fucntion if some action has been done.  */
-static void
-clear_switch_threads (engine_filter_t filter)
-{
-  InterlockedExchange (&filter->switch_counter, 0);
-}
-
-
 /* This read callback is used by GPGME to read data from a filter
    object.  The function should return the number of bytes read, 0 on
    EOF, and -1 on error.  If an error occurs, ERRNO should be set to
@@ -276,11 +243,8 @@ filter_gpgme_read_cb (void *handle, void *buffer, size_t size)
           if (debug_filter_extra)
             log_debug ("%s:%s: filter %p: leave; result=EAGAIN\n",
                        SRCNAME, __func__, filter);
-          switch_threads (filter);
           return -1;
         }
-      else
-        clear_switch_threads (filter);
       if (debug_filter)
         log_debug ("%s:%s: filter %p: waiting for in.condvar\n",
                    SRCNAME, __func__, filter);
@@ -505,11 +469,11 @@ engine_filter (engine_filter_t filter, const void *indata, size_t indatalen)
                SRCNAME, __func__, indata, (int)indatalen, filter->outfnc); 
   for (;;)
     {
-      int any;
+      int any, anyany;
 
       /* If there is something to write out, do this now to make space
          for more data.  */
-      any = 0;
+      any = anyany = 0;
       take_out_lock (filter, __func__);
       while (filter->out.length)
         {
@@ -530,17 +494,13 @@ engine_filter (engine_filter_t filter, const void *indata, size_t indatalen)
             memmove (filter->out.buffer, filter->out.buffer + nbytes,
                      filter->out.length - nbytes); 
           filter->out.length -= nbytes;
-          any = 1;
+          any = anyany = 1;
         }
-      if (!PulseEvent (filter->out.condvar))
+      if (any && !PulseEvent (filter->out.condvar))
         log_error_w32 (-1, "%s:%s: PulseEvent(%p)[out] failed", 
                        SRCNAME, __func__, filter->out.condvar);
       release_out_lock (filter, __func__);
 
-      if (any)
-        clear_switch_threads (filter);
-      else
-        switch_threads (filter);
 
       any = 0;
       take_in_lock (filter, __func__);
@@ -576,6 +536,9 @@ engine_filter (engine_filter_t filter, const void *indata, size_t indatalen)
           indatalen -= tmplen;
           any = 1;
         }
+      if (any && !PulseEvent (filter->in.condvar))
+        log_error_w32 (-1, "%s:%s: PulseEvent(%p)[in] failed", 
+                       SRCNAME, __func__, filter->in.condvar);
       /* Terminate the loop if the filter queue is empty OR the filter
          is ready and there is nothing left for output.  */
       if (!filter->in.length || (filter->in.ready && !filter->out.length))
@@ -584,14 +547,23 @@ engine_filter (engine_filter_t filter, const void *indata, size_t indatalen)
           err = filter->in.status;
           break;  /* the loop.  */
         }
-      if (!PulseEvent (filter->in.condvar))
-        log_error_w32 (-1, "%s:%s: PulseEvent(%p)[in] failed", 
-                       SRCNAME, __func__, filter->in.condvar);
       release_in_lock (filter, __func__);
-      if (any)
-        clear_switch_threads (filter);
-      else
-        switch_threads (filter);
+
+      /* Also terminate the loop if we have no more data.  This is to
+         allow this threrad to gather more data and to fill up the
+         buffer while I/O is still going on in the other thread.  */
+      if (!indatalen)
+        {
+          err = 0;
+          break;  /* the loop.  */
+        }
+
+      /* In case we did not do anything, we wait for a short while to
+         relieve the CPU from spinning.  This usually happens while
+         the UI-server is waiting for a user response and thus a short
+         delay does not harm.  */
+      if (!anyany)
+        SleepEx (10, TRUE);
     }
 
   if (debug_filter)
index d686d4b..69c148b 100644 (file)
@@ -51,7 +51,7 @@ set_labels (HWND dlg)
     { IDC_SMIME_DEFAULT,    N_("Use S/MIME by default")},
 
     { IDC_G_RECV,           N_("Message receiving")},
-    { IDC_PREVIEW_DECRYPT,  N_("Also decrypt in preview window")},
+//     { IDC_PREVIEW_DECRYPT,  N_("Also decrypt in preview window")},
     { IDC_PREFER_HTML,      N_("Show HTML view if possible")},
     { IDC_BODY_AS_ATTACHMENT, N_("Present encrypted message as attachment")},
 
@@ -132,7 +132,7 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
            case IDC_SIGN_DEFAULT:
            case IDC_OPENPGP_DEFAULT:
            case IDC_SMIME_DEFAULT:
-           case IDC_PREVIEW_DECRYPT:
+//         case IDC_PREVIEW_DECRYPT:
              SendMessage (GetParent (hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
              break;
            }
@@ -191,8 +191,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
           SendDlgItemMessage (hDlg, IDC_SMIME_DEFAULT, BM_SETCHECK, 
                               smime_state, 0L);
           
-          SendDlgItemMessage (hDlg, IDC_PREVIEW_DECRYPT, BM_SETCHECK,
-                              !!opt.preview_decrypt, 0L);
+//           SendDlgItemMessage (hDlg, IDC_PREVIEW_DECRYPT, BM_SETCHECK,
+//                               !!opt.preview_decrypt, 0L);
           SendDlgItemMessage (hDlg, IDC_PREFER_HTML, BM_SETCHECK,
                                !!opt.prefer_html, 0L);
           SendDlgItemMessage (hDlg, IDC_BODY_AS_ATTACHMENT, BM_SETCHECK,
@@ -230,8 +230,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
           else
             opt.default_protocol = PROTOCOL_UNKNOWN;
             
-          opt.preview_decrypt = !!SendDlgItemMessage
-            (hDlg, IDC_PREVIEW_DECRYPT, BM_GETCHECK, 0, 0L);
+//           opt.preview_decrypt = !!SendDlgItemMessage
+//             (hDlg, IDC_PREVIEW_DECRYPT, BM_GETCHECK, 0, 0L);
           opt.prefer_html = !!SendDlgItemMessage
             (hDlg, IDC_PREFER_HTML, BM_GETCHECK, 0, 0L);
           opt.body_as_attachment = !!SendDlgItemMessage