/* Copyright 2012. Bloomberg Finance L.P.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions: The above
* copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
// blpapi_eventdispatcher.h -*-C++-*-
#ifndef INCLUDED_BLPAPI_EVENTDISPATCHER
#define INCLUDED_BLPAPI_EVENTDISPATCHER
//@PURPOSE: Provide a dispatcher to dispatch events.
//
//@CLASSES:
// blpapi::EventDispatcher: Dispatches events from one or more Sessions through
// callbacks
//
//@DESCRIPTION: This component implements a dispatcher to dispatch events from
// one or more 'Session' through callbacks.
#ifndef INCLUDED_BLPAPI_DEFS
#include <blpapi_defs.h>
#endif
#ifndef INCLUDED_BLPAPI_TYPES
#include <blpapi_types.h>
#endif
#include <stddef.h> // for size_t
#ifdef __cplusplus
extern "C" {
#endif
BLPAPI_EXPORT
blpapi_EventDispatcher_t* blpapi_EventDispatcher_create(
size_t numDispatcherThreads);
BLPAPI_EXPORT
void blpapi_EventDispatcher_destroy(blpapi_EventDispatcher_t *handle);
BLPAPI_EXPORT
int blpapi_EventDispatcher_start(blpapi_EventDispatcher_t *handle);
BLPAPI_EXPORT
int blpapi_EventDispatcher_stop(blpapi_EventDispatcher_t *handle,
int async);
BLPAPI_EXPORT
int blpapi_EventDispatcher_dispatchEvents(blpapi_EventDispatcher_t *handle);
#ifdef __cplusplus
} // extern "C"
namespace BloombergLP {
namespace blpapi {
// =====================
// class EventDispatcher
// =====================
class EventDispatcher {
// Dispatches events from one or more Sessions through callbacks
//
// EventDispatcher objects are optionally specified when Session
// objects are constructed. A single EventDispatcher can be shared
// by multiple Session objects.
//
// The EventDispatcher provides an event-driven interface,
// generating callbacks from one or more internal threads for one
// or more sessions.
blpapi_EventDispatcher_t *d_impl_p;
private:
// NOT IMPLEMENTED
EventDispatcher(const EventDispatcher&);
EventDispatcher &operator=(const EventDispatcher&);
public:
EventDispatcher(size_t numDispatcherThreads = 1);
// Construct an EventDispatcher with the specified
// 'numDispatcherThreads'. If 'numDispatcherThreads' is 1 (the
// default) then a single internal thread is created to
// dispatch events. If 'numDispatcherThreads' is greater than
// 1 then an internal pool of 'numDispatcherThreads' threads
// is created to dispatch events. The behavior is undefined
// if 'numDispatcherThreads' is 0.
~EventDispatcher();
// Destructor.
int start();
// Start generating callbacks for events from sessions
// associated with this EventDispatcher. Return 0 on success
// and a non zero value otherwise.
int stop(bool async = false);
// Shutdown this event dispatcher object and stop generating
// callbacks for events from sessions associated with it.
// If the specified 'async' is false (the default) then this
// method blocks until all current callbacks which were dispatched
// through this EventDispatcher have completed.
// Return 0 on success and a non zero value otherwise.
//
// Note: Calling stop with 'async' of false from within a callback
// dispatched by this EventDispatcher is undefined and may result
// in a deadlock.
blpapi_EventDispatcher_t *impl() const;
// Returns the internal implementation.
};
// ============================================================================
// INLINE AND TEMPLATE FUNCTION IMPLEMENTATIONS
// ============================================================================
// ---------------------
// class EventDispatcher
// ---------------------
inline
EventDispatcher::EventDispatcher(size_t numDispatcherThreads)
: d_impl_p(blpapi_EventDispatcher_create(numDispatcherThreads))
{
}
inline
EventDispatcher::~EventDispatcher()
{
blpapi_EventDispatcher_destroy(d_impl_p);
}
inline
int EventDispatcher::start()
{
return blpapi_EventDispatcher_start(d_impl_p);
}
inline
int EventDispatcher::stop(bool async)
{
return blpapi_EventDispatcher_stop(d_impl_p, async);
}
inline
blpapi_EventDispatcher_t *EventDispatcher::impl() const
{
return d_impl_p;
}
} // close namespace blpapi
} // close namespace BloombergLP
#endif // ifdef __cplusplus
#endif // #ifndef INCLUDED_BLPAPI_EVENTDISPATCHER