80c663882a
Summary: First draft. Unit tests pass. Test Plan: unit tests attached Reviewers: heyongqiang Reviewed By: heyongqiang Differential Revision: https://reviews.facebook.net/D3969
123 lines
3.5 KiB
C++
123 lines
3.5 KiB
C++
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
#ifndef _THRIFT_CONCURRENCY_TIMERMANAGER_H_
|
|
#define _THRIFT_CONCURRENCY_TIMERMANAGER_H_ 1
|
|
|
|
#include "thrift/lib/cpp/concurrency/Exception.h"
|
|
#include "thrift/lib/cpp/concurrency/Monitor.h"
|
|
#include "thrift/lib/cpp/concurrency/Thread.h"
|
|
|
|
#include <boost/shared_ptr.hpp>
|
|
#include <map>
|
|
#include <time.h>
|
|
|
|
namespace apache { namespace thrift { namespace concurrency {
|
|
|
|
/**
|
|
* Timer Manager
|
|
*
|
|
* This class dispatches timer tasks when they fall due.
|
|
*
|
|
* @version $Id:$
|
|
*/
|
|
class TimerManager {
|
|
|
|
public:
|
|
|
|
TimerManager();
|
|
|
|
virtual ~TimerManager();
|
|
|
|
virtual boost::shared_ptr<const ThreadFactory> threadFactory() const;
|
|
|
|
virtual void threadFactory(boost::shared_ptr<const ThreadFactory> value);
|
|
|
|
/**
|
|
* Starts the timer manager service
|
|
*
|
|
* @throws IllegalArgumentException Missing thread factory attribute
|
|
*/
|
|
virtual void start();
|
|
|
|
/**
|
|
* Stops the timer manager service
|
|
*/
|
|
virtual void stop();
|
|
|
|
virtual size_t taskCount() const ;
|
|
|
|
/**
|
|
* Adds a task to be executed at some time in the future by a worker thread.
|
|
*
|
|
* @param task The task to execute
|
|
* @param timeout Time in milliseconds to delay before executing task
|
|
*/
|
|
virtual void add(boost::shared_ptr<Runnable> task, int64_t timeout);
|
|
|
|
/**
|
|
* Adds a task to be executed at some time in the future by a worker thread.
|
|
*
|
|
* @param task The task to execute
|
|
* @param timeout Absolute time in the future to execute task.
|
|
*/
|
|
virtual void add(boost::shared_ptr<Runnable> task, const struct timespec& timeout);
|
|
|
|
/**
|
|
* Removes a pending task
|
|
*
|
|
* @throws NoSuchTaskException Specified task doesn't exist. It was either
|
|
* processed already or this call was made for a
|
|
* task that was never added to this timer
|
|
*
|
|
* @throws UncancellableTaskException Specified task is already being
|
|
* executed or has completed execution.
|
|
*/
|
|
virtual void remove(boost::shared_ptr<Runnable> task);
|
|
|
|
enum STATE {
|
|
UNINITIALIZED,
|
|
STARTING,
|
|
STARTED,
|
|
STOPPING,
|
|
STOPPED
|
|
};
|
|
|
|
virtual const STATE state() const;
|
|
|
|
private:
|
|
boost::shared_ptr<const ThreadFactory> threadFactory_;
|
|
class Task;
|
|
friend class Task;
|
|
std::multimap<int64_t, boost::shared_ptr<Task> > taskMap_;
|
|
size_t taskCount_;
|
|
Monitor monitor_;
|
|
STATE state_;
|
|
class Dispatcher;
|
|
friend class Dispatcher;
|
|
boost::shared_ptr<Dispatcher> dispatcher_;
|
|
boost::shared_ptr<Thread> dispatcherThread_;
|
|
typedef std::multimap<int64_t, boost::shared_ptr<TimerManager::Task> >::iterator task_iterator;
|
|
typedef std::pair<task_iterator, task_iterator> task_range;
|
|
};
|
|
|
|
}}} // apache::thrift::concurrency
|
|
|
|
#endif // #ifndef _THRIFT_CONCURRENCY_TIMERMANAGER_H_
|