root/trunk/dep/src/zthread/posix/ThreadOps.cxx @ 2

Revision 2, 3.0 kB (checked in by yumileroy, 17 years ago)

[svn] * Proper SVN structure

Original author: Neo2003
Date: 2008-10-02 16:23:55-05:00

Line 
1/*
2 * Copyright (c) 2005, Eric Crahen
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is furnished
9 * to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in all
12 * copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 *
21 */
22
23#include "ThreadOps.h"
24#include "zthread/Guard.h"
25#include "zthread/Runnable.h"
26#include <errno.h>
27
28#if defined(HAVE_SCHED_YIELD)
29#  include <sched.h>
30#endif
31
32namespace ZThread {
33
34const ThreadOps ThreadOps::INVALID(0);
35
36bool ThreadOps::join(ThreadOps* ops) {
37
38  assert(ops);
39  assert(ops->_tid != 0);
40
41  int err = 0;
42
43  do {
44
45    err = pthread_join(ops->_tid, NULL);
46
47  } while(err == EINTR);
48
49  return err == 0;
50
51}
52
53bool ThreadOps::yield() {
54
55  bool result = false;
56
57#if defined(HAVE_SCHED_YIELD)
58  result = sched_yield() == 0;
59#endif
60 
61  return result;
62
63}
64
65bool ThreadOps::setPriority(ThreadOps* impl, Priority p) {
66
67  assert(impl);
68
69  bool result = true;
70 
71#if !defined(ZTHREAD_DISABLE_PRIORITY)
72 
73  struct sched_param param;
74 
75  switch(p) {
76    case Low:
77      param.sched_priority = 0;
78      break;
79    case High:
80      param.sched_priority = 10;
81      break;
82    case Medium:
83    default:
84      param.sched_priority = 5;
85  }
86 
87  result = pthread_setschedparam(impl->_tid, SCHED_OTHER, &param) == 0;
88
89#endif
90
91  return result;
92
93}
94
95bool ThreadOps::getPriority(ThreadOps* impl, Priority& p) {
96
97  assert(impl);
98
99  bool result = true;
100 
101#if !defined(ZTHREAD_DISABLE_PRIORITY)
102
103  struct sched_param param;
104  int policy = SCHED_OTHER;
105 
106  if(result = (pthread_getschedparam(impl->_tid, &policy, &param) == 0)) {
107   
108    // Convert to one of the PRIORITY values
109    if(param.sched_priority < 10)
110      p = Low;
111    else if(param.sched_priority == 10)
112      p = Medium;
113    else
114      p = High;
115   
116  }
117 
118#endif
119
120  return result;
121
122}
123
124
125bool ThreadOps::spawn(Runnable* task) {
126  return pthread_create(&_tid, 0, _dispatch, task) == 0;
127}
128
129
130
131extern "C" void *_dispatch(void *arg) {
132
133  Runnable* task = reinterpret_cast<Runnable*>(arg);
134  assert(task);
135 
136  // Run the task from the correct context
137  task->run();
138 
139  // Exit the thread
140  pthread_exit((void**)0);
141  return (void*)0;
142 
143}
144 
145} // namespace ZThread
146
147
Note: See TracBrowser for help on using the browser.