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
 |