Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

106 lines
3.2 KiB

//-----------------------------------------------------------------------------
//
//
// File: failmsgq.h
//
// Description:
// Header file for CFailedMsgQueue class with servers as a holding place
// for messages that cannot be delivered due to out of memory and other
// conditions.
//
// Author: Mike Swafford (MikeSwa)
//
// History:
// 1/18/99 - MikeSwa Created
//
// Copyright (C) 1999 Microsoft Corporation
//
//-----------------------------------------------------------------------------
#ifndef __FAILMSGQ_H__
#define __FAILMSGQ_H__
#include "aqincs.h"
#include "rwnew.h"
class CMsgRef;
class CAQSvrInst;
#define FAILEDMSGQUEUE_SIG ' QMF'
//---[ CFailedMsgQueue ]-------------------------------------------------------
//
//
// Description:
// Class that abtracts handling of failed messages. There is no
// additional memory allocation need during the processing of the
// of these failed messages. The key design point is that none of these
// API calls can fail.
//
// This class contains a single list entries for MailMsgs. MailMsgs that
// have been dropped here must not be referenced by another other thread,
// or we might break the threading-access restrictions of the mailmsg
// interface. Once a MailMsg has been queued, it is encapsultated in a
// CMsgRef object, which can be referenced by many threads. At this point
// we must wait until all references to that CMsgRef are released.
//
// Hungarian:
// fmq, pfmq
//
//-----------------------------------------------------------------------------
class CFailedMsgQueue
{
private:
DWORD m_dwSignature;
DWORD m_dwFlags;
DWORD m_cMsgs;
CAQSvrInst *m_paqinst;
LIST_ENTRY m_liHead;
CShareLockNH m_slPrivateData;
enum
{
FMQ_CALLBACK_REQUESTED = 0x00000001,
};
void InternalStartProcessingIfNecessary();
public:
CFailedMsgQueue();
~CFailedMsgQueue();
void Initialize(CAQSvrInst *paqinst);
void Deinitialize();
//Functions called to handle a failure
void HandleFailedMailMsg(IMailMsgProperties *pIMailMsgProperties);
//Called on SubmitMessage to kick off processing if necessary
inline void StartProcessingIfNecessary()
{
if (!(FMQ_CALLBACK_REQUESTED & m_dwFlags) && m_cMsgs)
InternalStartProcessingIfNecessary();
}
//Member function and callback function to process entries.
void ProcessEntries();
static void ProcessEntriesCallback(PVOID pvContext);
};
//---[ AQueueFailedListEntry ]-------------------------------------------------
//
//
// Description:
// Actual in-memory representation of LIST_ENTRY ptr returned by mailmsg.
// Memory after LIST_ENTRY is used to store original pointer.
// Hungarian:
// fli, pfli
//
//-----------------------------------------------------------------------------
typedef struct tagAQueueFailedListEntry
{
LIST_ENTRY m_li;
IMailMsgProperties *m_pIMailMsgProperties;
} AQueueFailedListEntry;
#endif //__FAILMSGQ_H__