windows/SysThread.cpp
Go to the documentation of this file.
1 /*----------------------------------------------------------------------------*/
2 /* */
3 /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
4 /* Copyright (c) 2005-2009 Rexx Language Association. All rights reserved. */
5 /* */
6 /* This program and the accompanying materials are made available under */
7 /* the terms of the Common Public License v1.0 which accompanies this */
8 /* distribution. A copy is also available at the following address: */
9 /* http://www.ibm.com/developerworks/oss/CPLv1.0.htm */
10 /* */
11 /* Redistribution and use in source and binary forms, with or */
12 /* without modification, are permitted provided that the following */
13 /* conditions are met: */
14 /* */
15 /* Redistributions of source code must retain the above copyright */
16 /* notice, this list of conditions and the following disclaimer. */
17 /* Redistributions in binary form must reproduce the above copyright */
18 /* notice, this list of conditions and the following disclaimer in */
19 /* the documentation and/or other materials provided with the distribution. */
20 /* */
21 /* Neither the name of Rexx Language Association nor the names */
22 /* of its contributors may be used to endorse or promote products */
23 /* derived from this software without specific prior written permission. */
24 /* */
25 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
26 /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
27 /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
28 /* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
29 /* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
30 /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
31 /* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
32 /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
33 /* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
34 /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
35 /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
36 /* */
37 /*----------------------------------------------------------------------------*/
38 /******************************************************************************/
39 /* REXX Kernel SysThread.cpp */
40 /* */
41 /* Windows implementation of the SysThread class. */
42 /* */
43 /******************************************************************************/
44 
45 #include "windows.h"
46 #include "SysThread.hpp"
47 
48 DWORD WINAPI call_thread_function(void * arguments)
49 {
50  ((SysThread *)arguments)->dispatch();
51  return 0;
52 }
53 
54 // create a new thread and attach to an activity
56 {
57  _threadHandle = CreateThread(NULL, THREAD_STACK_SIZE, call_thread_function, this, 0, &_threadID);
58  // we created this one
59  attached = false;
60 }
61 
63 {
64  // default dispatch returns immediately
65 }
66 
67 // attach an activity to an existing thread
69 {
70  // initialize the thread basics
71  _threadID = GetCurrentThreadId();
72  _threadHandle = GetCurrentThread();
73  attached = true; // we don't own this one (and don't terminate it)
74 }
75 
77 {
78  int pri = THREAD_PRIORITY_NORMAL;
79  /* critical priority? */
80  switch (priority)
81  {
82  case HIGH_PRIORITY: // critical priority
83  pri= THREAD_PRIORITY_ABOVE_NORMAL+1; /* the class is regular, but move */
84  /* to the head of the class */
85  /* medium priority */
86  break;
87 
88  case GUARDED_PRIORITY:
89  pri = THREAD_PRIORITY_NORMAL+1; /* guard priority is just above normal*/
90  break;
91 
92  case MEDIUM_PRIORITY:
93  pri = THREAD_PRIORITY_NORMAL; /* normal class, */
94  /* dead in the middle of it all */
95  break;
96 
97  case LOW_PRIORITY:
98  pri = THREAD_PRIORITY_IDLE +1; /* give us idle only, but make it */
99  break;
100  /* important idle time only */
101  }
102  SetThreadPriority(_threadHandle, pri);
103 }
104 
105 
107 /******************************************************************************/
108 /* Function: Return a pointer to the current stack base */
109 /******************************************************************************/
110 {
111  int32_t temp;
112  return ((char *)(&temp)) - THREAD_STACK_SIZE;
113 }
114 
115 
117 /******************************************************************************/
118 /* Function: Do any platform specific thread termination */
119 /******************************************************************************/
120 {
121  if (!attached && _threadHandle != INVALID_HANDLE_VALUE)
122  {
123  CloseHandle(_threadHandle); // close the thread handle
124  _threadHandle = INVALID_HANDLE_VALUE;
125  }
126 }
127 
128 
129 void SysThread::startup()
130 /******************************************************************************/
131 /* Function: Do any platform specific thread initialization */
132 /******************************************************************************/
133 {
134  // this is a nop on Windows;
135 }
136 
137 
138 void SysThread::shutdown()
139 /******************************************************************************/
140 /* Function: Do any platform specific thread shutdown activities. This */
141 /* replaces the WindowEnv stuff in prior releases. */
142 /******************************************************************************/
143 {
144  // this is a nop on Windows;
145 }
146 
147 
148 void SysThread::yield()
149 /******************************************************************************/
150 /* Function: Yield control to other threads. */
151 /******************************************************************************/
152 {
153  // this is a nop on Windows;
154 }
155 
156 
157 bool SysThread::equals(SysThread &other)
158 /******************************************************************************/
159 /* Function: Yield dispatching control to other threads. */
160 /******************************************************************************/
161 {
162  return _threadID == other._threadID;
163 }
pthread_t _threadID
void startup()
virtual void dispatch()
virtual void attachThread()
void createThread()
void terminate()
HANDLE _threadHandle
void setPriority(int priority)
bool equals(SysThread &other)
char * getStackBase()
DWORD WINAPI call_thread_function(void *arguments)
int int32_t