Module: wine Branch: stable Commit: ad521cac57d8be07b592f255ee5e802743e62a43 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ad521cac57d8be07b592f255ee...
Author: Alexandre Julliard julliard@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;