/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#ifndef __MSPTHRD_H
#define __MSPTHRD_H
typedef enum {
WORK_ITEM,STOP
} COMMAND;
typedef struct {
COMMAND cmd;
LPTHREAD_START_ROUTINE pfn;
PVOID pContext;
HANDLE hEvent;
} COMMAND_NODE;
typedef struct {
LIST_ENTRY link;
COMMAND_NODE node;
} COMMAND_QUEUE_ITEM;
typedef struct _NOTIF_LIST {
CMSPAddress *addr;
_NOTIF_LIST *next;
} NOTIF_LIST,*PNOTIF_LIST;
class CMSPThread {
public:
CMSPThread() {
InitializeListHead(&m_CommandQueue);
m_hCommandEvent = NULL;
m_hThread = NULL;
m_NotifList = NULL;
m_iStartCount = 0;
}
~CMSPThread() { };
HRESULT Start();
HRESULT Stop();
HRESULT Shutdown();
HRESULT ThreadProc();
static LRESULT CALLBACK NotifWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HRESULT RegisterPnpNotification(CMSPAddress *pCMSPAddress);
HRESULT UnregisterPnpNotification(CMSPAddress *pCMSPAddress);
HRESULT QueueWorkItem(LPTHREAD_START_ROUTINE Function,PVOID Context,WINBOOL fSynchronous);
private:
WINBOOL SignalThreadProc() { return SetEvent(m_hCommandEvent); }
CMSPCritSection m_CountLock;
CMSPCritSection m_QueueLock;
int m_iStartCount;
LIST_ENTRY m_CommandQueue;
HANDLE m_hCommandEvent;
HANDLE m_hThread;
HDEVNOTIFY m_hDevNotifyVideo;
HDEVNOTIFY m_hDevNotifyAudio;
HWND m_hWndNotif;
PNOTIF_LIST m_NotifList;
CMSPCritSection m_NotifLock;
};
extern CMSPThread g_Thread;
#endif