b1f57ba205d412edc43d0040fc007d5ed7d263d8
[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 }
40
41 __threadId ThreadId::getThreadId()
42 {
43     return m_threadId;
44 }
45
46 void ThreadId::setThreadId(__threadId _id)
47 {
48     this->m_threadId = _id;
49 }
50
51 __threadKey ThreadId::getKey()
52 {
53     return m_threadKey;
54 }
55
56 void ThreadId::setKey(__threadKey _key)
57 {
58     this->m_threadKey = _key;
59 }
60
61 InternalType* ThreadId::clone()
62 {
63     return this;
64 }
65
66 std::wstring ThreadId::StatusToString(Status _status)
67 {
68     switch (_status)
69     {
70         case Running :
71             return L"Running";
72         case Paused :
73             return L"Paused";
74         case Aborted :
75             return L"Aborted";
76         case Done :
77             return L"Done";
78     }
79     return L"";
80 }
81
82 void ThreadId::setStatus(ThreadId::Status _status)
83 {
84     m_threadStatus = _status;
85 }
86
87 ThreadId::Status ThreadId::getStatus(void)
88 {
89     return m_threadStatus;
90 }
91
92 void ThreadId::suspend()
93 {
94     setStatus(Paused);
95     /*
96     ** BJ: Under Linux / Mac having a lock twice will force thread to wait.
97     ** this will not work under windows. So use native Thread suspend and resume functions.
98     */
99
100 #ifndef _MSC_VER
101     __Lock(&m_threadLock);
102     // UnLock will come if resume is called for that thread.
103     __Lock(&m_threadLock);
104     __UnLock(&m_threadLock);
105 #else
106     __SuspendThread(m_threadId);
107 #endif
108 }
109
110 void ThreadId::resume()
111 {
112     setStatus(Running);
113     /*
114     ** BJ: Lock trick to force thread wait does not work under windows.
115     ** This will release Thread::suspend function.
116     ** Thread waiting in pause GW will then continue and check new thread status (Running)
117     */
118 #ifndef _MSC_VER
119     __UnLock(&m_threadLock);
120 #else
121     __ResumeThread(m_threadId);
122 #endif
123 }
124
125 void ThreadId::abort()
126 {
127     setStatus(Aborted);
128     /*
129     ** BJ: Lock trick to force thread wait does not work under windows.
130     ** This will release Thread::suspend function.
131     ** Thread waiting in pause GW will then continue and check new thread status (Aborted)
132     */
133 #ifndef _MSC_VER
134     __UnLock(&m_threadLock);
135 #else
136     __ResumeThread(m_threadId);
137 #endif
138 }
139
140 bool ThreadId::toString(std::wostringstream& ostr)
141 {
142     ostr << L"ThreadId : " << this << std::endl;
143     ostr << L"Status : " << StatusToString(this->getStatus());
144     return true;
145 }
146 }
147