Patchwork [v3] libstdc++/57920

login
register
mail settings
Submitter Paolo Carlini
Date July 22, 2013, 12:07 p.m.
Message ID <51ED2095.9000403@oracle.com>
Download mbox | patch
Permalink /patch/260643/
State New
Headers show

Comments

Paolo Carlini - July 22, 2013, 12:07 p.m.
Hi,

see audit trail for details. I tested on x86_64-linux (with/without 
_GLIBCXX_X86_RDRAND artificially undefined) the below straightforward 
patch and checked by hand the strace. I'm going to apply it soon.

Thanks,
Paolo.

///////////////////
2013-07-22  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57920
	* src/c++11/random.cc (random_device::_M_getval): If possible, use
	read instead of std::fread.
	* include/std/random: Do not include <cstdio> unnecessarily.

Patch

Index: include/std/random
===================================================================
--- include/std/random	(revision 201122)
+++ include/std/random	(working copy)
@@ -36,7 +36,6 @@ 
 #else
 
 #include <cmath>
-#include <cstdio>
 #include <cstdlib>
 #include <string>
 #include <iosfwd>
Index: src/c++11/random.cc
===================================================================
--- src/c++11/random.cc	(revision 201122)
+++ src/c++11/random.cc	(working copy)
@@ -30,7 +30,12 @@ 
 # include <cpuid.h>
 #endif
 
+#include <cstdio>
 
+#ifdef _GLIBCXX_HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 
@@ -126,8 +131,12 @@ 
 #endif
 
     result_type __ret;
+#ifdef _GLIBCXX_HAVE_UNISTD_H
+    read(fileno(_M_file), reinterpret_cast<void*>(&__ret), sizeof(result_type));
+#else
     std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type),
 	       1, _M_file);
+#endif
     return __ret;
   }