thread management fixed.
[scilab.git] / scilab / modules / ast / src / cpp / types / threadId.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
4 *
5 *  This file must be used under the terms of the CeCILL.
6 *  This source file is licensed as described in the file COPYING, which
7 *  you should have received as part of this distribution.  The terms
8 *  are also available at
9 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 *
11 */
12
13 #include <map>
14 #include <sstream>
15 #include "core_math.h"
16 #include "threadId.hxx"
17 #include "tostring_common.hxx"
18 #include "scilabWrite.hxx"
19
20 extern "C"
21 {
22 #include "charEncoding.h"
23 #include "os_string.h"
24 }
25
26 namespace types
27 {
28
29 ThreadId::~ThreadId()
30 {
31 }
32
33 ThreadId::ThreadId(__threadId _id, __threadKey _key)
34 {
35     m_threadId = _id;
36     m_threadKey = _key;
37     __InitLock(&m_threadLock);
38     m_threadStatus = Running;
39     m_isInterruptible = true;
40     m_doInterrupt = false;
41     m_isConsoleCommand = false;
42 }
43
44 __threadId ThreadId::getThreadId()
45 {
46     return m_threadId;
47 }
48
49 void ThreadId::setThreadId(__threadId _id)
50 {
51     this->m_threadId = _id;
52 }
53
54 __threadKey ThreadId::getKey()
55 {
56     return m_threadKey;
57 }
58
59 void ThreadId::setKey(__threadKey _key)
60 {
61     this->m_threadKey = _key;
62 }
63
64 InternalType* ThreadId::clone()
65 {
66     return this;
67 }
68
69 std::wstring ThreadId::StatusToString(Status _status)
70 {
71     switch (_status)
72     {
73         case Running :
74             return L"Running";
75         case Paused :
76             return L"Paused";
77         case Aborted :
78             return L"Aborted";
79         case Done :
80             return L"Done";
81     }
82     return L"";
83 }
84
85 void ThreadId::setStatus(ThreadId::Status _status)
86 {
87     m_threadStatus = _status;
88 }
89
90 ThreadId::Status ThreadId::getStatus(void)
91 {
92     return m_threadStatus;
93 }
94
95 void ThreadId::suspend()
96 {
97     setStatus(Paused);
98     /*
99     ** BJ: Under Linux / Mac having a lock twice will force thread to wait.
100     ** this will not work under windows. So use native Thread suspend and resume functions.
101     */
102
103 #ifndef _MSC_VER
104     __Lock(&m_threadLock);
105     // UnLock will come if resume is called for that thread.
106     __Lock(&m_threadLock);
107     __UnLock(&m_threadLock);
108 #else
109     __SuspendThread(m_threadId);
110 #endif
111 }
112
113 void ThreadId::resume()
114 {
115     setStatus(Running);
116     /*
117     ** BJ: Lock trick to force thread wait does not work under windows.
118     ** This will release Thread::suspend function.
119     ** Thread waiting in pause GW will then continue and check new thread status (Running)
120     */
121 #ifndef _MSC_VER
122     __UnLock(&m_threadLock);
123 #else
124     __ResumeThread(m_threadId);
125 #endif
126 }
127
128 void ThreadId::abort()
129 {
130     setStatus(Aborted);
131     /*
132     ** BJ: Lock trick to force thread wait does not work under windows.
133     ** This will release Thread::suspend function.
134     ** Thread waiting in pause GW will then continue and check new thread status (Aborted)
135     */
136 #ifndef _MSC_VER
137     __UnLock(&m_threadLock);
138 #else
139     __ResumeThread(m_threadId);
140 #endif
141 }
142
143 bool ThreadId::toString(std::wostringstream& ostr)
144 {
145     ostr << L"ThreadId : " << this << std::endl;
146     ostr << L"Status : " << StatusToString(this->getStatus());
147     return true;
148 }
149
150 void ThreadId::setInterrupt(bool _doInterrupt)
151 {
152     m_doInterrupt = _doInterrupt;
153 }
154
155 bool ThreadId::getInterrupt()
156 {
157     return m_doInterrupt;
158 }
159
160 void ThreadId::setInterruptible(bool _isInterruptible)
161 {
162     m_isInterruptible = _isInterruptible;
163 }
164
165 bool ThreadId::isInterruptible()
166 {
167     return m_isInterruptible;
168 }
169
170 void ThreadId::setConsoleCommandFlag(bool _isConsoleCommand)
171 {
172     m_isConsoleCommand = _isConsoleCommand;
173 }
174
175 bool ThreadId::isConsoleCommand()
176 {
177     return m_isConsoleCommand;
178 }
179
180 }