diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2007-01-17 18:11:11 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2007-01-17 18:11:11 +0000 |
commit | e124e693704faa56ecf32ce2a243d0c3fa3a5e6e (patch) | |
tree | 071dcaa6edc458f9371289976a4537880e5bb005 /cpp/demo/Ice/async/WorkQueue.cpp | |
parent | Changed async demo (diff) | |
download | ice-e124e693704faa56ecf32ce2a243d0c3fa3a5e6e.tar.bz2 ice-e124e693704faa56ecf32ce2a243d0c3fa3a5e6e.tar.xz ice-e124e693704faa56ecf32ce2a243d0c3fa3a5e6e.zip |
Changed demo
Diffstat (limited to 'cpp/demo/Ice/async/WorkQueue.cpp')
-rw-r--r-- | cpp/demo/Ice/async/WorkQueue.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/cpp/demo/Ice/async/WorkQueue.cpp b/cpp/demo/Ice/async/WorkQueue.cpp new file mode 100644 index 00000000000..0493b8087ab --- /dev/null +++ b/cpp/demo/Ice/async/WorkQueue.cpp @@ -0,0 +1,107 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <WorkQueue.h> +#include <Ice/LocalException.h> + +using namespace std; + +WorkQueue::WorkQueue() : + _done(false) +{ +} + +void +WorkQueue::run() +{ + IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor); + + while(!_done) + { + if(_callbacks.size() == 0) + { + _monitor.wait(); + } + + if(_callbacks.size() != 0) + { + // + // Get next work item. + // + CallbackEntry entry = _callbacks.front(); + + // + // Wait for the amount of time indicated in delay to + // emulate a process that takes a significant period of + // time to complete. + // + _monitor.timedWait(IceUtil::Time::milliSeconds(entry.delay)); + + if(!_done) + { + // + // Print greeting and send response. + // + _callbacks.pop_front(); + cout << "Belated Hello World!" << endl; + entry.cb->ice_response(); + } + } + } + + // + // Throw exception for any outstanding requests. + // + list<CallbackEntry>::const_iterator p; + for(p = _callbacks.begin(); p != _callbacks.end(); ++p) + { + (*p).cb->ice_exception(Demo::RequestCanceledException()); + } +} + +void +WorkQueue::add(const Demo::AMD_Hello_sayHelloPtr& cb, int delay) +{ + IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor); + + if(!_done) + { + // + // Add work item. + // + CallbackEntry entry; + entry.cb = cb; + entry.delay = delay; + + if(_callbacks.size() == 0) + { + _monitor.notify(); + } + _callbacks.push_back(entry); + } + else + { + // + // Destroyed, throw exception. + // + cb->ice_exception(Demo::RequestCanceledException()); + } +} + +void +WorkQueue::destroy() +{ + IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor); + + // + // Set done flag and notify. + // + _done = true; + _monitor.notify(); +} |