Alexandre Julliard : server: Try to use /proc/pid/ mem to read process memory since it should be faster.

Alexandre Julliard julliard at winehq.org
Tue Oct 5 14:41:44 CDT 2010


Module: wine
Branch: stable
Commit: ad521cac57d8be07b592f255ee5e802743e62a43
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ad521cac57d8be07b592f255ee5e802743e62a43

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jul 21 10:50:12 2010 +0200

server: Try to use /proc/pid/mem to read process memory since it should be faster.
(cherry picked from commit 1a79912a10a6cded54d1f1de5f746bbffec3ffee)

---

 server/ptrace.c |   20 ++++++++++++++++++++
 1 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/server/ptrace.c b/server/ptrace.c
index 1118048..111368b 100644
--- a/server/ptrace.c
+++ b/server/ptrace.c
@@ -19,9 +19,11 @@
  */
 
 #include "config.h"
+#include "wine/port.h"
 
 #include <assert.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <stdio.h>
 #include <signal.h>
 #include <stdarg.h>
@@ -377,6 +379,24 @@ int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t
 
     if (suspend_for_ptrace( thread ))
     {
+        if (len > 3)  /* /proc/pid/mem should be faster for large sizes */
+        {
+            char procmem[24];
+            int fd;
+
+            sprintf( procmem, "/proc/%u/mem", process->unix_pid );
+            if ((fd = open( procmem, O_RDONLY )) != -1)
+            {
+                ssize_t ret = pread( fd, dest, size, ptr );
+                close( fd );
+                if (ret == size)
+                {
+                    len = 0;
+                    goto done;
+                }
+            }
+        }
+
         if (len > 1)
         {
             if (read_thread_long( thread, addr++, &data ) == -1) goto done;




More information about the wine-cvs mailing list