aboutsummaryrefslogtreecommitdiff
path: root/src/ios_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ios_base.cpp')
-rw-r--r--src/ios_base.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/ios_base.cpp b/src/ios_base.cpp
index 4fe7921..2ed71e3 100644
--- a/src/ios_base.cpp
+++ b/src/ios_base.cpp
@@ -27,8 +27,19 @@
*/
#include <ios_base.h>
+#include <new> // for placement new.
+#include <iostream> // For cout, cerr
+#include <ostream>
+#include <streambuf>
+
+// Defined in bionic/libstdc++/src/one_time_construction.cpp
+extern "C" int __cxa_guard_acquire(int volatile * gv);
+extern "C" void __cxa_guard_release(int volatile * gv);
namespace std {
+int ios_base::Init::sGuard = 0;
+bool ios_base::Init::sDone = false;
+
// Implementation of the ios_base, common stuff for all the streams.
ios_base::ios_base()
@@ -52,4 +63,34 @@ streamsize ios_base::width(streamsize width) {
return prev;
}
+// TODO: This is a temporary class used to illustrate how the
+// construction will happen.
+
+class std_filebuf: public streambuf {
+ public:
+ std_filebuf() {}
+ virtual ~std_filebuf() {}
+};
+
+static std_filebuf real_cout;
+static std_filebuf real_cerr;
+
+ios_base::Init::Init() {
+ if (__cxa_guard_acquire(&sGuard) == 1) {
+ if (!sDone) {
+ // Create the global cout and cerr structures. cout/cerr
+ // storage is in ios_globals.cpp.
+ new (&cout) ostream(&real_cout);
+ new (&cerr) ostream(&real_cerr);
+ sDone = true;
+ }
+ __cxa_guard_release(&sGuard);
+ }
+}
+
+ios_base::Init::~Init() {
+ cout.flush();
+ cerr.flush();
+}
+
} // namespace std