af15e0698b
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
101 lines
2.1 KiB
C
Executable File
101 lines
2.1 KiB
C
Executable File
/* l4lock_c.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4LOCK_CHECK
|
|
|
|
/* Saves information about all current locks */
|
|
typedef struct
|
|
{
|
|
LINK4 link ;
|
|
int next ;
|
|
int prev ;
|
|
int hand ;
|
|
long startPos ;
|
|
long len ;
|
|
long endPos ;
|
|
} L4LOCK_INFO ;
|
|
|
|
static LIST4 lockList ;
|
|
static int first = 1 ;
|
|
static MEM4 *lockAlloc ;
|
|
|
|
int S4FUNCTION l4lock_check()
|
|
{
|
|
return lockList.nLink ;
|
|
}
|
|
|
|
/* Returns true or false; true means found */
|
|
static L4LOCK_INFO *l4lockFind( int h, long p, long l )
|
|
{
|
|
L4LOCK_INFO *lPtr ;
|
|
|
|
if ( first )
|
|
{
|
|
first = 0 ;
|
|
memset( &lockList, 0, sizeof(lockList) ) ;
|
|
lockAlloc = mem4create( 0, 20, sizeof(L4LOCK_INFO), 20, 0 ) ;
|
|
}
|
|
|
|
for ( lPtr = 0; lPtr = (L4LOCK_INFO *) l4next(&lockList, lPtr); )
|
|
{
|
|
if ( lPtr->hand == h && lPtr->startPos == p && lPtr->len == l )
|
|
return lPtr ;
|
|
if ( lPtr->hand == h )
|
|
{
|
|
/* Check for Overlap. */
|
|
if ( lPtr->startPos >= p && lPtr->startPos <= p+l-1 ||
|
|
lPtr->endPos >= p && lPtr->endPos <= p+l-1 ||
|
|
p >= lPtr->startPos && p <= lPtr->endPos ||
|
|
p+l-1 >= lPtr->startPos && p+l-1 <= lPtr->endPos )
|
|
{
|
|
error4( 0, e4result, E86101 ) ;
|
|
return 0 ; ;
|
|
}
|
|
}
|
|
}
|
|
return 0 ;
|
|
}
|
|
|
|
void S4FUNCTION l4lockRemove( int h, long p, long l )
|
|
{
|
|
L4LOCK_INFO *lPtr ;
|
|
|
|
lPtr = l4lockFind( h,p,l ) ;
|
|
if ( lPtr == 0 )
|
|
error4( 0, e4result, E86102 ) ;
|
|
else
|
|
l4remove( &lockList, lPtr ) ;
|
|
}
|
|
|
|
void S4FUNCTION l4lockSave( int h, long p, long l )
|
|
{
|
|
L4LOCK_INFO *lPtr ;
|
|
|
|
if ( l4lockFind(h,p,l) != 0 )
|
|
{
|
|
error4( 0, e4result, E86101 ) ;
|
|
return ;
|
|
}
|
|
|
|
lPtr = (L4LOCK_INFO *) mem4alloc( lockAlloc ) ;
|
|
if ( lPtr == 0 )
|
|
{
|
|
error4( 0, e4memory, E96102 ) ;
|
|
return ;
|
|
}
|
|
l4add( &lockList, lPtr ) ;
|
|
|
|
lPtr->hand = h ;
|
|
lPtr->startPos = p ;
|
|
lPtr->len = l ;
|
|
lPtr->endPos = p+l-1 ;
|
|
}
|
|
|
|
#endif
|