which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
100 lines
2.2 KiB
C
Executable File
100 lines
2.2 KiB
C
Executable File
/* l4lock_c.c (c)Copyright Sequiter Software Inc., 1990-1994. 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 start_pos ;
|
|
long len ;
|
|
long end_pos ;
|
|
} L4LOCK_INFO ;
|
|
|
|
static LIST4 lock_list ;
|
|
static int first = 1 ;
|
|
static MEM4 *lock_alloc ;
|
|
|
|
int S4FUNCTION l4lock_check()
|
|
{
|
|
return lock_list.n_link ;
|
|
}
|
|
|
|
/* Returns true or false; true means found */
|
|
static L4LOCK_INFO *l4lock_find( int h, long p, long l )
|
|
{
|
|
L4LOCK_INFO *l_ptr ;
|
|
|
|
if ( first )
|
|
{
|
|
first = 0 ;
|
|
memset( &lock_list, 0, sizeof(lock_list) ) ;
|
|
lock_alloc = mem4create( 0, 20, sizeof(L4LOCK_INFO), 20, 0 ) ;
|
|
}
|
|
|
|
for ( l_ptr = 0; l_ptr = (L4LOCK_INFO *) l4next(&lock_list, l_ptr); )
|
|
{
|
|
if ( l_ptr->hand == h && l_ptr->start_pos == p && l_ptr->len == l )
|
|
return l_ptr ;
|
|
if ( l_ptr->hand == h )
|
|
{
|
|
/* Check for Overlap. */
|
|
if ( l_ptr->start_pos >= p && l_ptr->start_pos <= p+l-1 ||
|
|
l_ptr->end_pos >= p && l_ptr->end_pos <= p+l-1 ||
|
|
p >= l_ptr->start_pos && p <= l_ptr->end_pos ||
|
|
p+l-1 >= l_ptr->start_pos && p+l-1 <= l_ptr->end_pos )
|
|
e4severe( e4result, E4_RESULT_LCO ) ;
|
|
}
|
|
}
|
|
return 0 ;
|
|
}
|
|
|
|
void S4FUNCTION l4lock_remove( int h, long p, long l )
|
|
{
|
|
L4LOCK_INFO *l_ptr ;
|
|
|
|
#ifndef S4WINDOWS
|
|
printf( "\nUnlock Handle %d Start Pos %ld Length %ld", h, p, l ) ;
|
|
#endif
|
|
|
|
l_ptr = l4lock_find( h,p,l ) ;
|
|
if ( l_ptr == 0 )
|
|
e4severe( e4result, E4_RESULT_REM ) ;
|
|
|
|
l4remove( &lock_list, l_ptr ) ;
|
|
}
|
|
|
|
void S4FUNCTION l4lock_save( int h, long p, long l )
|
|
{
|
|
L4LOCK_INFO *l_ptr ;
|
|
|
|
#ifndef S4WINDOWS
|
|
printf( "\nLock Handle %d Start Pos %ld Length %ld", h, p, l ) ;
|
|
#endif
|
|
|
|
if ( l4lock_find(h,p,l) != 0 )
|
|
e4severe( e4result, E4_RESULT_LCO ) ;
|
|
|
|
l_ptr = (L4LOCK_INFO *) mem4alloc( lock_alloc ) ;
|
|
if ( l_ptr == 0 )
|
|
e4severe( e4memory, E4_MEMORY_SAV ) ;
|
|
l4add( &lock_list, l_ptr ) ;
|
|
|
|
l_ptr->hand = h ;
|
|
l_ptr->start_pos = p ;
|
|
l_ptr->len = l ;
|
|
l_ptr->end_pos = p+l-1 ;
|
|
}
|
|
|
|
#endif
|