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.
271 lines
6.7 KiB
271 lines
6.7 KiB
/* ----------------------------------------------------------------------
|
|
|
|
Module: ULS.DLL (Service Provider)
|
|
File: sppqueue.h
|
|
Content: This file contains the pending item/queue objects definition.
|
|
History:
|
|
10/15/96 Chu, Lon-Chan [lonchanc]
|
|
Created.
|
|
|
|
Copyright (c) Microsoft Corporation 1996-1997
|
|
|
|
---------------------------------------------------------------------- */
|
|
|
|
#ifndef _ILS_SP_PRQUEUE_H_
|
|
#define _ILS_SP_PRQUEUE_H_
|
|
|
|
#include <pshpack8.h>
|
|
|
|
|
|
/* ------------- Request Scheduler --------------- */
|
|
|
|
#define WM_ILS_REFRESH ((ULONG) -1)
|
|
|
|
typedef struct tagReqMarshal
|
|
{
|
|
struct tagReqMarshal *next;
|
|
ULONG cbTotalSize; // for debug checking
|
|
BYTE *pb; // running pointer
|
|
|
|
ULONG uRespID; // for cancel and error notification
|
|
|
|
ULONG uNotifyMsg;
|
|
ULONG cParams;
|
|
DWORD_PTR aParams[1];
|
|
// more data follows...
|
|
}
|
|
MARSHAL_REQ;
|
|
|
|
|
|
MARSHAL_REQ *MarshalReq_Alloc ( ULONG uNotifyMsg, ULONG cbSize, ULONG cParams );
|
|
HRESULT MarshalReq_SetParam ( MARSHAL_REQ *p, ULONG nIndex, DWORD_PTR dwParam, ULONG cbParamSize );
|
|
DWORD_PTR MarshalReq_GetParam ( MARSHAL_REQ *p, ULONG nIndex );
|
|
HRESULT MarshalReq_SetParamServer ( MARSHAL_REQ *p, ULONG nIndex, SERVER_INFO *pServer, ULONG cbServer );
|
|
|
|
|
|
enum { INVALID_RESP_ID = -1 };
|
|
|
|
|
|
class SP_CRequestQueue
|
|
{
|
|
friend class SP_CResponseQueue;
|
|
friend HRESULT UlsLdap_Cancel ( ULONG );
|
|
|
|
public:
|
|
|
|
SP_CRequestQueue ( VOID );
|
|
~SP_CRequestQueue ( VOID );
|
|
|
|
HRESULT Enter ( MARSHAL_REQ *p );
|
|
VOID Schedule ( VOID );
|
|
VOID Dispatch ( MARSHAL_REQ *p );
|
|
HRESULT Cancel ( ULONG uRespID );
|
|
|
|
BOOL IsEmptyQueue ( VOID ) { return (m_ItemList == NULL); }
|
|
BOOL IsAnyReqInQueue ( VOID ) { return (m_ItemList != NULL); }
|
|
|
|
BOOL IsCurrentRequestCancelled ( VOID ) { return (m_uCurrOpRespID == INVALID_RESP_ID); }
|
|
|
|
protected:
|
|
|
|
VOID LockCurrOp ( VOID ) { EnterCriticalSection (&m_csCurrOp); }
|
|
VOID UnlockCurrOp ( VOID ) { LeaveCriticalSection (&m_csCurrOp); }
|
|
|
|
VOID WriteLock ( VOID ) { EnterCriticalSection (&m_csReqQ); }
|
|
VOID WriteUnlock ( VOID ) { LeaveCriticalSection (&m_csReqQ); }
|
|
|
|
private:
|
|
|
|
VOID ReadLock ( VOID ) { WriteLock (); }
|
|
VOID ReadUnlock ( VOID ) { WriteUnlock (); }
|
|
|
|
MARSHAL_REQ *m_ItemList;
|
|
|
|
CRITICAL_SECTION m_csReqQ;
|
|
|
|
ULONG m_uCurrOpRespID;
|
|
CRITICAL_SECTION m_csCurrOp;
|
|
};
|
|
|
|
extern SP_CRequestQueue *g_pReqQueue;
|
|
|
|
|
|
/* ------------- Response Scheduler --------------- */
|
|
|
|
#define ILS_MIN_RESP_TIMEOUT ((ULONG) (20 * 1000)) // 20 seconds
|
|
#define ILS_DEF_RESP_TIMEOUT ((ULONG) (90 * 1000)) // 90 seconds
|
|
#define ILS_BK_RESP_TIMEOUT_SEC 90 // 90 seconds
|
|
extern ULONG g_uResponseTimeout;
|
|
|
|
#define ILS_MIN_RESP_POLL_PERIOD ((ULONG) 50) // 50 ms
|
|
#define ILS_DEF_RESP_POLL_PERIOD ((ULONG) 100) // 100 ms per PatLam's experiment
|
|
extern ULONG g_uResponsePollPeriod;
|
|
|
|
#define Minute2TickCount(m) ((m) * 60 * 1000)
|
|
#define ILS_DEF_REFRESH_MINUTE 2
|
|
#define ILS_DEF_REFRESH_MARGIN_MINUTE 2
|
|
|
|
|
|
typedef struct
|
|
{
|
|
// ldap specific
|
|
LDAP *ld;
|
|
ULONG uMsgID[2];
|
|
// notification specific
|
|
ULONG uRespID;
|
|
ULONG uNotifyMsg;
|
|
// object specific
|
|
HANDLE hObject; // user, app, prot object
|
|
// mutual dependency specific
|
|
HRESULT hrDependency; // S_OK if not used
|
|
// for extended attributes
|
|
ULONG cAnyAttrs;
|
|
TCHAR *pszAnyAttrNameList;
|
|
// for resolving protocol
|
|
TCHAR *pszProtNameToResolve;
|
|
}
|
|
RESP_INFO;
|
|
|
|
class SP_CResponse
|
|
{
|
|
friend class SP_CResponseQueue;
|
|
|
|
public:
|
|
|
|
SP_CResponse ( VOID );
|
|
~SP_CResponse ( VOID );
|
|
|
|
LDAPMessage *GetResult ( VOID ) { return m_pLdapMsg; }
|
|
|
|
RESP_INFO *GetRespInfo ( VOID ) { return &m_ri; }
|
|
|
|
SP_CSession *GetSession ( VOID ) { return m_pSession; }
|
|
LDAP *GetLd ( VOID ) { return m_ri.ld; }
|
|
|
|
protected:
|
|
|
|
VOID EnterResult ( LDAPMessage *pLdapMsg );
|
|
|
|
VOID EnterRequest ( SP_CSession *pSession, RESP_INFO *pInfo )
|
|
{
|
|
m_pSession = pSession;
|
|
m_ri = *pInfo;
|
|
m_tcTimeout = m_pSession->GetServerTimeoutInTickCount ();
|
|
}
|
|
|
|
SP_CResponse *GetNext ( VOID ) { return m_next; }
|
|
VOID SetNext ( SP_CResponse *pItem ) { m_next = pItem; }
|
|
|
|
private:
|
|
|
|
VOID UpdateLastModifiedTime ( VOID ) { m_tcLastModifiedTime = GetTickCount (); }
|
|
|
|
BOOL IsExpired ( VOID ) { return (GetTickCount () - m_tcLastModifiedTime >= m_tcTimeout); }
|
|
|
|
RESP_INFO m_ri;
|
|
|
|
SP_CSession *m_pSession;
|
|
LDAPMessage *m_pLdapMsg;
|
|
SP_CResponse *m_next;
|
|
|
|
ULONG m_tcLastModifiedTime;
|
|
ULONG m_tcTimeout;
|
|
};
|
|
|
|
|
|
class SP_CResponseQueue
|
|
{
|
|
friend class SP_CRequestQueue;
|
|
friend HRESULT UlsLdap_Cancel ( ULONG );
|
|
|
|
public:
|
|
|
|
SP_CResponseQueue ( VOID );
|
|
~SP_CResponseQueue ( VOID );
|
|
|
|
HRESULT EnterRequest ( SP_CSession *pSession, RESP_INFO *pInfo );
|
|
HRESULT PollLdapResults ( LDAP_TIMEVAL *pTimeout );
|
|
|
|
HRESULT Cancel ( ULONG uRespID );
|
|
|
|
protected:
|
|
|
|
VOID WriteLock ( VOID ) { EnterCriticalSection (&m_csRespQ); }
|
|
VOID WriteUnlock ( VOID ) { LeaveCriticalSection (&m_csRespQ); }
|
|
|
|
private:
|
|
|
|
VOID ReadLock ( VOID ) { WriteLock (); }
|
|
VOID ReadUnlock ( VOID ) { WriteUnlock (); }
|
|
|
|
SP_CResponse *m_ItemList;
|
|
|
|
CRITICAL_SECTION m_csRespQ;
|
|
};
|
|
|
|
|
|
extern SP_CResponseQueue *g_pRespQueue;
|
|
|
|
|
|
VOID FillDefRespInfo ( RESP_INFO *pInfo, ULONG uRespID, LDAP *ld, ULONG uMsgID, ULONG u2ndMsgID );
|
|
|
|
|
|
/* ------------- Refersh Message Scheduler --------------- */
|
|
|
|
class SP_CRefreshScheduler
|
|
{
|
|
public:
|
|
|
|
SP_CRefreshScheduler ( VOID );
|
|
~SP_CRefreshScheduler ( VOID );
|
|
|
|
HRESULT SendRefreshMessages ( UINT uTimerID );
|
|
|
|
HRESULT EnterClientObject ( SP_CClient *pClient );
|
|
HRESULT RemoveClientObject ( SP_CClient *pClient ) { return RemoveObject ((VOID *) pClient); }
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
HRESULT EnterMtgObject ( SP_CMeeting *pMtg );
|
|
HRESULT RemoveMtgObject ( SP_CMeeting *pMtg ) { return RemoveObject ((VOID *) pMtg); }
|
|
#endif
|
|
|
|
protected:
|
|
|
|
private:
|
|
|
|
VOID WriteLock ( VOID ) { EnterCriticalSection (&m_csRefreshScheduler); }
|
|
VOID WriteUnlock ( VOID ) { LeaveCriticalSection (&m_csRefreshScheduler); }
|
|
VOID ReadLock ( VOID ) { WriteLock (); }
|
|
VOID ReadUnlock ( VOID ) { WriteUnlock (); }
|
|
|
|
typedef enum { UNK_OBJ, CLIENT_OBJ, MTG_OBJ } PrivateObjType;
|
|
typedef struct tagREFRESH_ITEM
|
|
{
|
|
INT nIndex;
|
|
PrivateObjType ObjectType;
|
|
VOID *pObject;
|
|
ULONG uTTL;
|
|
struct tagREFRESH_ITEM *next;
|
|
}
|
|
REFRESH_ITEM;
|
|
|
|
INT TimerID2Index ( UINT uTimerID ) { return (INT) uTimerID - KEEP_ALIVE_TIMER_BASE; }
|
|
UINT Index2TimerID ( INT nIndex ) { return (UINT) (nIndex + KEEP_ALIVE_TIMER_BASE); }
|
|
|
|
VOID *AllocItem ( BOOL fNeedLock );
|
|
HRESULT EnterObject ( PrivateObjType ObjectType, VOID *pObject, ULONG uInitialTTL );
|
|
HRESULT RemoveObject ( VOID *pObject );
|
|
|
|
REFRESH_ITEM *m_ListHead;
|
|
CRITICAL_SECTION m_csRefreshScheduler;
|
|
};
|
|
|
|
|
|
extern SP_CRefreshScheduler *g_pRefreshScheduler;
|
|
|
|
|
|
#include <poppack.h>
|
|
|
|
#endif // _ILS_SP_PRQUEUE_H_
|
|
|
|
|