Date: Sat, 2 Jun 2001 16:21:37 -0700 (PDT) From: Matt Dillon <dillon@earth.backplane.com> To: "David O'Brien" <obrien@FreeBSD.ORG> Cc: Garance A Drosihn <drosih@rpi.edu>, David Wolfskill <david@catwhisker.org>, arch@FreeBSD.ORG, freebsd-standards@bostonradio.org Subject: Re: time_t definition is wrong Message-ID: <200106022321.f52NLbu05712@earth.backplane.com> References: <200106012318.f51NI8w38590@bunrab.catwhisker.org> <200106020823.f528N5O98998@earth.backplane.com> <20010602085237.A73968@dragon.nuxi.com> <200106021739.f52Hd9V03943@earth.backplane.com> <p05100e0fb73ee9d458f7@[128.113.24.47]> <20010602124907.G31257@dragon.nuxi.com> <200106022005.f52K5FR04823@earth.backplane.com> <20010602131404.M31257@dragon.nuxi.com> <200106022040.f52KeSJ05088@earth.backplane.com> <20010602142011.N31257@dragon.nuxi.com>
next in thread | previous in thread | raw e-mail | index | archive | help
: :On Sat, Jun 02, 2001 at 01:40:28PM -0700, Matt Dillon wrote: :> You have not justifed to any reasonable degree why you believe changing :> time_t from a long to an int should be done. You have not argued a : : :time_t needs to be consistent across all FreeBSD platforms. :Otherwise we get in consistent behavior across our platforms. :This includes both the size of it, and the spelling of the printf() :format specifier. I had to go through this rigamorale getting Diablo to work on 32 and 64 bit platforms. long is the only way to get consistent behavior across platforms and across operating systems. By making the native type for time_t be 'long' we virtually guarentee that porting problems between FreeBSD and other OS's and platforms will be minimized. But making it an 'int' virtually guarentees the reverse... now people who write code under FreeBSD may mistakenly assume that time_t can be treated as an int when, in fact, it can't, and the result will be mysterious failures and porting headaches when those people try to compile their programs on other platforms. Porting issues exist no matter how time_t is typedef'd, but they are a whole lot worse with int verses long. Your assumption that turning time_t into an int somehow makes it more consistent and better all around is severely flawed. And, for your information, NetBSD typedef's time_t as a long on IA32, not an int. It's still 32 bits on IA32 of course. But it's a long. So your changing FreeBSD's time_t to an int goes against other FreeBSD distribution's grains as well as against Linux and Solaris. NetBSD unfortunately decided to go with 32 bit time_t's on alpha and sparc64, but I don't think it is appropriate for us to follow in their footsteps there. All they are doing is creating a huge mess for themselves down the line, a mess that we can avoid if we look forward now. :.. :> If you didn't read them, then I recommend you go back to my postings and :> read them again. I will summarize: :> :> * Changing from long to int only makes the problems you site as :> fixing in your commit message worse. Not better. : :How is it worse?!?!? :You have yet to show me a compiler warning caused by this (I am sure :there are some to fix); nor a piece of code that is now broken. Think, damn it! You site people using printf("%ld", time_t) has being an improper use of time_t and that is your excuse for turning it into an int. With it int, now people can do printf("%d", time_t) without generating a warning, which is at least as flawed as using %ld and far more likely to occur considering how much more predominately 'int' is declared in source code verses 'long'. At least with it a long people know it has to be treated specially. GCC makes a (small) distinction between int and long on 32 bit platforms precisely to generate warnings that help people with porting issues. They had to back down a bit on the warnings, but there are a few still in the compiler (like format string warnings). :> * The two other platforms we have to maintain compatibility with :> the most: Solaris and Linux, use 'long'. NetBSD? OpenBSD? Not :> an issue for us. : :I *totally* disagree with your choice of who we need to maintain :compatibility with the most. In fact several commits are made to make us :more like NetBSD and OpenBSD. So freebsd-arch will need to decide who we :should most be like. In 15 years we are *completely* *fucked* if we go with 32 bit time_t's on 64 bit platforms. Completely and utterly fucked. We should fix this now while we still have the chance. I do not buy any effort to try to keep time_t the same physical size between platform ports. It is a totally inappropriate argument that will only get us into major trouble down the road on 64 bit platforms. We have enough problems already figuring out how to give 32 bit platforms 64 bit time functions without breaking upgrade compatibility for major subsystems like databases. We do not need to invite the same problems on our 64 bit platform portrs. So the argument that time_t should be made a 32 bit quantity on IA32 so it can be an 'int' on 64 bit FreeBSD ports is completely bogus. If you guys want to leave the Alpha port in a screwed up 32 bit time_t state, I can't do much about it. But I do not want it to bleed over into a decision to break IA32's use of long to try to maintain compatibility with the already broken Alpha port. :> In fact, NetBSD seems to be well on their way :> to having an alternate API judging by the kernel changes they've :> made. We do not want to follow that path. : :If they have, why don't we? off64_t ? lseek64? Do you want FreeBSD to go down the same path that SGI went down? It's been proven to be a huge fraggin mess and we absolutely do not want to follow in their footsteps. We were lucky with off_t being 64 bits... look what happened there? Do you see FreeBSD programmers using weird-looking lseek64() function calls? No. Do you honestly believe that FreeBSD coders will start using FreeBSD-only 64 bit time functions en-mass? It isn't going to happen. People will move away from our platform first and start calling it obsolete or weird. That's what happened to IRIX to a degree. :> * We have the ability to stay consistent between 32 and 64 bit :> platforms by defining time_t as 'long' on both, reducing portability :> headaches. : :How is it consistent? It is consistent *only* in spelling, not storage :size nor bit-wrapping characteristics. It is consistent in source code. 'long' may mean different things on different platforms, but when writing portable source you expect it to be 32 or 64 bits and the code can be written properly to be portable without all sorts of nasty #ifdef's. That is why 'long' is more consistent across platforms for time_t purposes. People have come to use long time_t's on 64 bit platforms to solve the 203x problem because it's a whole lot easier and more portable then changing the API. : :> This is what Solaris is doing. This is what Linux is :> doing. This maintains a defacto standard that has been around :> forever. We damn well ought to be doing it to. : :Should also also follow every other mistake Sun and Linux have made :because they are the "defacto" standard? I see enough "defacto" standard :things in the Linuxism I have to deal with daily. : :-- :-- David (obrien@FreeBSD.org) This is one case where Sun and Linux are doing exactly the right thing. Linux learned their lessons with off_t and didn't repeat them for time_t. Solaris also learned its lessons with off_t, though many years earlier. I'll bet they wish now that they had gone to 64 bit off_t's in the CSRG 4.4 timeframe rather then the mess they wound up with! This commit you've made uses reasoning that has proven to be a mistake many times over in past years on other platforms. It needs to be backed out. And I would also strongly recommend to the Alpha people that they fix their time_t to properly use a long now. Be that as it may, my concern right now is primarily that the commit made to i386 should be backed out. -Matt To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200106022321.f52NLbu05712>