windows/SysActivity.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 SysActivity.hpp */
40 /* */
41 /* System support for Thread operations */
42 /* */
43 /******************************************************************************/
44 
45 #include "RexxCore.h"
46 #include "SysActivity.hpp"
47 
48 /**
49  * Close out any resources required by this thread descriptor.
50  */
51 void SysActivity::close()
52 {
53  CloseHandle(this->hThread);
54  hThread = NULL;
55  threadId = 0;
56 }
57 
58 
59 DWORD WINAPI dispatch_activity_function(void * arguments)
60 {
61  // hand this off to the thread object
62  ((RexxActivity *)arguments)->runThread();
63  return 0;
64 }
65 
66 
67 /**
68  * Create a real thread for the activity holding this
69  * item.
70  *
71  * @param activity The activity we're creating on.
72  * @param stackSize The required stack size.
73  */
74 void SysActivity::create(RexxActivity *activity, size_t stackSize)
75 {
76  DWORD res;
77 
78  hThread = CreateThread(NULL, stackSize, dispatch_activity_function, (void *)activity, 0, &res);
79  if (hThread == NULL)
80  {
81  reportException(Error_System_service_service, "ERROR CREATING THREAD");
82  }
83  threadId = res;
84 }
85 
86 
87 /**
88  * Get the ID of the current thread.
89  *
90  * @return The thread identifer for the current thread.
91  */
93 {
94  return(thread_id_t)GetCurrentThreadId();
95 }
96 
97 
98 /**
99  * Check if this activity is getting used on the correct
100  * thread.
101  *
102  * @return true if the current thread is the same as the one
103  * the activity was created for.
104  */
106 {
107  return threadId == queryThreadID();
108 }
109 
110 
111 /**
112  * Initialize the descriptor for manipulating the current
113  * active thread.
114  */
116 {
117  // we need both an identifier and a handle
119  hThread = GetCurrentThread();
120 }
121 
122 
123 /**
124  * Return the pointer to the base of the current stack.
125  * This is used for checking recursion overflows.
126  *
127  * @param base A local variable at the base of the stack.
128  * @param stackSize
129  *
130  * @return The character pointer for the stack base.
131  */
132 char *SysActivity::getStackBase(int32_t *base, size_t stackSize)
133 {
134  return (char *)base - stackSize;
135 }
136 
137 
138 wholenumber_t yieldCount = 0; // Monitoring
139 
140 void SysActivity::yield()
141 {
142  yieldCount += 1;
143  // just give up the time slice
144  Sleep(0);
145 }
146 
148 {
149  return yieldCount;
150 }
void reportException(wholenumber_t error)
#define Error_System_service_service
static wholenumber_t yieldCounter()
pthread_t threadId
static thread_id_t queryThreadID()
static void yield()
void create(RexxActivity *activity, size_t stackSize)
char * getStackBase(int32_t *base, size_t stackSize)
ssize_t wholenumber_t
Definition: rexx.h:230
pthread_t thread_id_t
DWORD WINAPI dispatch_activity_function(void *arguments)
wholenumber_t yieldCount
int int32_t