static void * peer2 (void *) { ACE_UPIPE_Acceptor acc (addr); ACE_UPIPE_Stream s_stream; // Spawn a peer1 thread. if (ACE_Thread_Manager::instance ()->spawn (ACE_THR_FUNC (peer1), (void *) 0, THR_NEW_LWP | THR_DETACHED) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "spawn"), 0); ACE_DEBUG ((LM_DEBUG, "(%t) peer2 starting accept\n")); if (acc.accept (s_stream) == -1) ACE_ERROR ((LM_ERROR, "(%t) ACE_UPIPE_Acceptor.accept failed\n")); ACE_Message_Block *mb = 0; if (s_stream.recv (mb) == -1) ACE_ERROR ((LM_ERROR, "(%t) peer2 recv failed\n")); ACE_DEBUG ((LM_DEBUG, "(%t) peer2 recv is \"%s\"\n", mb->rd_ptr ())); mb->wr_ptr (mb->rd_ptr ()); mb->copy ("thanks", 7); if (s_stream.send (mb) == -1) ACE_ERROR ((LM_ERROR, "(%t) peer2 send failed\n")); char s_buf[42]; ACE_DEBUG ((LM_DEBUG, "(%t) peer2 sleeping on recv\n")); if (s_stream.recv (s_buf, sizeof s_buf) == -1) ACE_ERROR ((LM_ERROR, "(%t) peer2 recv failed\n")); else ACE_DEBUG ((LM_DEBUG, "(%t) peer2 received buffer with \"%s\"\n", s_buf)); ACE_OS::strcpy (s_buf, "this is the peer2 response!"); if (s_stream.send (s_buf, 30) == -1) ACE_ERROR ((LM_ERROR, "(%t) peer2 send failed\n")); s_stream.close (); return 0; }
static void * acceptor (void *args) { ACE_UPIPE_Acceptor *acceptor = (ACE_UPIPE_Acceptor *) args; ACE_UPIPE_Stream s_stream; if (acceptor->accept (s_stream) == -1) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) ACE_UPIPE_Acceptor.accept failed\n"))); ACE_Message_Block *mb = 0; if (s_stream.recv (mb) == -1) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) acceptor recv failed\n"))); ACE_TEST_ASSERT (ACE_OS::strcmp (mb->rd_ptr (), "hello") == 0); mb->wr_ptr (mb->rd_ptr ()); mb->copy ("thanks"); if (s_stream.send (mb) == -1) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) acceptor send failed\n"))); char s_buf[BUFSIZ]; ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) acceptor sleeping on recv\n"))); if (s_stream.recv (s_buf, sizeof (s_buf)) == -1) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) acceptor recv failed\n"))); else ACE_TEST_ASSERT (ACE_OS::strcmp (s_buf, "This string is sent by connector as a buffer") == 0); const char svr_response[] = "this is the acceptor response!"; ACE_OS::strcpy (s_buf, svr_response); if (s_stream.send (s_buf, sizeof (svr_response)) == -1) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) acceptor send failed\n"))); s_stream.close (); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) exiting thread\n"))); return 0; }
int run_main (int, ACE_TCHAR *[]) { ACE_START_TEST (ACE_TEXT ("UPIPE_SAP_Test")); #if defined (ACE_HAS_THREADS) && \ (defined (ACE_HAS_STREAM_PIPES) || defined (ACE_HAS_WIN32_NAMED_PIPES)) ACE_UPIPE_Acceptor acc (addr); // Spawn a acceptor thread. if (ACE_Thread_Manager::instance ()->spawn (ACE_THR_FUNC (acceptor), (void *) &acc, THR_NEW_LWP, 0) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("spawn")), 1); // Spawn a connector thread. if (ACE_Thread_Manager::instance ()->spawn (ACE_THR_FUNC (connector), (void *) 0, THR_NEW_LWP, 0) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("spawn")), 1); ACE_Thread_Manager::instance ()->wait (); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) joined with acceptor thread\n"))); // Close the acceptor acc.close (); #else #if !defined (ACE_HAS_THREADS) ACE_ERROR ((LM_INFO, ACE_TEXT ("threads not supported on this platform\n"))); #else ACE_ERROR ((LM_INFO, ACE_TEXT ("UPIPE is not supported on this platform\n"))); #endif /* !defined (ACE_HAS_THREADS) */ #endif /* ACE_HAS_THREADS && (ACE_HAS_STREAM_PIPES || ACE_HAS_WIN32_NAMED_PIPES) */ ACE_END_TEST; return 0; }
static void * consumer (void *) { ACE_UPIPE_Stream c_stream; // Set the high water mark to size to achieve optimum performance. int wm = size * iterations; if (c_stream.control (ACE_IO_Cntl_Msg::SET_HWM, &wm) == -1) ACE_DEBUG ((LM_DEBUG, "set HWM failed\n")); ACE_UPIPE_Addr serv_addr (ACE_TEXT("pattern")); // accept will wait up to 4 seconds ACE_UPIPE_Acceptor acc (serv_addr); ACE_DEBUG ((LM_DEBUG, "(%t) consumer spawning the supplier thread\n")); // Spawn the supplier thread. if (ACE_Thread_Manager::instance ()->spawn (ACE_THR_FUNC (supplier), (void *) 0, THR_NEW_LWP | THR_DETACHED) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "spawn"), 0); ACE_DEBUG ((LM_DEBUG, "(%t) consumer starting accept\n")); if (acc.accept (c_stream) == -1) ACE_ERROR ((LM_ERROR, "(%t) %p\n", "ACE_UPIPE_Acceptor.accept failed")); // Time measurement. time_t currsec; ACE_OS::time (&currsec); time_t start = (time_t) currsec; int received_messages = 0; for (ACE_Message_Block *mb = 0; c_stream.recv (mb) != -1 && mb->size () != 0; mb->release ()) received_messages++; ACE_OS::time (&currsec); time_t secs = (time_t) currsec - start; ACE_DEBUG ((LM_DEBUG, "(%t) Transferred %d blocks of size %d\n" "The program ran %d seconds\n", received_messages, size, secs)); c_stream.close (); return 0; }