167 lines
4.2 KiB
C++
167 lines
4.2 KiB
C++
// FileZilla Server - a Windows ftp server
|
|
|
|
// Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU General Public License
|
|
// as published by the Free Software Foundation; either version 2
|
|
// of the License, or (at your option) any later version.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
// stdafx.cpp : Quelltextdatei, die nur die Standard-Includes einbindet
|
|
// FileZilla server.pch ist die vorcompilierte Header-Datei
|
|
// stdafx.obj enthält die vorcompilierte Typinformation
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
HWND hMainWnd = NULL;
|
|
|
|
CCriticalSectionWrapper::CCriticalSectionWrapper()
|
|
{
|
|
m_bInitialized = TRUE;
|
|
InitializeCriticalSection(&m_criticalSection);
|
|
#ifdef DEBUG
|
|
m_lockCount = 0;
|
|
#endif
|
|
}
|
|
|
|
CCriticalSectionWrapper::~CCriticalSectionWrapper()
|
|
{
|
|
if (m_bInitialized)
|
|
DeleteCriticalSection(&m_criticalSection);
|
|
m_bInitialized = FALSE;
|
|
}
|
|
|
|
void CCriticalSectionWrapper::Lock()
|
|
{
|
|
if (!m_bInitialized)
|
|
return;
|
|
|
|
EnterCriticalSection(&m_criticalSection);
|
|
#ifdef DEBUG
|
|
m_lockCount++;
|
|
#endif
|
|
}
|
|
|
|
void CCriticalSectionWrapper::Unlock()
|
|
{
|
|
if (!m_bInitialized)
|
|
return;
|
|
|
|
#ifdef DEBUG
|
|
if (m_criticalSection.OwningThread != (HANDLE)GetCurrentThreadId())
|
|
{
|
|
// Suspend thread to avoid further damage
|
|
SuspendThread(GetCurrentThread());
|
|
}
|
|
if (m_lockCount < 1)
|
|
{
|
|
// Suspend thread to avoid further damage
|
|
SuspendThread(GetCurrentThread());
|
|
}
|
|
m_lockCount--;
|
|
#endif
|
|
LeaveCriticalSection(&m_criticalSection);
|
|
}
|
|
|
|
#ifdef DEADLOCKDEBUG
|
|
|
|
CCriticalSectionWrapper deadlocklock; //pun intended
|
|
void EnterCritSectionDebug(CCriticalSectionWrapper §ion, const char *pFile, int line)
|
|
{
|
|
CStdString fn;
|
|
fn.Format("c:\\fz%u.txt", (unsigned int)§ion.m_criticalSection);
|
|
deadlocklock.Lock();
|
|
HANDLE hFile = CreateFile(fn, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
// Avoid overflow, halt server
|
|
int len = GetFileSize(hFile, 0);
|
|
if ((len / 100) > ((len % 100) * 3) + 95)
|
|
{
|
|
SuspendThread(GetCurrentThread());
|
|
while (true)
|
|
Sleep(1000);
|
|
}
|
|
|
|
SetFilePointer(hFile, 0, 0, FILE_END);
|
|
CStdString fn2 = pFile;
|
|
int pos = fn2.ReverseFind('\\');
|
|
if (pos != -1)
|
|
fn2 = fn2.Mid(pos + 1);
|
|
|
|
CStdString str;
|
|
str.Format("locking in %s:%d", fn2.c_str(), line);
|
|
while (str.GetLength() < 98)
|
|
str += " ";
|
|
str += "\r\n";
|
|
DWORD numwritten = 0;
|
|
WriteFile(hFile, str, 100, &numwritten, 0);
|
|
CloseHandle(hFile);
|
|
}
|
|
deadlocklock.Unlock();
|
|
section.Lock();
|
|
deadlocklock.Lock();
|
|
hFile = CreateFile(fn, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
SetFilePointer(hFile, 0, 0, FILE_END);
|
|
CStdString fn2 = pFile;
|
|
int pos = fn2.ReverseFind('\\');
|
|
if (pos != -1)
|
|
fn2 = fn2.Mid(pos + 1);
|
|
|
|
CStdString str;
|
|
str.Format("lock obtained in %s:%d", fn2.c_str(), line);
|
|
while (str.GetLength() < 98)
|
|
str += " ";
|
|
str += "\r\n";
|
|
DWORD numwritten = 0;
|
|
WriteFile(hFile, str, 100, &numwritten, 0);
|
|
CloseHandle(hFile);
|
|
}
|
|
deadlocklock.Unlock();
|
|
}
|
|
|
|
void LeaveCritSectionDebug(CCriticalSectionWrapper §ion, const char *pFile, int line)
|
|
{
|
|
section.Unlock();
|
|
|
|
deadlocklock.Lock();
|
|
CStdString fn;
|
|
fn.Format("c:\\fz%u.txt", (unsigned int)§ion.m_criticalSection);
|
|
HANDLE hFile = CreateFile(fn, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
SetFilePointer(hFile, 0, 0, FILE_END);
|
|
CStdString fn2 = pFile;
|
|
int pos = fn2.ReverseFind('\\');
|
|
if (pos != -1)
|
|
fn2 = fn2.Mid(pos + 1);
|
|
|
|
CStdString str;
|
|
str.Format("unlocked in %s:%d", fn2.c_str(), line);
|
|
while (str.GetLength() < 99)
|
|
str += " ";
|
|
str += "\r\n";
|
|
DWORD numwritten = 0;
|
|
WriteFile(hFile, str, 101, &numwritten, 0);
|
|
int len = GetFileSize(hFile, 0);
|
|
CloseHandle(hFile);
|
|
if ((len / 100) == (len % 100) * 3)
|
|
DeleteFile(fn);
|
|
}
|
|
deadlocklock.Unlock();
|
|
}
|
|
|
|
#endif |