TEST(UnitTestTeeStreambuf, UnitTest) { stk::tee_streambuf out_tee_streambuf; std::ostream my_out(&out_tee_streambuf); std::ostringstream dest1; std::ostringstream dest2; out_tee_streambuf.add(&dest1); out_tee_streambuf.add(&dest2); std::string message1("This is a test"); std::string message2("This is a test"); std::string message3 = message1 + message2; my_out << message1; ASSERT_EQ((dest1.str() == message1), true); ASSERT_EQ((dest2.str() == message1), true); out_tee_streambuf.remove(&dest2); my_out << message2; ASSERT_EQ((dest1.str() == message3), true); ASSERT_EQ((dest2.str() == message1), true); out_tee_streambuf.remove(&dest1); my_out << message2; ASSERT_EQ((dest1.str() == message3), true); ASSERT_EQ((dest2.str() == message1), true); }
void IOProcess::Exec(const ProcessArgs &args) { if (started) throw IOException("Process already started: operation cancelled.", ECANCELED); IOPipe my_std_in(pipe_timeout), my_std_out(pipe_timeout), my_std_err(pipe_timeout); Descriptor my_in(in), my_out(out), my_err(err); if (in.GetNumber() == -1) { my_std_in.Open(); my_in = my_std_in.GetReadDescriptor(); } if (out.GetNumber() == -1) { my_std_out.Open(); my_out = my_std_out.GetWriteDescriptor(); } if (err.GetNumber() == -1) { my_std_err.Open(); my_err = my_std_err.GetWriteDescriptor(); } // if we get here, no exceptions have been thrown, so all of the pipes and descriptors are open pid_t forked = fork(); if (forked == -1) throw IOException::MakeException("Error encountered during fork() call", errno); if (forked == 0) // child { // once we've gotten here, we can't throw exceptions // there is no way to communicate back to the parent that we've failed // our only option is to exit() and hope for the best if (my_in.GetNumber() != 0) dup2(my_in.GetNumber(), 0); if (my_out.GetNumber() != 1) dup2(my_out.GetNumber(), 1); if (my_err.GetNumber() != 2) dup2(my_err.GetNumber(), 2); my_in = Descriptor::invalid; // close the original file descriptors (0, 1, 2 remain open) my_out = Descriptor::invalid; // we have to do this here since they are not destructed the normal way, since we never return my_err = Descriptor::invalid; my_std_in.Close(); my_std_out.Close(); my_std_err.Close(); execvp(args.GetName(), const_cast<char * const *>(args.GetArgList())); // safe const_cast, see http://stackoverflow.com/questions/19505360/ _exit(-1); // if we get here, we failed to exec, and we don't want 2 copies of the original program running so just die immediately } else // parent { my_std_in.CloseRead(); // parent process can only write to this my_std_out.CloseWrite(); // parent process can only read from this my_std_err.CloseWrite(); // parent process can only read from this if (in.GetNumber() == -1) std_in = my_std_in; if (out.GetNumber() == -1) std_out = my_std_out; if (err.GetNumber() == -1) std_err = my_std_err; started = true; } }
void __init setup_arch(char **cmdline_p) { char *p = &external_cmdline_buffer; my_out("Hello from Hexagon Linux 1\n"); my_out("Hello from Hexagon Linux 2\n"); /* * These will eventually be pulled in via either some hypervisor * or devicetree description. Hardwiring for now. */ pcycle_freq_mhz = 600; thread_freq_mhz = 100; sleep_clk_freq = 32000; my_out("600TEST 1: %llu\n", __vmgettime()); my_out("600TEST 2: %llu\n", __vmgettime()); //*(volatile uint32_t*)0xA900080C |= 0x20; /* * Set up event bindings to handle exceptions and interrupts. */ __vmsetvec(_K_VM_event_vector); /* * Simulator has a few differences from the hardware. * For now, check uninitialized-but-mapped memory * prior to invoking setup_arch_memory(). */ if (*(int *)((unsigned long)_end + 8) == 0x1f1f1f1f) on_simulator = 1; else on_simulator = 0; if (p[0] != '\0') strlcpy(boot_command_line, p, COMMAND_LINE_SIZE); else strlcpy(boot_command_line, default_command_line, COMMAND_LINE_SIZE); /* * boot_command_line and the value set up by setup_arch * are both picked up by the init code. If no reason to * make them different, pass the same pointer back. */ strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); *cmdline_p = cmd_line; parse_early_param(); my_out("setup_arch() 2\r\n"); setup_arch_memory(); my_out("setup_arch() 3\r\n"); #ifdef CONFIG_SMP smp_start_cpus(); #endif #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) conswitchp = &vga_con; #elif defined(CONFIG_DUMMY_CONSOLE) conswitchp = &dummy_con; #endif #endif my_out("about to exit setup_arch()\r\n"); }