From d0ddc11c09c93f07e5553c9e3b385bbe7bf04eb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Wed, 13 Nov 2013 13:56:58 +0100 Subject: [PATCH] libc: use File_descriptor::lock in pread/pwrite Replace the static lock with the file descriptor lock because recursive calls of p{read,write} would result in a deadlock when using multiple libc-plugins at the same time. Fixes #948. --- libports/src/lib/libc/pread_pwrite.cc | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/libports/src/lib/libc/pread_pwrite.cc b/libports/src/lib/libc/pread_pwrite.cc index 346bdea711..2b07ad04a3 100644 --- a/libports/src/lib/libc/pread_pwrite.cc +++ b/libports/src/lib/libc/pread_pwrite.cc @@ -13,6 +13,7 @@ /* Genode includes */ #include +#include /* libc includes */ #include @@ -20,31 +21,32 @@ #include -static Genode::Lock rw_lock; - - struct Read { - ssize_t operator()(int fd, void *buf, size_t count) - { - return read(fd, buf, count); - } + ssize_t operator()(int fd, void *buf, size_t count) + { + return read(fd, buf, count); + } }; struct Write { - ssize_t operator()(int fd, const void *buf, size_t count) - { - return write(fd, buf, count); - } + ssize_t operator()(int fd, const void *buf, size_t count) + { + return write(fd, buf, count); + } }; template static ssize_t pread_pwrite_impl(Rw_func rw_func, int fd, Buf_type buf, ::size_t count, ::off_t offset) { - Genode::Lock_guard rw_lock_guard(rw_lock); + Libc::File_descriptor *fdesc = Libc::file_descriptor_allocator()->find_by_libc_fd(fd); + if (fdesc == 0) + return -1; + + Genode::Lock_guard rw_lock_guard(fdesc->lock); off_t old_offset = lseek(fd, 0, SEEK_CUR);