* winsup/cygwin/include/cygwin/version.h: Bump API minor version.
* winsup/cygwin/include/cygwin/types.h: Define key_t as long long. * winsup/cygwin/cygwin.din: Add ftok, _ftok. * winsup/cygwin/ipc.cc (ftok): Rework implementation.
This commit is contained in:
		| @@ -1,3 +1,10 @@ | |||||||
|  | 2003-05-20  Charles Wilson  <cygwin@cwilson.fastmail.fm> | ||||||
|  |  | ||||||
|  | 	* winsup/cygwin/include/cygwin/version.h: Bump API minor version. | ||||||
|  | 	* winsup/cygwin/include/cygwin/types.h: Define key_t as long long. | ||||||
|  | 	* winsup/cygwin/cygwin.din: Add ftok, _ftok. | ||||||
|  | 	* winsup/cygwin/ipc.cc (ftok): Rework implementation. | ||||||
|  |  | ||||||
| 2003-05-18  Joe Buehler  <jhpb@hekimian.com> | 2003-05-18  Joe Buehler  <jhpb@hekimian.com> | ||||||
|  |  | ||||||
| 	* spawn.cc (spawn_guts): Show more of command line in strace output. | 	* spawn.cc (spawn_guts): Show more of command line in strace output. | ||||||
|   | |||||||
| @@ -508,6 +508,8 @@ _ftello = ftello | |||||||
| _ftello64 = ftello64 | _ftello64 = ftello64 | ||||||
| ftime | ftime | ||||||
| _ftime = ftime | _ftime = ftime | ||||||
|  | ftok | ||||||
|  | _ftok = ftok | ||||||
| ftruncate | ftruncate | ||||||
| _ftruncate = ftruncate | _ftruncate = ftruncate | ||||||
| _ftruncate64 = ftruncate64 | _ftruncate64 = ftruncate64 | ||||||
|   | |||||||
| @@ -101,7 +101,7 @@ typedef __ino32_t ino_t; | |||||||
|  |  | ||||||
| #ifndef __key_t_defined | #ifndef __key_t_defined | ||||||
| #define __key_t_defined | #define __key_t_defined | ||||||
| typedef long key_t; | typedef long long key_t; | ||||||
| #endif /* __key_t_defined */ | #endif /* __key_t_defined */ | ||||||
|  |  | ||||||
| #ifndef __BIT_TYPES_DEFINED | #ifndef __BIT_TYPES_DEFINED | ||||||
|   | |||||||
| @@ -205,12 +205,13 @@ details. */ | |||||||
|            underscore.  No problems with backward compatibility since no |            underscore.  No problems with backward compatibility since no | ||||||
|            official release has been made so far.  This change removes |            official release has been made so far.  This change removes | ||||||
|            exported symbols like fopen64, which might confuse configure. |            exported symbols like fopen64, which might confuse configure. | ||||||
|  |        86: Export ftok | ||||||
|      */ |      */ | ||||||
|  |  | ||||||
|      /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ |      /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ | ||||||
|  |  | ||||||
| #define CYGWIN_VERSION_API_MAJOR 0 | #define CYGWIN_VERSION_API_MAJOR 0 | ||||||
| #define CYGWIN_VERSION_API_MINOR 85 | #define CYGWIN_VERSION_API_MINOR 86 | ||||||
|  |  | ||||||
|      /* There is also a compatibity version number associated with the |      /* There is also a compatibity version number associated with the | ||||||
| 	shared memory regions.  It is incremented when incompatible | 	shared memory regions.  It is incremented when incompatible | ||||||
|   | |||||||
| @@ -1,8 +1,9 @@ | |||||||
| /* ipc.cc: Single unix specification IPC interface for Cygwin | /* ipc.cc: Single unix specification IPC interface for Cygwin | ||||||
|  |  | ||||||
|    Copyright 2001, 2002 Red Hat, Inc. |    Copyright 2001, 2002, 2003 Red Hat, Inc. | ||||||
|  |  | ||||||
|    Originally written by Robert Collins <robert.collins@hotmail.com> |    Originally written by Robert Collins <robert.collins@hotmail.com> | ||||||
|  |    Updated to 64 bit key_t by Charles Wilson <cygwin@cwilson.fastmail.fm> | ||||||
|  |  | ||||||
|    This file is part of Cygwin. |    This file is part of Cygwin. | ||||||
|  |  | ||||||
| @@ -14,26 +15,78 @@ | |||||||
| #include <cygwin/ipc.h> | #include <cygwin/ipc.h> | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
|  |  | ||||||
| extern "C" |  | ||||||
| { |  | ||||||
|  |  | ||||||
| /* Notes: we return a valid key even if id's low order 8 bits are 0. */ | /* Notes: we return a valid key even if id's low order 8 bits are 0. */ | ||||||
| key_t | extern "C" key_t | ||||||
| ftok (const char *path, int id) | ftok (const char *path, int id) | ||||||
| { | { | ||||||
|   struct __stat64 statbuf; |   struct __stat64 statbuf; | ||||||
|  |   key_t tmp; | ||||||
|   if (stat64 (path, &statbuf)) |   if (stat64 (path, &statbuf)) | ||||||
|     { |     { | ||||||
|       /* stat set the appropriate errno for us */ |       /* stat set the appropriate errno for us */ | ||||||
|       return (key_t) -1; |       return (key_t) -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   /* dev_t is short for cygwin |   /* Since __CYGWIN_USE_BIG_TYPES__, | ||||||
|    * ino_t is long for cygwin |      dev_t is 32bits for cygwin | ||||||
|    * and we need 8 bits for the id. |      ino_t is 64bits for cygwin | ||||||
|    * thus key_t is long long. |      and we need 8 bits for the id. | ||||||
|    */ |      thus key_t needs 104 bits total -- but we only have 64 (long long) | ||||||
|   return ((long long) statbuf.st_dev << (5*8)) | (statbuf.st_ino << (8) ) | (id & 0x00ff); |      We will have to alias; leaving open the possibility that the same | ||||||
| } |      key will be returned for multiple files.  This possibility exists | ||||||
|  |      also on Linux; the question is, how to minimize this possibility. | ||||||
|      |      | ||||||
|  |      How to solve?  Well, based on C. Vinschen's research, the nFileIndex* | ||||||
|  |      words vary as follows, on a partition with > 110,000 files | ||||||
|  |      nFileIndexHigh:    564 values between 0x00010000 -- 0xffff0000 | ||||||
|  |      nFileIndexLow : 103812 values between 0x00000000 -- 0x0003ffff | ||||||
|  |      R. Collins suggests that these may represent a tree path,  | ||||||
|  |      and that it would require ~2.9M files to force the tree depth | ||||||
|  |      to increase and reveal more bit usage. | ||||||
|  |      | ||||||
|  |      Implementation details: dev_t is 32bits, but is formed by | ||||||
|  |         device(32bits) << 16 | unit(32bits) | ||||||
|  |      But device is ACTUALLY == status & FH_DEVMASK, where FH_DEVMASK | ||||||
|  |      is 0x00000fff --> 12 bits | ||||||
|  |      | ||||||
|  |      As it happens, the maximum number of devices is actually  | ||||||
|  |      FH_NDEV, not FH_DEVMASK, where FH_NDEV is currently 0x0000001d. | ||||||
|  |      However, FH_NDEV grows as new device types are added.  So | ||||||
|  |      currently the device number needs 5 bits, but later?  Let's | ||||||
|  |      take a cue from Linux, and use the lower 8 bits (instead of the | ||||||
|  |      lower 12 or 16) for the device (major?) number. | ||||||
|  |      | ||||||
|  |      Similarly, while 'units' is an int (32bits), it is unclear | ||||||
|  |      how many of these are significant. For most devices, it seems that | ||||||
|  |      'units' is equivalent to 'minor'.  For FH_TAPE, it's obvious that | ||||||
|  |      only 8 bits are important.  However, for FH_SOCKET...it might be | ||||||
|  |      as high as 16 significant bits. | ||||||
|  |      | ||||||
|  |      Let's assume that we only need 8 bits from device (major) and | ||||||
|  |      only 8 bits from unit (minor). (On linux, only 8 bits of minor | ||||||
|  |      are used, and none from major). | ||||||
|  |      ---> so, we only need 0x00ff00ff (16 bits) of dev_t | ||||||
|  |      | ||||||
|  |      ---> we MUST have all 8 bits of id. | ||||||
|  |      | ||||||
|  |      ---> So, we only have 64 - 8 - 16 = 40 bits for ino_t.  But, we | ||||||
|  |      need 0xffff0000 for nFileIndexHigh and 0x0003ffff for nFileIndexLow | ||||||
|  |      minimum, or 16 + 18 = 34 bits.  Lucky us - we have 6 more bits | ||||||
|  |      to distribute. | ||||||
|  |      | ||||||
|  |      For lack of a better idea, we'll allocate 2 of the extra bits to | ||||||
|  |      nFileIndexHigh and 4 to nFileIndexLow.  */ | ||||||
|  |  | ||||||
|  |   /* get 8 bits from dev_t (major), put into 0xff00000000000000L */ | ||||||
|  |   tmp  = (((key_t) statbuf.st_dev) & 0x0000000000ff0000LL) << 40; | ||||||
|  |   /* get 8 bits from dev_t (minor), put into 0x00ff000000000000L */ | ||||||
|  |   tmp |= (((key_t) statbuf.st_dev) & 0x00000000000000ffLL) << 48; | ||||||
|  |   /* get upper 16+2 bits from nFileInfoHigh, put into 0x0000ffffc0000000L | ||||||
|  |      shift down first, then mask, to avoid sign extension on rightshift  */ | ||||||
|  |   tmp |= (((key_t) statbuf.st_ino) & 0xffffc00000000000LL) >> 16; | ||||||
|  |   /* get lower 18+4 bits from nFileInfoLow, put into  0x000000003fffff00L  */ | ||||||
|  |   tmp |= (((key_t) statbuf.st_ino) & 0x00000000003fffffLL) << 8; | ||||||
|  |   /* use all 8 bits of id, and put into 0x00000000000000ffL */ | ||||||
|  |   tmp |= (id & 0x00ff); | ||||||
|  |   return tmp; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user