1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
//=============================================================================
/**
* @file Directory_Changes.cpp
*
* $Id: Directory_Changes.cpp 93639 2011-03-24 13:32:13Z johnnyw $
*
*
* This application tests the working of WFMO_Reactor when users
* are interested in monitoring changes in the filesystem.
*
*
* @author Irfan Pyarali
*/
//=============================================================================
#include "ace/OS_main.h"
#if defined (ACE_WIN32)
#include "ace/Reactor.h"
#include "ace/OS_NS_unistd.h"
#include "ace/OS_NS_fcntl.h"
#include "ace/Log_Msg.h"
static int stop_test = 0;
static const ACE_TCHAR *directory = ACE_TEXT (".");
static const ACE_TCHAR *temp_file = ACE_TEXT ("foo");
class Event_Handler : public ACE_Event_Handler
{
public:
Event_Handler (ACE_Reactor &reactor);
~Event_Handler (void);
int handle_signal (int signum, siginfo_t * = 0, ucontext_t * = 0);
int handle_close (ACE_HANDLE handle,
ACE_Reactor_Mask close_mask);
private:
ACE_HANDLE handle_;
};
Event_Handler::Event_Handler (ACE_Reactor &reactor)
: handle_ (ACE_INVALID_HANDLE)
{
this->reactor (&reactor);
int change_notification_flags = FILE_NOTIFY_CHANGE_FILE_NAME;
this->handle_ = ACE_TEXT_FindFirstChangeNotification (directory, // pointer to name of directory to watch
FALSE, // flag for monitoring directory or directory tree
change_notification_flags // filter conditions to watch for
);
if (this->handle_ == ACE_INVALID_HANDLE)
ACE_ERROR ((LM_ERROR, "FindFirstChangeNotification could not be setup\n"));
if (this->reactor ()->register_handler (this,
this->handle_) != 0)
ACE_ERROR ((LM_ERROR, "Registration with Reactor could not be done\n"));
}
Event_Handler::~Event_Handler (void)
{
}
int
Event_Handler::handle_signal (int, siginfo_t *, ucontext_t *)
{
::FindNextChangeNotification (this->handle_);
if (stop_test)
this->reactor ()->close ();
return 0;
}
int
Event_Handler::handle_close (ACE_HANDLE,
ACE_Reactor_Mask)
{
ACE_DEBUG ((LM_DEBUG, "Event_Handler removed from Reactor\n"));
::FindCloseChangeNotification (this->handle_);
return 0;
}
void
worker (void)
{
ACE_DEBUG ((LM_DEBUG, "(%t) Thread creation\n"));
ACE_DEBUG ((LM_DEBUG, "(%t) Thread creating temporary file\n"));
ACE_HANDLE file = ACE_OS::open (temp_file, _O_CREAT | _O_EXCL);
if (file == ACE_INVALID_HANDLE)
ACE_ERROR ((LM_ERROR, "Error in creating %s: %p\n", temp_file, "ACE_OS::open"));
else
{
ACE_OS::close (file);
ACE_DEBUG ((LM_DEBUG, "(%t) Thread sleeping\n"));
ACE_OS::sleep (3);
ACE_DEBUG ((LM_DEBUG, "(%t) Thread removing temporary file\n"));
stop_test = 1;
ACE_OS::unlink (temp_file);
}
}
int
ACE_TMAIN (int, ACE_TCHAR *[])
{
ACE_Reactor reactor;
Event_Handler handler (reactor);
int result = ACE_OS::thr_create ((ACE_THR_FUNC) worker, 0, 0, 0);
ACE_ASSERT (result == 0);
for (result = 0; result != -1; result = reactor.handle_events ())
continue;
return 0;
}
#else /* !ACE_WIN32 */
int
ACE_TMAIN (int, ACE_TCHAR *[])
{
return 0;
}
#endif /* ACE_WIN32 */
|