From: Steven Lumos Date: 2006-01-06T10:16:20+09:00 Subject: 64-bit Solaris READ_DATA_PENDING Revisited I have to start off with an apology. Over a year ago, I submitted a READ_DATA_PENDING patch to use __fpending() [ruby-core:3766]. I then failed to notice the discussion starting at [ruby-core:3785], and even failed to notice later that my patch had been backed out. Guy Decoux was completely correct: __fpending() only works for output streams! So, sorry to anyone whose time was wasted either by my broken patch or by the fact that I didn't follow up and come up with a correct version sooner (i.e. anyone who tried to compile 64-bit on Solaris in the last year). I'm only figuring this out now due to [ruby-talk:153006]. Here's something that actually works (for me): --- io.c.orig 2006-01-05 16:12:19.634441000 -0800 +++ io.c 2006-01-05 11:15:50.907474000 -0800 @@ -156,6 +156,19 @@ # define READ_DATA_PENDING_COUNT(fp) ((unsigned int)(*(fp))->_cnt) # define READ_DATA_PENDING(fp) (((unsigned int)(*(fp))->_cnt) > 0) # define READ_DATA_BUFFERED(fp) 0 +#elif defined(__sparc) && defined(_LP64) && defined(__SVR4) +typedef struct _FILE64 { + unsigned char *_ptr; /* next character from/to here in buffer */ + unsigned char *_base; /* the buffer */ + unsigned char *_end; /* the end of the buffer */ + ssize_t _cnt; /* number of available characters in buffer */ + int _file; /* UNIX System file descriptor */ + unsigned int _flag; /* the state of the stream */ + char __fill[80]; /* filler to bring size to 128 bytes */ +} FILE64; +# define READ_DATA_PENDING(fp) (((FILE64*)(fp))->_cnt > 0) +# define READ_DATA_PENDING_COUNT(fp) (((FILE64*)(fp))->_cnt) +# define READ_DATA_PENDING_PTR(fp) ((char *)((FILE64*)(fp))->_ptr) #else /* requires systems own version of the ReadDataPending() */ extern int ReadDataPending(); It's not very nice, but Solaris doesn't provide anything like __fpending() for reads. Thankfully, they do now provide the Solaris source, so we can get the struct from the internal header[1]. Without this patch, DRb tests hang forever, and many other tests fail. With it: % gmake check test succeeded [...] 1224 tests, 13482 assertions, 0 failures, 0 errors (Yay!) I get the same result using Sun C 5.6 2004/07/15 with -xtarget=ultrasparc3cu -xarch=v9a and GCC 3.4.3 with -mcpu=ultrasparc3 -m64. This is Solaris 8/SPARC. I also checked just READ_DATA_PENDING_COUNT against the regular FILE_COUNT version for the 32-bit case using a simple C program. Hopefully, this or something like it can find its way in. In the meantime, please test this if you have access to Solaris! Steve [1] http://cvs.opensolaris.org/source/xref/on/usr/src/lib/libc/inc/file64.h