Use non-deprecated APIs for dynloader/darwin.c

Started by Chris Campbellover 19 years ago8 messages
#1Chris Campbell
chris@bignerdranch.com
1 attachment(s)

Re: Darwin stuff is getting deprecated

http://archives.postgresql.org/pgsql-hackers/2006-09/msg02238.php

Mac OS X has included dlopen() and friends etc since Mac OS X 10.3.
From the dlopen(3) man page:

Mac OS X 10.3 incorporated the dlcompat package written by
Jorge Acereda
<jacereda@users.sourceforge.net> and Peter O'Gorman <ogor-
man@users.sourceforge.net>.

In Mac OS X 10.4, dlopen was rewritten to be a native part of
dyld.

The attached patch switches to using those APIs in src/backend/port/
dynloader/darwin.c (and passes "make check").

(1) This change requires Mac OS X 10.3 and later. Do we currently
support PostgreSQL on older versions of Mac OS X?

(2) The pg_* functions are such trivial wrappers for the OS's APIs --
should they be turned into macros in dynloader/darwin.h and we can
just delete the .c file?

(3) If we need to continue supporting Mac OS X 10.2 and earlier, I
guess we'll need to add a configure test for the presence of dlopen
()? Is that a check that should only be run on Darwin, or all platforms?

Thanks!

- Chris

Attachments:

dynloader.patchapplication/octet-stream; name=dynloader.patch; x-unix-mode=0644Download
*** ./src/backend/port/dynloader/darwin.c.orig	Sat Oct  7 20:44:23 2006
--- ./src/backend/port/dynloader/darwin.c	Sat Oct  7 20:48:40 2006
***************
*** 7,94 ****
   */
  #include "postgres.h"
  
! #include <mach-o/dyld.h>
  
  #include "dynloader.h"
  
  
- static NSObjectFileImageReturnCode cofiff_result = NSObjectFileImageFailure;
- 
- 
  void *
  pg_dlopen(char *filename)
  {
! 	NSObjectFileImage image;
! 
! 	cofiff_result = NSCreateObjectFileImageFromFile(filename, &image);
! 	if (cofiff_result != NSObjectFileImageSuccess)
! 		return NULL;
! 	return NSLinkModule(image, filename,
! 						NSLINKMODULE_OPTION_BINDNOW |
! 						NSLINKMODULE_OPTION_RETURN_ON_ERROR);
  }
  
  void
  pg_dlclose(void *handle)
  {
! 	NSUnLinkModule(handle, FALSE);
  }
  
  PGFunction
  pg_dlsym(void *handle, char *funcname)
  {
! 	NSSymbol	symbol;
! 	char	   *symname = (char *) malloc(strlen(funcname) + 2);
! 
! 	sprintf(symname, "_%s", funcname);
! 	if (NSIsSymbolNameDefined(symname))
! 	{
! 		symbol = NSLookupAndBindSymbol(symname);
! 		free(symname);
! 		return (PGFunction) NSAddressOfSymbol(symbol);
! 	}
! 	else
! 	{
! 		free(symname);
! 		return NULL;
! 	}
  }
  
  char *
  pg_dlerror(void)
  {
! 	NSLinkEditErrors c;
! 	int			errorNumber;
! 	const char *fileName;
! 	const char *errorString = NULL;
! 
! 	switch (cofiff_result)
! 	{
! 		case NSObjectFileImageSuccess:
! 			/* must have failed in NSLinkModule */
! 			NSLinkEditError(&c, &errorNumber, &fileName, &errorString);
! 			if (errorString == NULL || *errorString == '\0')
! 				errorString = "unknown link-edit failure";
! 			break;
! 		case NSObjectFileImageFailure:
! 			errorString = "failed to open object file";
! 			break;
! 		case NSObjectFileImageInappropriateFile:
! 			errorString = "inappropriate object file";
! 			break;
! 		case NSObjectFileImageArch:
! 			errorString = "object file is for wrong architecture";
! 			break;
! 		case NSObjectFileImageFormat:
! 			errorString = "object file has wrong format";
! 			break;
! 		case NSObjectFileImageAccess:
! 			errorString = "insufficient permissions for object file";
! 			break;
! 		default:
! 			errorString = "unknown failure to open object file";
! 			break;
! 	}
! 
! 	return (char *) errorString;
  }
--- 7,40 ----
   */
  #include "postgres.h"
  
