aboutsummaryrefslogtreecommitdiff
path: root/libs/usvfs/src/usvfs_dll/semaphore.h
blob: 1048c47f4265e92312959f110d5b7319df41121d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma once

// based on code by Jeff Preshing

// this is a synchronization class that prefers
// undefined behaviour over deadlock. It's utterly broken
// and needs to be replaced in time.

class RecursiveBenaphore
{

public:
  RecursiveBenaphore();
  ~RecursiveBenaphore();

  // wait on the semaphore. after timeout this will check if the current owner
  // thread is still alive and steal the semaphore if it isn't. Otherwise this
  // will continue to wait.
  void wait(DWORD timeout = INFINITE);
  void signal();

private:
  LONG m_Counter;
  DWORD m_OwnerId;
  int m_Recursion;
  HANDLE m_Semaphore;
};