Bug #4564
closedmingw-w64, truncate, ftruncate and ftello -- properly evalute it's existence
Description
=begin
Hello,
I'm using latest mingw-w64 builds that target in a experimental way GCC 4.7.0 codebase (gcc trunk)
mingw-w64 also combines improved CRT and headers support, which in this case included truncate, ftruncate and ftello support.
Ruby's trunk for win32 currently redefines those blindly, and even forces these functions presence to be used.
The attached patch proposes rely on configure's ability to detect these functions presence, conditionally define the missing functions and rename these functions to avoid redefinitions.
Assigning to Mr. Nobuyoshi Nakada and Mr. Usaku Nakamura for review and approval.
I've tested this against GCC 3.4.5, 4.5.1, 4.5.2 and 4.7.0, all on Windows. These patches should not affect any Linux version, however could affect Visual Studio builds.
Thank you for your time looking into this.
=end
Files
Updated by usa (Usaku NAKAMURA) over 13 years ago
- Status changed from Open to Assigned
=begin
It seems good.
Check in, please.
=end
Updated by luislavena (Luis Lavena) over 13 years ago
- Status changed from Assigned to Closed
- Assignee changed from nobu (Nobuyoshi Nakada) to luislavena (Luis Lavena)
- % Done changed from 0 to 100
=begin
Thank you.
Committed in r31262
=end
Updated by nobu (Nobuyoshi Nakada) over 13 years ago
- Status changed from Closed to Open
- % Done changed from 100 to 0
=begin
Since ftruncate and truncate on mingw use int32_t and are useless at all, so this change causes failures to handle over 2GB files.
I'll revert this and succeeding changes or fix to use ftruncate64 instead.
=end
Updated by luislavena (Luis Lavena) over 13 years ago
=begin
Thank you Nobu,
Dunno how I missed this detail.
Please revert this until I provide a proper patch that consistently uses ftruncate64.
=end
Updated by nobu (Nobuyoshi Nakada) over 13 years ago
=begin
Try:
open("a.data", "w") {|f| f.truncate(1<<32)}
Currently this makes an empty file, while a 4GB file previously.
I consider this is a degrade.
=end
Updated by nobu (Nobuyoshi Nakada) over 13 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r31351.
Luis, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- include/ruby/win32.h (ftruncate, truncate, ftello, fseeko): non-64
versions on mingw are useless because they use int32_t. fixes #4564
=end
Updated by luislavena (Luis Lavena) over 13 years ago
Thank you Nobu,
Thing is that current 1.9.2 with MinGW do not work as you mentioned:
C:\Users\Luis>ruby -ve "File.open('a.data', 'w') { |f| f.truncate(1 << 32) }"
ruby 1.9.2p180 (2011-02-18) [i386-mingw32]
C:\Users\Luis>dir a.data
Directory of C:\Users\Luis
22/05/2011 01:36 p.m. 0 a.data
But works on trunk:
C:\Users\Luis>ruby -ve "File.open('a.data', 'w') { |f| f.truncate(1 << 32) }"
ruby 1.9.3dev (2011-05-23 trunk 31696) [i386-mingw32]
C:\Users\Luis>dir a.data
Directory of C:\Users\Luis
22/05/2011 01:37 p.m. 4.294.967.296 a.data
Updated by nobu (Nobuyoshi Nakada) over 13 years ago
- ruby -v changed from ruby 1.9.3dev (2011-04-10 trunk 31255) [i386-mingw32] to -
Hi,
At Mon, 23 May 2011 02:38:25 +0900,
Luis Lavena wrote in [ruby-core:36391]:
Thing is that current 1.9.2 with MinGW do not work as you mentioned:
C:\Users\Luis>ruby -ve "File.open('a.data', 'w') { |f| f.truncate(1 << 32) }" ruby 1.9.2p180 (2011-02-18) [i386-mingw32] C:\Users\Luis>dir a.data Directory of C:\Users\Luis 22/05/2011 01:36 p.m. 0 a.data
Thanks.
Then it should be a bug in 1.9.2. Mswin32 version works as expected at least.
--
Nobu Nakada