Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef ACE_TIMER_QUEUE_ADAPTERS_H
00015 #define ACE_TIMER_QUEUE_ADAPTERS_H
00016 #include "ace/pre.h"
00017
00018 #include "ace/Task.h"
00019
00020 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00021 # pragma once
00022 #endif
00023
00024 #include "ace/Signal.h"
00025 #include "ace/Sig_Handler.h"
00026 #include "ace/Condition_Recursive_Thread_Mutex.h"
00027
00028 #if defined (ACE_HAS_DEFERRED_TIMER_COMMANDS)
00029 # include "ace/Unbounded_Queue.h"
00030 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00031 class ACE_Command_Base;
00032 ACE_END_VERSIONED_NAMESPACE_DECL
00033 #endif
00034
00035 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00036
00037 class ACE_Sig_Set;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 template <class TQ, class TYPE = ACE_Event_Handler*>
00053 class ACE_Async_Timer_Queue_Adapter : public ACE_Event_Handler
00054 {
00055 public:
00056 typedef TQ TIMER_QUEUE;
00057
00058
00059
00060
00061
00062
00063
00064 ACE_Async_Timer_Queue_Adapter (ACE_Sig_Set *mask = 0);
00065
00066
00067
00068
00069
00070
00071
00072
00073 long schedule (TYPE type,
00074 const void *act,
00075 const ACE_Time_Value &future_time,
00076 const ACE_Time_Value &interval = ACE_Time_Value::zero);
00077
00078
00079
00080 int cancel (long timer_id, const void **act = 0);
00081
00082
00083
00084 int expire (void);
00085
00086
00087 TQ &timer_queue (void);
00088
00089 private:
00090
00091 virtual int schedule_ualarm (void);
00092
00093
00094 virtual int handle_signal (int signum, siginfo_t *, ucontext_t *);
00095
00096
00097
00098 ACE_Sig_Handler sig_handler_;
00099
00100
00101
00102 TQ timer_queue_;
00103
00104
00105 ACE_Sig_Set mask_;
00106 };
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 template <class TQ, class TYPE = ACE_Event_Handler*>
00123 class ACE_Thread_Timer_Queue_Adapter : public ACE_Task_Base
00124 {
00125 public:
00126
00127 typedef TQ TIMER_QUEUE;
00128
00129 # if defined (ACE_HAS_DEFERRED_TIMER_COMMANDS)
00130
00131
00132
00133 enum COMMAND_ENQUEUE_POSITION {HEAD, TAIL};
00134
00135 # endif
00136
00137
00138
00139
00140 ACE_Thread_Timer_Queue_Adapter (ACE_Thread_Manager * = ACE_Thread_Manager::instance (),
00141 TQ* timer_queue = 0);
00142
00143
00144 virtual ~ACE_Thread_Timer_Queue_Adapter (void);
00145
00146
00147
00148 long schedule (TYPE handler,
00149 const void *act,
00150 const ACE_Time_Value &future_time,
00151 const ACE_Time_Value &interval = ACE_Time_Value::zero);
00152
00153
00154
00155 int cancel (long timer_id, const void **act = 0);
00156
00157
00158 virtual int svc (void);
00159
00160
00161 virtual void deactivate (void);
00162
00163
00164 ACE_SYNCH_RECURSIVE_MUTEX &mutex (void);
00165
00166
00167 int timer_queue (TQ *tq);
00168
00169
00170 TQ *timer_queue (void) const;
00171
00172
00173 ACE_thread_t thr_id (void) const;
00174
00175
00176
00177
00178
00179
00180 virtual int activate (long flags = THR_NEW_LWP | THR_JOINABLE,
00181 int n_threads = 1,
00182 int force_active = 0,
00183 long priority = ACE_DEFAULT_THREAD_PRIORITY,
00184 int grp_id = -1,
00185 ACE_Task_Base *task = 0,
00186 ACE_hthread_t thread_handles[] = 0,
00187 void *stack[] = 0,
00188 size_t stack_size[] = 0,
00189 ACE_thread_t thread_ids[] = 0,
00190 const char* thr_name[] = 0);
00191
00192 # if defined (ACE_HAS_DEFERRED_TIMER_COMMANDS)
00193
00194
00195
00196
00197
00198
00199
00200
00201 int enqueue_command (ACE_Command_Base *command_,
00202 COMMAND_ENQUEUE_POSITION pos = TAIL);
00203
00204 # endif
00205
00206 private:
00207
00208 # if defined (ACE_HAS_DEFERRED_TIMER_COMMANDS)
00209
00210
00211 int dispatch_commands (void);
00212
00213
00214 ACE_Unbounded_Queue<ACE_Command_Base *> command_queue_;
00215
00216
00217 ACE_SYNCH_MUTEX command_mutex_;
00218 # endif
00219
00220
00221 TQ* timer_queue_;
00222
00223
00224
00225 bool delete_timer_queue_;
00226
00227
00228
00229 ACE_SYNCH_RECURSIVE_MUTEX mutex_;
00230
00231
00232
00233
00234
00235
00236 ACE_SYNCH_RECURSIVE_CONDITION condition_;
00237
00238
00239
00240 bool active_;
00241
00242
00243 ACE_thread_t thr_id_;
00244 };
00245
00246 ACE_END_VERSIONED_NAMESPACE_DECL
00247
00248 #if defined (__ACE_INLINE__)
00249 # include "ace/Timer_Queue_Adapters.inl"
00250 #endif
00251
00252 #if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
00253 # include "ace/Timer_Queue_Adapters.cpp"
00254 #endif
00255
00256 #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
00257 # pragma implementation ("Timer_Queue_Adapters.cpp")
00258 #endif
00259
00260 #include "ace/post.h"
00261 #endif