4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-18 12:29:32 +08:00

* 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:
Corinna Vinschen 2003-05-20 12:38:04 +00:00
parent 70ffc14893
commit 10bada05fa
5 changed files with 78 additions and 15 deletions

View File

@ -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>
* spawn.cc (spawn_guts): Show more of command line in strace output.

View File

@ -508,6 +508,8 @@ _ftello = ftello
_ftello64 = ftello64
ftime
_ftime = ftime
ftok
_ftok = ftok
ftruncate
_ftruncate = ftruncate
_ftruncate64 = ftruncate64

View File

@ -101,7 +101,7 @@ typedef __ino32_t ino_t;
#ifndef __key_t_defined
#define __key_t_defined
typedef long key_t;
typedef long long key_t;
#endif /* __key_t_defined */
#ifndef __BIT_TYPES_DEFINED

View File

@ -205,12 +205,13 @@ details. */
underscore. No problems with backward compatibility since no
official release has been made so far. This change removes
exported symbols like fopen64, which might confuse configure.
86: Export ftok
*/
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#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
shared memory regions. It is incremented when incompatible

View File

@ -1,8 +1,9 @@
/* 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>
Updated to 64 bit key_t by Charles Wilson <cygwin@cwilson.fastmail.fm>
This file is part of Cygwin.
@ -14,26 +15,78 @@
#include <cygwin/ipc.h>
#include <sys/stat.h>
extern "C"
{
/* 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)
{
struct __stat64 statbuf;
key_t tmp;
if (stat64 (path, &statbuf))
{
/* stat set the appropriate errno for us */
return (key_t) -1;
}
/* dev_t is short for cygwin
* ino_t is long for cygwin
* and we need 8 bits for the id.
* thus key_t is long long.
*/
return ((long long) statbuf.st_dev << (5*8)) | (statbuf.st_ino << (8) ) | (id & 0x00ff);
}
/* Since __CYGWIN_USE_BIG_TYPES__,
dev_t is 32bits for cygwin
ino_t is 64bits for cygwin
and we need 8 bits for the id.
thus key_t needs 104 bits total -- but we only have 64 (long long)
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;
}