Win32 port

Havoc Pennington hp at redhat.com
Tue Jun 27 20:41:55 PDT 2006


Hi,

Peter Kümmel wrote:
> 
> Seems Tor already has implemented a memory management:
> the strings are cached, and freed at shutdown.
> So we could your approach 2. "true value objects", or is
> it more the 3. way?

With the hash table, 2 is possible; I think 1 or 3 would be slightly 
better but I'd be OK with a patch for 2. I would like to avoid the 
#ifdef's in the header file, though ... the type should be opaque, 
whether it's a pointer or an integer.

If you do 2, I guess the simplest option could be just leaving the 
dbus_uid_t as an integer, and have uid_to_sid and sid_to_uid functions 
using the hash table.

Or perhaps to go more cross platform, you could have a "uid to string" 
and "uid from string" function ? where the string would be an "external 
form" and the integer is not allowed to leave the dbus process, on 
either platform.

> I'm not 100% sure how I should proceed. I've here a
> 200k diff against HEAD and some new files.

I would do things as follows:
  - check out a clean source tree
  - one at a time in logical units, merge parts of the patches into the 
clean tree, post for discussion, and get them checked in. If you use the 
  clean opaque data types approach, it should be possible to commit 
patches one at a time without breaking anything
  - you may need to first merge the build-related stuff if any so you 
can compile a nonworking source tree on Windows

If you need to just "comment out" stuff on Windows at first that's OK:

#ifdef DBUS_WIN32_IN_PROGRESS
#endif

Then in config.h:
#ifdef _WIN32
#define DBUS_WIN32_IN_PROGRESS
#endif

I'd rather avoid using _WIN32 directly for temporary commenting out, so 
it's easy to find the temporary fixes later, no?

You might also check out multiple source trees and get a couple of 
patches "in flight" at once if you want.

In general I'm 100% OK with large changes and with committing things 
piecemeal (in logical units), but I consider it important to keep things 
maintainable and be sure the windows tree won't be accidentally broken 
all the time by unix developers. One good route to this is to be sure 
the headers (and semantics of internal/external APIs) are as identical 
as possible on all platforms.

I'd want any changes to the core code to be pretty clean and in 
consistent style with the rest of the source tree.

The windows-only files I'm not as picky about.

Windows-specific features are just fine too, they are better than hacks; 
if we can't build a good cross-platform abstraction just be sure 
"windows" or "win32" is in the name of the API. Or e.g. we could have 
config file options that are Windows-specific.

For example, I'd rather have config file support for a native windows 
logical IPC method, instead of overloading the UNIX socket stuff on 
Windows when it doesn't make any sense.

> Should I just post the patches related to the changes to
> the original types?
> 
> Does it help when I post the diff and new files?

I find it helpful if you post the whole logically-related change, at 
least the first time you post a particular patch. If you post multiple 
versions of a patch just the "interesting part" can go in later posts.

>> void
>> _dbus_uid_init_unix(DBusUID *uid, unsigned long value)
>> {
>>   DBusUIDReal *real = (DBusUIDReal*) uid;
>>   _dbus_assert(sizeof(DBusUIDReal) <= sizeof(DBusUID));
>>   real->uid.unix = value;
>> }
>>
>> That would involve relatively few changes to code, though I'd still
>> rather pass it in to functions as "DBusUID *uid" and not "DBusUID uid"
>> to match the usual pattern.
> 
> I don't see the advantage of this approach, because we have to change
> much code to introduce DBusUID so it does not care how we change it.
> We could also pass pointers using my approach.
> 
> And isn't it better to have a static type checking instead of the
> dynamic sizeof check?

I think doing it the same way as the rest of the codebase is probably a 
good enough reason, whether the rest of the codebase is absolutely the 
best way or not... makes it a lot easier to learn a codebase if it has 
consistent conventions.

Approaches 1 and 3 are always cleaner than 2, but if you look at 
DBusMessageIter, DBusString, etc. dbus does at least have a consistent 
approach to 2.

You could also just go with the "keep the uid as integer on all 
platforms" approach which is probably fine.

>> btw, what about guid_t? What's up with that on Windows, should it get a
>> parallel/identical treatment?
>>
> 
> I first wanna see what happens when DBusUID is introduced and how the
> merge process will work.

OK, but we should be sure the changes are parallel - we don't want to do 
these two in two different ways.

Havoc



More information about the dbus mailing list