]> git.vomp.tv Git - vompclient.git/blob - threadwin.cc
Portability
[vompclient.git] / threadwin.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "threadwin.h"
22
23 // Undeclared functions, only for use in this file to start the thread
24 DWORD WINAPI threadInternalStart(void *arg)
25 {
26   Thread *t = (Thread *)arg;
27   t->threadInternalStart2();
28   return 0;
29 }
30
31 int ThreadP::threadStart()
32 {
33   threadCond = CreateEvent(NULL,FALSE,FALSE,NULL);
34   if (threadCond == NULL) return 0;
35   threadCondMutex = CreateMutex(NULL,TRUE,NULL);
36   if (threadCondMutex == NULL)
37   {
38     CloseHandle(threadCond);
39     return 0;
40   }
41
42   threadActive = 1;
43   DWORD threadId;
44   pthread = CreateThread(NULL, 0, threadInternalStart, (void*)this,0, &threadId);
45   if (pthread == NULL)
46   {
47     CloseHandle(threadCond);
48     CloseHandle(threadCondMutex);
49     return 0;
50   }
51   return 1;
52 }
53
54 void ThreadP::threadStop()
55 {
56   threadActive = 0;
57   // Signal thread here in case it's waiting
58   threadSignal();
59   WaitForSingleObject(pthread, INFINITE);
60   this->threadPostStopCleanup();
61 }
62
63 void ThreadP::threadCancel()
64 {
65   threadActive = 0;
66   TerminateThread(pthread, 0);
67   WaitForSingleObject(pthread, INFINITE);
68   this->threadPostStopCleanup();
69 }
70
71 void ThreadP::threadCheckExit()
72 {
73   if (!threadActive) ExitThread(NULL);
74 }
75
76 void ThreadP::threadLock()
77 {
78   WaitForSingleObject(threadCondMutex, INFINITE);
79 }
80
81 void ThreadP::threadUnlock()
82 {
83   ReleaseMutex(threadCondMutex);
84 }
85
86 void ThreadP::threadSignal()
87 {
88   WaitForSingleObject(threadCondMutex, INFINITE);
89   SetEvent(threadCond);
90   ReleaseMutex(threadCondMutex);
91 }
92
93 void ThreadP::threadSignalNoLock()
94 {
95   SetEvent(threadCond);
96 }
97
98 void ThreadP::threadWaitForSignal()
99 {
100   WaitForSingleObject(threadCond,INFINITE);
101 }
102
103 void ThreadP::threadWaitForSignalTimed(struct timespec* ts)
104 {
105   HANDLE handles[2] ={threadCond, NULL};
106   LARGE_INTEGER duration;
107   duration.QuadPart=ts->tv_sec*1000*1000*10+ts->tv_nsec/100;
108
109   handles[1]=CreateWaitableTimer(NULL,TRUE,NULL);
110   /* SetWaitableTimer(handles[1], &duration, 0, NULL, NULL, 0);
111   WaitForMultipleObject(2,handles,INFINITE);*/
112   CloseHandle(handles[1]);
113 }
114
115 void ThreadP::threadSetKillable()
116 {
117   //WIN32:Ignore or use a separate Event Object to simulate this
118 }