NTrace
GPU ray tracing framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Thread.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2011, NVIDIA Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of NVIDIA Corporation nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #pragma once
29 #include "base/Hash.hpp"
30 #include "base/DLLImports.hpp"
31 
32 namespace FW
33 {
34 //------------------------------------------------------------------------
35 
36 class Spinlock
37 {
38 public:
39  Spinlock (void);
40  ~Spinlock (void);
41 
42  void enter (void);
43  void leave (void);
44 
45 private:
46  Spinlock (const Spinlock&); // forbidden
47  Spinlock& operator= (const Spinlock&); // forbidden
48 
49 private:
50  CRITICAL_SECTION m_critSect;
51 };
52 
53 //------------------------------------------------------------------------
54 
55 class Semaphore
56 {
57 public:
58  Semaphore (int initCount = 1, int maxCount = 1);
59  ~Semaphore (void);
60 
61  bool acquire (int millis = -1);
62  void release (void);
63 
64 private:
65  Semaphore (const Semaphore&); // forbidden
66  Semaphore& operator= (const Semaphore&); // forbidden
67 
68 private:
69  HANDLE m_handle;
70 };
71 
72 //------------------------------------------------------------------------
73 
74 class Monitor
75 {
76 public:
77  Monitor (void);
78  ~Monitor (void);
79 
80  void enter (void);
81  void leave (void);
82  void wait (void);
83  void notify (void);
84  void notifyAll (void);
85 
86 private:
87  Monitor (const Monitor&); // forbidden
88  Monitor& operator= (const Monitor&); // forbidden
89 
90 private:
91  // Legacy implementation, works on all Windows versions.
92 
93  Spinlock m_lock;
94  Semaphore m_ownerSem;
95  Semaphore m_waitSem;
96  Semaphore m_notifySem;
97  volatile U32 m_ownerThread;
98  volatile S32 m_enterCount;
99  volatile S32 m_waitCount;
100 
101  // Efficient implementation, requires Windows Vista.
102 
103  CRITICAL_SECTION m_mutex;
104  CONDITION_VARIABLE m_condition;
105 };
106 
107 //------------------------------------------------------------------------
108 
109 class Thread
110 {
111 public:
112  typedef void (*ThreadFunc)(void* param);
113  typedef void (*DeinitFunc)(void* data);
114 
115  enum
116  {
120  };
121 
122 private:
123  struct StartParams
124  {
125  Thread* thread;
126  ThreadFunc userFunc;
127  void* userParam;
128  Semaphore ready;
129  };
130 
131  struct UserData
132  {
133  void* data;
134  DeinitFunc deinitFunc;
135  };
136 
137 public:
138  Thread (void);
139  ~Thread (void);
140 
141  void start (ThreadFunc func, void* param);
142 
143  static Thread* getCurrent (void);
144  static Thread* getMain (void);
145  static bool isMain (void);
146  static U32 getID (void);
147  static void sleep (int millis);
148  static void yield (void);
149 
150  int getPriority (void);
151  void setPriority (int priority);
152  bool isAlive (void);
153  void join (void);
154 
155  void* getUserData (const String& id);
156  void setUserData (const String& id, void* data, DeinitFunc deinitFunc = NULL);
157 
158  static void suspendAll (void); // Called by fail().
159 
160 private:
161  void refer (void);
162  void unrefer (void); // Deferred call to exited() once m_exited == true and refCount == 0.
163 
164  void started (void);
165  void exited (void);
166 
167  static DWORD WINAPI threadProc (LPVOID lpParameter);
168 
169 private:
170  Thread (const Thread&); // forbidden
171  Thread& operator= (const Thread&); // forbidden
172 
173 private:
174  static Spinlock s_lock;
175  static Thread* s_mainThread;
176  static Hash<U32, Thread*> s_threads;
177 
178  Spinlock m_lock;
179  S32 m_refCount;
180  bool m_exited;
181 
182  Spinlock m_startLock;
183  U32 m_id;
184  HANDLE m_handle;
185  S32 m_priority;
186 
187  Hash<String, UserData> m_userData;
188 };
189 
190 //------------------------------------------------------------------------
191 }
#define NULL
Definition: Defs.hpp:39
static Thread * getMain(void)
Definition: Thread.cpp:308
static U32 getID(void)
Definition: Thread.cpp:324
Semaphore(int initCount=1, int maxCount=1)
Definition: Thread.cpp:68
bool isAlive(void)
Definition: Thread.cpp:370
void(* DeinitFunc)(void *data)
Definition: Thread.hpp:113
void setUserData(const String &id, void *data, DeinitFunc deinitFunc=NULL)
Definition: Thread.cpp:418
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction int int grid_height CUevent unsigned int Flags CUevent hEvent CUevent hEvent CUstream unsigned int Flags CUstream hStream GLuint bufferobj unsigned int CUdevice dev CUdeviceptr unsigned int CUmodule const char name CUdeviceptr unsigned int bytesize CUdeviceptr dptr void unsigned int bytesize void CUdeviceptr unsigned int ByteCount CUarray unsigned int CUdeviceptr unsigned int ByteCount CUarray unsigned int const void unsigned int ByteCount CUarray unsigned int CUarray unsigned int unsigned int ByteCount void CUarray unsigned int unsigned int CUstream hStream const CUDA_MEMCPY2D pCopy CUdeviceptr const void unsigned int CUstream hStream const CUDA_MEMCPY2D CUstream hStream CUdeviceptr unsigned char unsigned int N CUdeviceptr unsigned int unsigned int N CUdeviceptr unsigned int unsigned short unsigned int unsigned int Height CUarray const CUDA_ARRAY_DESCRIPTOR pAllocateArray CUarray const CUDA_ARRAY3D_DESCRIPTOR pAllocateArray unsigned int CUtexref CUdeviceptr unsigned int bytes CUcontext unsigned int CUdevice device GLenum texture GLenum GLuint buffer GLenum GLuint renderbuffer GLenum GLsizeiptr const GLvoid * data
Definition: DLLImports.inl:319
void start(ThreadFunc func, void *param)
Definition: Thread.cpp:271
void setPriority(int priority)
Definition: Thread.cpp:359
~Spinlock(void)
Definition: Thread.cpp:47
static void suspendAll(void)
Definition: Thread.cpp:457
void * getUserData(const String &id)
Definition: Thread.cpp:407
void leave(void)
Definition: Thread.cpp:150
void notify(void)
Definition: Thread.cpp:197
~Thread(void)
Definition: Thread.cpp:245
void release(void)
Definition: Thread.cpp:94
int getPriority(void)
Definition: Thread.cpp:345
void join(void)
Definition: Thread.cpp:393
Monitor(void)
Definition: Thread.cpp:102
Thread(void)
Definition: Thread.cpp:235
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction int int grid_height CUevent unsigned int Flags CUevent hEvent CUevent hEvent CUstream unsigned int Flags CUstream hStream GLuint bufferobj unsigned int CUdevice dev CUdeviceptr unsigned int CUmodule const char name CUdeviceptr unsigned int bytesize CUdeviceptr dptr void unsigned int bytesize void CUdeviceptr unsigned int ByteCount CUarray unsigned int CUdeviceptr unsigned int ByteCount CUarray unsigned int const void unsigned int ByteCount CUarray unsigned int CUarray unsigned int unsigned int ByteCount void CUarray unsigned int unsigned int CUstream hStream const CUDA_MEMCPY2D pCopy CUdeviceptr const void unsigned int CUstream hStream const CUDA_MEMCPY2D CUstream hStream CUdeviceptr unsigned char unsigned int N CUdeviceptr unsigned int unsigned int N CUdeviceptr unsigned int unsigned short unsigned int unsigned int Height CUarray const CUDA_ARRAY_DESCRIPTOR pAllocateArray CUarray const CUDA_ARRAY3D_DESCRIPTOR pAllocateArray unsigned int CUtexref CUdeviceptr unsigned int bytes CUcontext unsigned int CUdevice device GLenum texture GLenum GLuint buffer GLenum GLuint renderbuffer GLenum GLsizeiptr const GLvoid GLenum usage GLuint shader GLenum type GLsizei const GLuint framebuffers GLsizei const GLuint renderbuffers GLuint v GLuint v GLenum GLenum GLenum GLuint GLint level GLsizei GLuint framebuffers GLuint const GLchar name GLenum GLintptr GLsizeiptr GLvoid data GLuint GLenum GLint * param
Definition: DLLImports.inl:341
signed int S32
Definition: Defs.hpp:88
bool acquire(int millis=-1)
Definition: Thread.cpp:84
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction int int grid_height CUevent unsigned int Flags CUevent hEvent CUevent hEvent CUstream unsigned int Flags CUstream hStream GLuint bufferobj unsigned int CUdevice dev CUdeviceptr unsigned int CUmodule const char name CUdeviceptr unsigned int bytesize CUdeviceptr dptr void unsigned int bytesize void CUdeviceptr unsigned int ByteCount CUarray unsigned int CUdeviceptr unsigned int ByteCount CUarray unsigned int const void unsigned int ByteCount CUarray unsigned int CUarray unsigned int unsigned int ByteCount void CUarray unsigned int unsigned int CUstream hStream const CUDA_MEMCPY2D pCopy CUdeviceptr const void unsigned int CUstream hStream const CUDA_MEMCPY2D CUstream hStream CUdeviceptr unsigned char unsigned int N CUdeviceptr unsigned int unsigned int N CUdeviceptr unsigned int unsigned short unsigned int unsigned int Height CUarray const CUDA_ARRAY_DESCRIPTOR pAllocateArray CUarray const CUDA_ARRAY3D_DESCRIPTOR pAllocateArray unsigned int CUtexref CUdeviceptr unsigned int bytes CUcontext unsigned int CUdevice device GLenum texture GLenum GLuint buffer GLenum GLuint renderbuffer GLenum GLsizeiptr const GLvoid GLenum usage GLuint shader GLenum type GLsizei const GLuint framebuffers GLsizei const GLuint renderbuffers GLuint v GLuint v GLenum GLenum GLenum GLuint GLint level GLsizei GLuint framebuffers GLuint const GLchar name GLenum GLintptr GLsizeiptr GLvoid data GLuint GLenum GLint param GLuint GLenum GLint param GLhandleARB programObj GLenum GLenum GLsizei GLsizei height GLenum GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid pixels GLint GLsizei const GLfloat value GLint GLfloat GLfloat v1 GLint GLfloat GLfloat GLfloat v2 GLint GLsizei const GLfloat value GLint GLsizei GLboolean const GLfloat value GLuint program GLuint GLfloat GLfloat GLfloat z GLuint GLint GLenum GLboolean GLsizei const GLvoid pointer GLuint GLuint const GLchar name GLenum GLsizei GLenum GLsizei GLsizei height GLenum GLuint renderbuffer GLenum GLenum GLint params GLuint GLsizei range GLuint GLsizei const GLubyte GLsizei GLenum const GLvoid coords GLuint GLsizei GLsizei GLsizei const GLubyte GLsizei GLenum const GLvoid coords GLuint GLenum GLsizei const GLvoid pathString GLuint GLenum const GLvoid GLbitfield GLuint GLsizei GLenum GLuint GLfloat emScale GLuint GLuint srcPath GLuint GLuint GLenum const GLfloat transformValues GLuint GLenum GLint value GLuint GLenum GLfloat value GLenum func
Definition: DLLImports.inl:400
void notifyAll(void)
Definition: Thread.cpp:216
unsigned int U32
Definition: Defs.hpp:85
Spinlock(void)
Definition: Thread.cpp:40
~Monitor(void)
Definition: Thread.cpp:117
void enter(void)
Definition: Thread.cpp:124
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction int int grid_height CUevent unsigned int Flags CUevent hEvent CUevent hEvent CUstream unsigned int Flags CUstream hStream GLuint bufferobj unsigned int CUdevice dev CUdeviceptr unsigned int CUmodule const char name CUdeviceptr unsigned int bytesize CUdeviceptr dptr void unsigned int bytesize void CUdeviceptr unsigned int ByteCount CUarray unsigned int CUdeviceptr unsigned int ByteCount CUarray unsigned int const void unsigned int ByteCount CUarray unsigned int CUarray unsigned int unsigned int ByteCount void CUarray unsigned int unsigned int CUstream hStream const CUDA_MEMCPY2D pCopy CUdeviceptr const void unsigned int CUstream hStream const CUDA_MEMCPY2D CUstream hStream CUdeviceptr unsigned char unsigned int N CUdeviceptr unsigned int unsigned int N CUdeviceptr unsigned int unsigned short unsigned int unsigned int Height CUarray const CUDA_ARRAY_DESCRIPTOR pAllocateArray CUarray const CUDA_ARRAY3D_DESCRIPTOR pAllocateArray unsigned int CUtexref CUdeviceptr unsigned int bytes CUcontext unsigned int CUdevice device GLenum texture GLenum GLuint buffer GLenum GLuint renderbuffer GLenum GLsizeiptr const GLvoid GLenum usage GLuint shader GLenum type GLsizei const GLuint framebuffers GLsizei const GLuint renderbuffers GLuint v GLuint v GLenum GLenum GLenum GLuint GLint level GLsizei GLuint framebuffers GLuint const GLchar name GLenum GLintptr GLsizeiptr GLvoid data GLuint GLenum GLint param GLuint GLenum GLint param GLhandleARB programObj GLenum GLenum GLsizei GLsizei height GLenum GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid pixels GLint GLsizei const GLfloat value GLint GLfloat GLfloat v1 GLint GLfloat GLfloat GLfloat v2 GLint GLsizei const GLfloat value GLint GLsizei GLboolean const GLfloat value GLuint program GLuint GLfloat GLfloat GLfloat z GLuint GLint GLenum GLboolean GLsizei const GLvoid pointer GLuint GLuint const GLchar name GLenum GLsizei GLenum GLsizei GLsizei height GLenum GLuint renderbuffer GLenum GLenum GLint params GLuint GLsizei range GLuint GLsizei const GLubyte GLsizei GLenum const GLvoid coords GLuint GLsizei GLsizei GLsizei const GLubyte GLsizei GLenum const GLvoid coords GLuint GLenum GLsizei const GLvoid pathString GLuint GLenum const GLvoid GLbitfield GLuint GLsizei GLenum GLuint GLfloat emScale GLuint GLuint srcPath GLuint GLuint GLenum const GLfloat transformValues GLuint GLenum GLint value GLuint GLenum GLfloat value GLenum GLint GLuint mask GLuint GLenum GLuint mask GLsizei GLenum const GLvoid GLuint GLenum GLuint GLenum const GLfloat transformValues GLenum func GLenum GLenum GLint const GLfloat coeffs GLuint GLenum coverMode GLsizei GLenum const GLvoid GLuint GLenum GLenum const GLfloat transformValues GLuint GLenum GLint value GLuint GLubyte commands GLuint GLfloat dashArray GLbitfield GLuint GLsizei GLsizei GLfloat metrics GLenum GLenum GLint value GLenum GLenum GLint value GLuint GLuint GLfloat GLfloat y GLuint GLsizei GLsizei numSegments WINAPI
Definition: DLLImports.inl:437
~Semaphore(void)
Definition: Thread.cpp:77
static Thread * getCurrent(void)
Definition: Thread.cpp:291
static void sleep(int millis)
Definition: Thread.cpp:331
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx void
Definition: DLLImports.inl:58
void leave(void)
Definition: Thread.cpp:61
static void yield(void)
Definition: Thread.cpp:338
void enter(void)
Definition: Thread.cpp:54
void(* ThreadFunc)(void *param)
Definition: Thread.hpp:112
void wait(void)
Definition: Thread.cpp:167
static bool isMain(void)
Definition: Thread.cpp:316