1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef __MSPTHRD_H
7 #define __MSPTHRD_H
8 
9 typedef enum {
10   WORK_ITEM,STOP
11 } COMMAND;
12 
13 typedef struct {
14   COMMAND cmd;
15   LPTHREAD_START_ROUTINE pfn;
16   PVOID pContext;
17   HANDLE hEvent;
18 } COMMAND_NODE;
19 
20 typedef struct {
21   LIST_ENTRY link;
22   COMMAND_NODE node;
23 } COMMAND_QUEUE_ITEM;
24 
25 typedef struct _NOTIF_LIST {
26   CMSPAddress *addr;
27   _NOTIF_LIST *next;
28 } NOTIF_LIST,*PNOTIF_LIST;
29 
30 class CMSPThread {
31 public:
CMSPThread()32   CMSPThread() {
33     InitializeListHead(&m_CommandQueue);
34     m_hCommandEvent = NULL;
35     m_hThread = NULL;
36     m_NotifList = NULL;
37     m_iStartCount = 0;
38   }
~CMSPThread()39   ~CMSPThread() { };
40   HRESULT Start();
41   HRESULT Stop();
42   HRESULT Shutdown();
43   HRESULT ThreadProc();
44   static LRESULT CALLBACK NotifWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
45   HRESULT RegisterPnpNotification(CMSPAddress *pCMSPAddress);
46   HRESULT UnregisterPnpNotification(CMSPAddress *pCMSPAddress);
47   HRESULT QueueWorkItem(LPTHREAD_START_ROUTINE Function,PVOID Context,WINBOOL fSynchronous);
48 private:
SignalThreadProc()49   WINBOOL SignalThreadProc() { return SetEvent(m_hCommandEvent); }
50   CMSPCritSection m_CountLock;
51   CMSPCritSection m_QueueLock;
52   int m_iStartCount;
53   LIST_ENTRY m_CommandQueue;
54   HANDLE m_hCommandEvent;
55   HANDLE m_hThread;
56   HDEVNOTIFY m_hDevNotifyVideo;
57   HDEVNOTIFY m_hDevNotifyAudio;
58   HWND m_hWndNotif;
59   PNOTIF_LIST m_NotifList;
60   CMSPCritSection m_NotifLock;
61 };
62 
63 extern CMSPThread g_Thread;
64 #endif
65