Changeset 1474:efb0facc02cc
- Timestamp:
- 08/27/10 05:49:47 (18 months ago)
- Branch:
- default
- Location:
- sources
- Files:
-
- 2 edited
-
include/libdodo/pcExecutionScheduler.h (modified) (4 diffs)
-
src/pcExecutionScheduler.cc (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
sources/include/libdodo/pcExecutionScheduler.h
r1439 r1474 45 45 namespace execution { 46 46 class job; 47 class thread; 47 48 48 49 /** … … 51 52 */ 52 53 class scheduler { 53 friend struct __manager__;54 55 54 public: 56 55 … … 86 85 protected: 87 86 87 /** 88 * schedule manager 89 * @return thread exit status 90 * @param data defines user data 91 */ 92 static int manager(void *data); 93 88 94 struct __job__ { 89 95 execution::job *job; ///< job for scheduling … … 98 104 99 105 sync::protector *keeper; ///< section locker 106 execution::thread *thread; 100 107 101 __manager__ * manager; ///< schedule manager handle108 __manager__ *handle; ///< schedule manager handle 102 109 }; 103 110 }; -
sources/src/pcExecutionScheduler.cc
r1472 r1474 57 57 58 58 #ifdef PTHREAD_EXT 59 pthread_t thread; ///< thread descriptor60 61 59 pthread_mutex_t mutex; ///< event mutex 62 60 pthread_cond_t condition; ///< condition lock 63 64 /**65 * schedule manager66 * @return thread exit status67 * @param data defines user data68 */69 static void *manager(void *data);70 61 #endif 71 62 }; … … 87 78 88 79 __manager__::__manager__() : exit(false) 89 #ifdef PTHREAD_EXT90 ,91 thread(0)92 #endif93 80 { 94 81 #ifdef PTHREAD_EXT … … 130 117 //------------------------------------------------------------------- 131 118 132 #ifdef PTHREAD_EXT 133 void * 134 __manager__::manager(void *data) 119 scheduler::scheduler() : counter(0), 120 keeper(NULL), 121 thread(NULL), 122 handle(NULL) 123 { 124 dodo_try { 125 keeper = new pc::sync::thread; 126 handle = new __manager__; 127 thread = new execution::thread(scheduler::manager, this, execution::ON_DESTRUCTION_STOP, false); 128 129 thread->run(); 130 } dodo_catch (exception::basic *e UNUSED) { 131 delete thread; 132 delete handle; 133 delete keeper; 134 135 dodo_rethrow; 136 } 137 } 138 //------------------------------------------------------------------- 139 140 scheduler::~scheduler() 141 { 142 #ifdef PTHREAD_EXT 143 pthread_mutex_lock(&handle->mutex); 144 145 handle->exit = true; 146 147 pthread_cond_signal(&handle->condition); 148 pthread_mutex_unlock(&handle->mutex); 149 #endif 150 151 thread->wait(); 152 153 delete thread; 154 delete handle; 155 delete keeper; 156 } 157 158 //------------------------------------------------------------------- 159 160 int 161 scheduler::manager(void *data) 135 162 { 136 163 scheduler *parent = (scheduler *)data; … … 140 167 while (true) { 141 168 if (idle != 0) { 142 pthread_mutex_lock(&parent-> manager->mutex);169 pthread_mutex_lock(&parent->handle->mutex); 143 170 if (idle == ~0UL) { 144 pthread_cond_wait(&parent-> manager->condition, &parent->manager->mutex);171 pthread_cond_wait(&parent->handle->condition, &parent->handle->mutex); 145 172 } else { 146 173 timespec ts; … … 150 177 ts.tv_nsec += (idle % 1000) * 1000000; 151 178 152 pthread_cond_timedwait(&parent-> manager->condition, &parent->manager->mutex, &ts);179 pthread_cond_timedwait(&parent->handle->condition, &parent->handle->mutex, &ts); 153 180 } 154 181 155 if (parent-> manager->exit) {156 pthread_mutex_unlock(&parent-> manager->mutex);157 158 return NULL;182 if (parent->handle->exit) { 183 pthread_mutex_unlock(&parent->handle->mutex); 184 185 return 0; 159 186 } 160 pthread_mutex_unlock(&parent-> manager->mutex);187 pthread_mutex_unlock(&parent->handle->mutex); 161 188 162 189 idle = 0; … … 168 195 dodoMap<unsigned long, scheduler::__job__>::iterator i = parent->handles.begin(), j = parent->handles.end(); 169 196 while (i!=j) { 170 pthread_mutex_lock(&parent-> manager->mutex);171 if (parent-> manager->exit) {172 pthread_mutex_unlock(&parent-> manager->mutex);173 174 return NULL;197 pthread_mutex_lock(&parent->handle->mutex); 198 if (parent->handle->exit) { 199 pthread_mutex_unlock(&parent->handle->mutex); 200 201 return 0; 175 202 } 176 pthread_mutex_unlock(&parent-> manager->mutex);203 pthread_mutex_unlock(&parent->handle->mutex); 177 204 178 205 scheduler::__job__ &j = i->second; … … 205 232 } 206 233 207 return NULL; 208 } 209 #endif 210 211 //------------------------------------------------------------------- 212 213 scheduler::scheduler() : counter(0), 214 keeper(NULL), 215 manager(NULL) 216 { 217 dodo_try { 218 keeper = new pc::sync::thread; 219 manager = new __manager__; 220 } dodo_catch (exception::basic *e UNUSED) { 221 delete manager; 222 delete keeper; 223 224 dodo_rethrow; 225 } 226 227 #ifdef PTHREAD_EXT 228 errno = pthread_create(&manager->thread, NULL, __manager__::manager, this); 229 if (errno != 0) 230 dodo_throw exception::basic(exception::MODULE_PCEXECUTIONSCHEDULER, SCHEDULEREX_CONSTRUCTOR, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 231 #endif 232 } 233 //------------------------------------------------------------------- 234 235 scheduler::~scheduler() 236 { 237 #ifdef PTHREAD_EXT 238 pthread_mutex_lock(&manager->mutex); 239 240 manager->exit = true; 241 242 pthread_cond_signal(&manager->condition); 243 pthread_mutex_unlock(&manager->mutex); 244 245 pthread_join(manager->thread, NULL); 246 #endif 247 248 delete manager; 249 delete keeper; 234 return 0; 250 235 } 251 236 … … 265 250 switch (job.type) { 266 251 case execution::job::TYPE_PROCESS: 267 _job = new process(*dynamic_cast< process *>(orig));252 _job = new process(*dynamic_cast<execution::process *>(orig)); 268 253 269 254 break; 270 255 271 256 case execution::job::TYPE_THREAD: 272 _job = new thread(*dynamic_cast<thread *>(orig));257 _job = new execution::thread(*dynamic_cast<execution::thread *>(orig)); 273 258 274 259 break; … … 282 267 handles.insert(std::make_pair(counter, j)); 283 268 284 pthread_mutex_lock(& manager->mutex);285 pthread_cond_signal(& manager->condition);286 pthread_mutex_unlock(& manager->mutex);269 pthread_mutex_lock(&handle->mutex); 270 pthread_cond_signal(&handle->condition); 271 pthread_mutex_unlock(&handle->mutex); 287 272 288 273 return counter++;
Note: See TracChangeset
for help on using the changeset viewer.