! #include <dlfcn.h>
  
  #include "dynloader.h"
  
  
  void *
  pg_dlopen(char *filename)
  {
! 	return dlopen(filename, RTLD_NOW | RTLD_GLOBAL);
  }
  
  void
  pg_dlclose(void *handle)
  {
! 	dlclose(handle);
  }
  
  PGFunction
  pg_dlsym(void *handle, char *funcname)
  {
! 	/*
! 	 * Do not prepend an underscore: see dlopen(3)
! 	 */
! 	return dlsym(handle, funcname);
  }
  
  char *
  pg_dlerror(void)
  {
! 	return dlerror();
  }
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Chris Campbell (#1)
Re: Use non-deprecated APIs for dynloader/darwin.c

Chris Campbell <chris@bignerdranch.com> writes:

Mac OS X has included dlopen() and friends etc since Mac OS X 10.3.
The attached patch switches to using those APIs in src/backend/port/
dynloader/darwin.c (and passes "make check").

Looks good, but I don't think we want to abandon OSX 10.2 support
just yet. I'll revise this to use a configure probe for dlopen.

My inclination is to apply this one now, since it only affects OSX
and should be easily testable, but to hold off on your other patch
for portable Bonjour support until 8.3 devel starts. The portability
implications of that one are unclear, and I don't know how to test it
either, so I think putting it in now is too much risk.

regards, tom lane

#3Chris Campbell
chris@bignerdranch.com
In reply to: Tom Lane (#2)
Re: [PATCHES] Use non-deprecated APIs for dynloader/darwin.c

On Oct 8, 2006, at 14:29, Tom Lane wrote:

Looks good, but I don't think we want to abandon OSX 10.2 support
just yet. I'll revise this to use a configure probe for dlopen.

Maybe we can abandon Mac OS X 10.2 in 8.3 and later? And not back-
port these patches to the 7.x, 8.0, and 8.1 branches?

BTW, I think the configure probe (only on Darwin, correct?) should
test for the existence of <dlfcn.h>.

My inclination is to apply this one now, since it only affects OSX
and should be easily testable, but to hold off on your other patch
for portable Bonjour support until 8.3 devel starts. The portability
implications of that one are unclear, and I don't know how to test it
either, so I think putting it in now is too much risk.

The Bonjour patch wasn't intended to be portable to other platforms
just yet. As submitted, it has the same risks/advantages as this
dlopen() patch -- it only works on 10.3 and later, but isn't
deprecated in 10.4.

If we want to keep 10.2 support for Bonjour, we can test for both
DNSServiceDiscovery.h and dns_sd.h in ./configure, and prefer
dns_sd.h if it's found (which will be the case for 10.3 and 10.4) but
use DNSServiceDiscovery.h if not (which will be the case for 10.2).

Thanks!

- Chris

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Chris Campbell (#3)
Re: [PATCHES] Use non-deprecated APIs for dynloader/darwin.c

Chris Campbell <chris@bignerdranch.com> writes:

On Oct 8, 2006, at 14:29, Tom Lane wrote:

Looks good, but I don't think we want to abandon OSX 10.2 support
just yet. I'll revise this to use a configure probe for dlopen.

Maybe we can abandon Mac OS X 10.2 in 8.3 and later? And not back-
port these patches to the 7.x, 8.0, and 8.1 branches?

I don't see any particular reason to abandon 10.2 at all, as long as
all it's costing us is a couple dozen lines in dynloader/darwin.c.
As for back-porting, I don't see a strong reason to do that either.
Apple will presumably maintain the compatibility APIs for a long
while yet.

BTW, I think the configure probe (only on Darwin, correct?) should
test for the existence of <dlfcn.h>.

I realized that configure is already probing for dlopen(), so I just
used HAVE_DLOPEN. We can add a separate test for the header file if
it proves really necessary, but I bet it's not.

regards, tom lane

#5Bruce Momjian
bruce@momjian.us
In reply to: Chris Campbell (#3)
Re: [PATCHES] Use non-deprecated APIs for dynloader/darwin.c

The Darwin dlopen() patch has already been applied. Where are we on the
Bonjour patch? Do we want code that works on Darwin 10.2 and 10.3?

---------------------------------------------------------------------------

Chris Campbell wrote:

On Oct 8, 2006, at 14:29, Tom Lane wrote:

Looks good, but I don't think we want to abandon OSX 10.2 support
just yet. I'll revise this to use a configure probe for dlopen.

Maybe we can abandon Mac OS X 10.2 in 8.3 and later? And not back-
port these patches to the 7.x, 8.0, and 8.1 branches?

BTW, I think the configure probe (only on Darwin, correct?) should
test for the existence of <dlfcn.h>.

My inclination is to apply this one now, since it only affects OSX
and should be easily testable, but to hold off on your other patch
for portable Bonjour support until 8.3 devel starts. The portability
implications of that one are unclear, and I don't know how to test it
either, so I think putting it in now is too much risk.

The Bonjour patch wasn't intended to be portable to other platforms
just yet. As submitted, it has the same risks/advantages as this
dlopen() patch -- it only works on 10.3 and later, but isn't
deprecated in 10.4.

If we want to keep 10.2 support for Bonjour, we can test for both
DNSServiceDiscovery.h and dns_sd.h in ./configure, and prefer
dns_sd.h if it's found (which will be the case for 10.3 and 10.4) but
use DNSServiceDiscovery.h if not (which will be the case for 10.2).

Thanks!

- Chris

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#6Bruce Momjian
bruce@momjian.us
In reply to: Chris Campbell (#3)
Bonjour patch

With no new version from the author and no working version for all
supported OS/X version, I am saving this patch for 8.4.

This has been saved for the 8.4 release:

http://momjian.postgresql.org/cgi-bin/pgpatches_hold

---------------------------------------------------------------------------

Chris Campbell wrote:

On Oct 8, 2006, at 14:29, Tom Lane wrote:

Looks good, but I don't think we want to abandon OSX 10.2 support
just yet. I'll revise this to use a configure probe for dlopen.

Maybe we can abandon Mac OS X 10.2 in 8.3 and later? And not back-
port these patches to the 7.x, 8.0, and 8.1 branches?

BTW, I think the configure probe (only on Darwin, correct?) should
test for the existence of <dlfcn.h>.

My inclination is to apply this one now, since it only affects OSX
and should be easily testable, but to hold off on your other patch
for portable Bonjour support until 8.3 devel starts. The portability
implications of that one are unclear, and I don't know how to test it
either, so I think putting it in now is too much risk.

The Bonjour patch wasn't intended to be portable to other platforms
just yet. As submitted, it has the same risks/advantages as this
dlopen() patch -- it only works on 10.3 and later, but isn't
deprecated in 10.4.

If we want to keep 10.2 support for Bonjour, we can test for both
DNSServiceDiscovery.h and dns_sd.h in ./configure, and prefer
dns_sd.h if it's found (which will be the case for 10.3 and 10.4) but
use DNSServiceDiscovery.h if not (which will be the case for 10.2).

Thanks!

- Chris

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#7Bruce Momjian
bruce@momjian.us
In reply to: Chris Campbell (#3)
Re: [PATCHES] Use non-deprecated APIs for dynloader/darwin.c

Ah, I already had this on the TODO list with URLs, so I will not put it
in the hold queue.

---------------------------------------------------------------------------

Chris Campbell wrote:

On Oct 8, 2006, at 14:29, Tom Lane wrote:

Looks good, but I don't think we want to abandon OSX 10.2 support
just yet. I'll revise this to use a configure probe for dlopen.

Maybe we can abandon Mac OS X 10.2 in 8.3 and later? And not back-
port these patches to the 7.x, 8.0, and 8.1 branches?

BTW, I think the configure probe (only on Darwin, correct?) should
test for the existence of <dlfcn.h>.

My inclination is to apply this one now, since it only affects OSX
and should be easily testable, but to hold off on your other patch
for portable Bonjour support until 8.3 devel starts. The portability
implications of that one are unclear, and I don't know how to test it
either, so I think putting it in now is too much risk.

The Bonjour patch wasn't intended to be portable to other platforms
just yet. As submitted, it has the same risks/advantages as this
dlopen() patch -- it only works on 10.3 and later, but isn't
deprecated in 10.4.

If we want to keep 10.2 support for Bonjour, we can test for both
DNSServiceDiscovery.h and dns_sd.h in ./configure, and prefer
dns_sd.h if it's found (which will be the case for 10.3 and 10.4) but
use DNSServiceDiscovery.h if not (which will be the case for 10.2).

Thanks!

- Chris

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#8Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#7)
Re: [PATCHES] Use non-deprecated APIs for dynloader/darwin.c

Actually, can we now say we only support OS/X 10.3 and later. If so, we
can use the patch unchanged.

---------------------------------------------------------------------------

Bruce Momjian wrote:

Ah, I already had this on the TODO list with URLs, so I will not put it
in the hold queue.

---------------------------------------------------------------------------

Chris Campbell wrote:

On Oct 8, 2006, at 14:29, Tom Lane wrote:

Looks good, but I don't think we want to abandon OSX 10.2 support
just yet. I'll revise this to use a configure probe for dlopen.

Maybe we can abandon Mac OS X 10.2 in 8.3 and later? And not back-
port these patches to the 7.x, 8.0, and 8.1 branches?

BTW, I think the configure probe (only on Darwin, correct?) should
test for the existence of <dlfcn.h>.

My inclination is to apply this one now, since it only affects OSX
and should be easily testable, but to hold off on your other patch
for portable Bonjour support until 8.3 devel starts. The portability
implications of that one are unclear, and I don't know how to test it
either, so I think putting it in now is too much risk.

The Bonjour patch wasn't intended to be portable to other platforms
just yet. As submitted, it has the same risks/advantages as this
dlopen() patch -- it only works on 10.3 and later, but isn't
deprecated in 10.4.

If we want to keep 10.2 support for Bonjour, we can test for both
DNSServiceDiscovery.h and dns_sd.h in ./configure, and prefer
dns_sd.h if it's found (which will be the case for 10.3 and 10.4) but
use DNSServiceDiscovery.h if not (which will be the case for 10.2).

Thanks!

- Chris

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +