85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
| /* cygserver_ipc.h
 | |
| 
 | |
|    Copyright 2002 Red Hat, Inc.
 | |
| 
 | |
|    Originally written by Conrad Scott <conrad.scott@dsl.pipex.com>
 | |
| 
 | |
| This file is part of Cygwin.
 | |
| 
 | |
| This software is a copyrighted work licensed under the terms of the
 | |
| Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | |
| details. */
 | |
| 
 | |
| #ifndef __CYGSERVER_IPC_H__
 | |
| #define __CYGSERVER_IPC_H__
 | |
| 
 | |
| #include <assert.h>
 | |
| #include <limits.h>		/* For OPEN_MAX. */
 | |
| 
 | |
| /*
 | |
|  * The sysv ipc id's (msgid, semid, shmid) are integers arranged such
 | |
|  * that they no subsystem will generate the same id as some other
 | |
|  * subsystem; nor do these ids overlap file descriptors (the other
 | |
|  * common integer ids).  Since Cygwin can allocate more than OPEN_MAX
 | |
|  * file descriptors, it can't be guaranteed not to overlap, but it
 | |
|  * should help catch some errors.
 | |
|  *
 | |
|  * msgid's: OPEN_MAX,     OPEN_MAX + 3, OPEN_MAX + 6, . . .
 | |
|  * semid's: OPEN_MAX + 1, OPEN_MAX + 4, OPEN_MAX + 7, . . .
 | |
|  * shmid's: OPEN_MAX + 2, OPEN_MAX + 5, OPEN_MAX + 8, . . .
 | |
|  *
 | |
|  * To further ensure that ids are unique, if ipc objects are created
 | |
|  * and destroyed and then re-created, they are given new ids by
 | |
|  * munging the basic id (as above) with a sequence number.
 | |
|  *
 | |
|  * Internal ipc id's, which are 0, 1, ... within each subsystem (and
 | |
|  * not munged with a sequence number), are used solely by the ipcs(8)
 | |
|  * interface.
 | |
|  */
 | |
| 
 | |
| enum ipc_subsys_t
 | |
|   {
 | |
|     IPC_MSGOP = 0,
 | |
|     IPC_SEMOP = 1,
 | |
|     IPC_SHMOP = 2,
 | |
|     IPC_SUBSYS_COUNT
 | |
|   };
 | |
| 
 | |
| /*
 | |
|  * IPCMNI - The absolute maximum number of simultaneous ipc ids for
 | |
|  * any one subsystem.
 | |
|  */
 | |
| 
 | |
| enum
 | |
|   {
 | |
|     IPCMNI = 0x10000		// Must be a power of two.
 | |
|   };
 | |
| 
 | |
| inline int
 | |
| ipc_int2ext (const int intid, const ipc_subsys_t subsys, long & sequence)
 | |
| {
 | |
|   assert (0 <= intid && intid < IPCMNI);
 | |
| 
 | |
|   const long tmp = InterlockedIncrement (&sequence);
 | |
| 
 | |
|   return (((tmp & 0x7fff) << 16)
 | |
| 	  | (OPEN_MAX + (intid * IPC_SUBSYS_COUNT) + subsys));
 | |
| }
 | |
| 
 | |
| inline int
 | |
| ipc_ext2int_subsys (const int extid)
 | |
| {
 | |
|   return ((extid & (IPCMNI - 1)) - OPEN_MAX) % IPC_SUBSYS_COUNT;
 | |
| }
 | |
| 
 | |
| inline int
 | |
| ipc_ext2int (const int extid, const ipc_subsys_t subsys)
 | |
| {
 | |
|   if (ipc_ext2int_subsys (extid) != subsys)
 | |
|     return -1;
 | |
|   else
 | |
|     return ((extid & (IPCMNI - 1)) - OPEN_MAX) / IPC_SUBSYS_COUNT;
 | |
| }
 | |
| 
 | |
| #endif /* __CYGSERVER_IPC_H__ */
 |