Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
	}
}
Exemplo n.º 3
0
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");
}