|  | @@ -1,4 +1,4 @@
 | 
	
		
			
				|  |  | -/* $Id: share.c,v 1.6 2002/07/11 15:27:33 dijkstra Exp $ */
 | 
	
		
			
				|  |  | +/* $Id: share.c,v 1.7 2002/08/29 05:38:39 dijkstra Exp $ */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /*
 | 
	
		
			
				|  |  |   * Copyright (c) 2001-2002 Willem Dijkstra
 | 
	
	
		
			
				|  | @@ -159,11 +159,15 @@ check_master()
 | 
	
		
			
				|  |  |  void 
 | 
	
		
			
				|  |  |  master_resetsem()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    union semun semarg;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    semarg.val = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      check_sem();
 | 
	
		
			
				|  |  |      check_master();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if ((semctl(semid, SEM_WAIT, SETVAL, 0) != 0) ||
 | 
	
		
			
				|  |  | -	(semctl(semid, SEM_READ, SETVAL, 0) != 0))
 | 
	
		
			
				|  |  | +    if ((semctl(semid, SEM_WAIT, SETVAL, semarg) != 0) ||
 | 
	
		
			
				|  |  | +	(semctl(semid, SEM_READ, SETVAL, semarg) != 0))
 | 
	
		
			
				|  |  |  	fatal("%s:%d: Internal error: Cannot reset semaphores",
 | 
	
		
			
				|  |  |  	      __FILE__, __LINE__);
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -172,12 +176,14 @@ void
 | 
	
		
			
				|  |  |  master_forbidread()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      int clientsread;
 | 
	
		
			
				|  |  | +    union semun semarg;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      check_sem();
 | 
	
		
			
				|  |  |      check_master();
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      /* prepare for a new read */
 | 
	
		
			
				|  |  | -    if ((clientsread = semctl(semid, SEM_READ, GETVAL, 0)) < 0)
 | 
	
		
			
				|  |  | +    semarg.val = 0;
 | 
	
		
			
				|  |  | +    if ((clientsread = semctl(semid, SEM_READ, GETVAL, semarg)) < 0)
 | 
	
		
			
				|  |  |  	fatal("%s:%d: Internal error: Cannot read semaphore",
 | 
	
		
			
				|  |  |  	      __FILE__, __LINE__);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -193,9 +199,13 @@ master_forbidread()
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  master_permitread()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    union semun semarg;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      shm->seqnr++;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (semctl(semid, SEM_WAIT, SETVAL, realclients) != 0)
 | 
	
		
			
				|  |  | +    semarg.val = realclients;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (semctl(semid, SEM_WAIT, SETVAL, semarg) != 0)
 | 
	
		
			
				|  |  |  	fatal("%s:%d: Internal error: Cannot reset semaphores",
 | 
	
		
			
				|  |  |  	      __FILE__, __LINE__);
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -327,6 +337,8 @@ reap_clients()
 | 
	
		
			
				|  |  |  void 
 | 
	
		
			
				|  |  |  exitmaster() 
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    union semun semarg;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      if (master == 0)
 | 
	
		
			
				|  |  |  	return;
 | 
	
		
			
				|  |  |  	
 | 
	
	
		
			
				|  | @@ -352,7 +364,8 @@ exitmaster()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      switch (semstat) {
 | 
	
		
			
				|  |  |      case SIPC_KEYED:
 | 
	
		
			
				|  |  | -	if (semctl(semid, 0, IPC_RMID, 0) != 0) 
 | 
	
		
			
				|  |  | +	semarg.val = 0;
 | 
	
		
			
				|  |  | +	if (semctl(semid, 0, IPC_RMID, semarg) != 0) 
 | 
	
		
			
				|  |  |  	    warning("%s:%d: Internal error: could not remove semaphore %d",
 | 
	
		
			
				|  |  |  		    __FILE__, __LINE__, semid);
 | 
	
		
			
				|  |  |  	/* no break */
 |