campo-sirio/cb5/l4lock_c.c
alex a0f5e0898b This commit was generated by cvs2svn to compensate for changes in r975,
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
1995-02-06 15:33:45 +00:00

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