| David Reiss | ea2cba8 | 2009-03-30 21:35:00 +0000 | [diff] [blame] | 1 | /* | 
|  | 2 | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | 3 | * or more contributor license agreements. See the NOTICE file | 
|  | 4 | * distributed with this work for additional information | 
|  | 5 | * regarding copyright ownership. The ASF licenses this file | 
|  | 6 | * to you under the Apache License, Version 2.0 (the | 
|  | 7 | * "License"); you may not use this file except in compliance | 
|  | 8 | * with the License. You may obtain a copy of the License at | 
|  | 9 | * | 
|  | 10 | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 11 | * | 
|  | 12 | * Unless required by applicable law or agreed to in writing, | 
|  | 13 | * software distributed under the License is distributed on an | 
|  | 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | 15 | * KIND, either express or implied. See the License for the | 
|  | 16 | * specific language governing permissions and limitations | 
|  | 17 | * under the License. | 
|  | 18 | */ | 
| Mark Slee | 9f0c651 | 2007-02-28 23:58:26 +0000 | [diff] [blame] | 19 |  | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 20 | #ifndef _THRIFT_CONCURRENCY_TIMERMANAGER_H_ | 
|  | 21 | #define _THRIFT_CONCURRENCY_TIMERMANAGER_H_ 1 | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 22 |  | 
| Marc Slemko | 8a40a76 | 2006-07-19 17:46:50 +0000 | [diff] [blame] | 23 | #include "Exception.h" | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 24 | #include "Monitor.h" | 
|  | 25 | #include "Thread.h" | 
|  | 26 |  | 
| Marc Slemko | 6f038a7 | 2006-08-03 18:58:09 +0000 | [diff] [blame] | 27 | #include <boost/shared_ptr.hpp> | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 28 | #include <map> | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 29 | #include <time.h> | 
|  | 30 |  | 
| T Jake Luciani | b5e6221 | 2009-01-31 22:36:20 +0000 | [diff] [blame] | 31 | namespace apache { namespace thrift { namespace concurrency { | 
| Marc Slemko | 8a40a76 | 2006-07-19 17:46:50 +0000 | [diff] [blame] | 32 |  | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 33 | /** | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 34 | * Timer Manager | 
|  | 35 | * | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 36 | * This class dispatches timer tasks when they fall due. | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 37 | * | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 38 | * @version $Id:$ | 
|  | 39 | */ | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 40 | class TimerManager { | 
|  | 41 |  | 
|  | 42 | public: | 
|  | 43 |  | 
|  | 44 | TimerManager(); | 
|  | 45 |  | 
| Marc Slemko | 8a40a76 | 2006-07-19 17:46:50 +0000 | [diff] [blame] | 46 | virtual ~TimerManager(); | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 47 |  | 
| Mark Slee | 5ea15f9 | 2007-03-05 22:55:59 +0000 | [diff] [blame] | 48 | virtual boost::shared_ptr<const ThreadFactory> threadFactory() const; | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 49 |  | 
| Mark Slee | 5ea15f9 | 2007-03-05 22:55:59 +0000 | [diff] [blame] | 50 | virtual void threadFactory(boost::shared_ptr<const ThreadFactory> value); | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 51 |  | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 52 | /** | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 53 | * Starts the timer manager service | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 54 | * | 
|  | 55 | * @throws IllegalArgumentException Missing thread factory attribute | 
|  | 56 | */ | 
| Marc Slemko | 8a40a76 | 2006-07-19 17:46:50 +0000 | [diff] [blame] | 57 | virtual void start(); | 
|  | 58 |  | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 59 | /** | 
|  | 60 | * Stops the timer manager service | 
|  | 61 | */ | 
| Marc Slemko | 8a40a76 | 2006-07-19 17:46:50 +0000 | [diff] [blame] | 62 | virtual void stop(); | 
|  | 63 |  | 
|  | 64 | virtual size_t taskCount() const ; | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 65 |  | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 66 | /** | 
|  | 67 | * Adds a task to be executed at some time in the future by a worker thread. | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 68 | * | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 69 | * @param task The task to execute | 
|  | 70 | * @param timeout Time in milliseconds to delay before executing task | 
|  | 71 | */ | 
| Mark Slee | 9b82d27 | 2007-05-23 05:16:07 +0000 | [diff] [blame] | 72 | virtual void add(boost::shared_ptr<Runnable> task, int64_t timeout); | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 73 |  | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 74 | /** | 
|  | 75 | * Adds a task to be executed at some time in the future by a worker thread. | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 76 | * | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 77 | * @param task The task to execute | 
|  | 78 | * @param timeout Absolute time in the future to execute task. | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 79 | */ | 
| Mark Slee | 5ea15f9 | 2007-03-05 22:55:59 +0000 | [diff] [blame] | 80 | virtual void add(boost::shared_ptr<Runnable> task, const struct timespec& timeout); | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 81 |  | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 82 | /** | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 83 | * Removes a pending task | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 84 | * | 
|  | 85 | * @throws NoSuchTaskException Specified task doesn't exist. It was either | 
|  | 86 | *                             processed already or this call was made for a | 
|  | 87 | *                             task that was never added to this timer | 
|  | 88 | * | 
|  | 89 | * @throws UncancellableTaskException Specified task is already being | 
|  | 90 | *                                    executed or has completed execution. | 
|  | 91 | */ | 
| Mark Slee | 5ea15f9 | 2007-03-05 22:55:59 +0000 | [diff] [blame] | 92 | virtual void remove(boost::shared_ptr<Runnable> task); | 
| Marc Slemko | 8a40a76 | 2006-07-19 17:46:50 +0000 | [diff] [blame] | 93 |  | 
|  | 94 | enum STATE { | 
| Marc Slemko | d466b21 | 2006-07-20 00:04:18 +0000 | [diff] [blame] | 95 | UNINITIALIZED, | 
|  | 96 | STARTING, | 
|  | 97 | STARTED, | 
|  | 98 | STOPPING, | 
|  | 99 | STOPPED | 
| Marc Slemko | 8a40a76 | 2006-07-19 17:46:50 +0000 | [diff] [blame] | 100 | }; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 101 |  | 
| Marc Slemko | 8a40a76 | 2006-07-19 17:46:50 +0000 | [diff] [blame] | 102 | virtual const STATE state() const; | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 103 |  | 
|  | 104 | private: | 
| Mark Slee | 5ea15f9 | 2007-03-05 22:55:59 +0000 | [diff] [blame] | 105 | boost::shared_ptr<const ThreadFactory> threadFactory_; | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 106 | class Task; | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 107 | friend class Task; | 
| Mark Slee | 9b82d27 | 2007-05-23 05:16:07 +0000 | [diff] [blame] | 108 | std::multimap<int64_t, boost::shared_ptr<Task> > taskMap_; | 
| Mark Slee | 2f6404d | 2006-10-10 01:37:40 +0000 | [diff] [blame] | 109 | size_t taskCount_; | 
|  | 110 | Monitor monitor_; | 
|  | 111 | STATE state_; | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 112 | class Dispatcher; | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 113 | friend class Dispatcher; | 
| Mark Slee | 5ea15f9 | 2007-03-05 22:55:59 +0000 | [diff] [blame] | 114 | boost::shared_ptr<Dispatcher> dispatcher_; | 
|  | 115 | boost::shared_ptr<Thread> dispatcherThread_; | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 116 | }; | 
|  | 117 |  | 
| T Jake Luciani | b5e6221 | 2009-01-31 22:36:20 +0000 | [diff] [blame] | 118 | }}} // apache::thrift::concurrency | 
| Marc Slemko | 0e53ccd | 2006-07-17 23:51:05 +0000 | [diff] [blame] | 119 |  | 
| Mark Slee | f5f2be4 | 2006-09-05 21:05:31 +0000 | [diff] [blame] | 120 | #endif // #ifndef _THRIFT_CONCURRENCY_TIMERMANAGER_H_ |