Q: CriticalSection in CHttpFilter class crashes W3Svc
Felix Burkhard -- fburkhar@metz.une.edu.au
Thursday, October 31, 1996
Environment: VC++4.2b, NT 4.0
I am in the process of developing my own little Web counter. I am
using the ISAPI MFC extensions to write a filter. The filter processes
OnLog requests and updates a INI file variable. To avoid conflicts
with the app that inserts the counter into the html page, I want to
protect the access to the INI file with a Crtical Section. If I
comment out the CrtSect it works, if I leave it in, it crashes the
WebServer in the call to the BaseClass OnLog, (actially somewhere deep
down in NTOSKERNEL).
Anyone any hints?? Thanks in advance!
Code in .h:
class CIislogFilter : public CHttpFilter
{
void UpdateSiteHits(const char* pszUrl);
public:
CIislogFilter();
~CIislogFilter();
static CRITICAL_SECTION m_csIniLock;
virtual BOOL GetFilterVersion(PHTTP_FILTER_VERSION pVer);
virtual DWORD OnLog(CHttpFilterContext* pCtxt, PHTTP_FILTER_LOG
pLog); };
in .cpp (code created by appwiz deleted):
// Critical section to protect access to Ini file
CRITICAL_SECTION CIislogFilter::m_csIniLock;
DWORD CIislogFilter::OnLog (CHttpFilterContext* pCtxt,
PHTTP_FILTER_LOG pLog)
{
UpdateSiteHits(pLog->pszTarget);
// Crashes in here if Enter/Leave CrtitcalSection is used
return CHttpFilter::OnLog(pCtxt, pLog);
}// OnLog
void CIislogFilter::UpdateSiteHits (const char* pszUrl)
{
char szCounter[8];
char szUrl[256];
UINT uCounter = 0;
// Skip if URL is to long
if (strlen(pszUrl) > sizeof(szUrl))
return;
// Create a local copy of the URL
strcpy(szUrl, pszUrl);
// Obtain current counter
uCounter = GetPrivateProfileInt(c_szSiteHitsKey, szUrl, 0,
c_szSiteHitsIni);
// Just increment the counter
EnterCriticalSection(&CIislogFilter::m_csIniLock);
wsprintf(szCounter, "%d", ++uCounter);
WritePrivateProfileString(c_szSiteHitsKey, szUrl, szCounter,
c_szSiteHitsIni);
LeaveCriticalSection(&CIislogFilter::m_csIniLock);
}// UpdateSiteHits
Felix Burkhard
Software Development Group phone: +61 67 73-3191
Geophysical Technology Ltd fax: +61 67 73-3307
UNE Campus email: felixb@gri.une.edu.au
Armidale NSW 2351, AUSTRALIA http://gri.une.edu.au/felixb
-------------------------------------------------------------------------
Mike Blaszczak -- mikeblas@nwlink.com
Friday, November 01, 1996
[Mini-digest: 4 responses]
At 09:17 10/31/96 +10, you wrote:
>Environment: VC++4.2b, NT 4.0
>Anyone any hints??
Sure. Here's the biggest hint I can think of: READ THE DOCUMENTATION.
The Win32 SDK says, in two or three different places, that you need to
call InitCriticalSection() on a CRITICAL_SECTION structure before you
ever use it. In other words, the reason you're crashing is that you
call EnterCriticalSection() on critical section that nobody knows anything
about.
What you've coded is just as bad as:
char *pstr;
strcpy(pstr, "Hockey is best.");
That is, you're just stuffing your needs into memory that doesn't belong
to you.
If you read some different documentation, you would see that
CCriticalSection would come to your rescue: you'd end up constructing the
object implicitly and you'd not have to worry about calling
InitCriticalSection().
>If I comment out the CrtSect it works, if I leave it in, it crashes the
>WebServer in the call to the BaseClass OnLog, (actially somewhere deep
>down in NTOSKERNEL).
In other words: "If you comment out your totally bogus code, you'll be
okay. Otherwise, if you leave your totally bogus code in there, you'll
die in a firey crash."
>Thanks in advance!
Will you buy me _two_ hockey teams?? Thanks in advance!
.B ekiM
http://www.nwlink.com/~mikeblas/
I'm afraid I've become some sort of speed freak.
These words are my own. I do not speak on behalf of Microsoft.
-----From: "Alan J. Livingston"
I didn't see your constructor, but do you call InitializeCriticalSection?
-----From: Ernesto Perales Soto
Maybe "InitializeCriticalSection" and "DestroyCriticalSection" are
missing?
--
Ernesto Perales Soto
eperales@infosel.com.mx
| Вернуться в корень Архива
|