[Proj] libproj4 thread safety

Glynn Clements glynn at gclements.plus.com
Sat Apr 23 22:13:11 EDT 2005


Gerald Evenden wrote:

> The problem of the thread safe version of pj_errno for
> libproj4 seems to be taken care of with the following file:

[details snipped]

Seems fine.

> Note that some return error checks are not made but what
> to do if they fail??  Can't set pj_errno. :-(  Maybe
> should just call one of the exit procedures.

AFAICT, all of the error conditions boil down to inability to allocate
a resource. According to the documentation:

+ pthread_key_create() will fail if you exceed the maximum number of
keys (1024 on my system).

+ pthread_setspecific() can fail due to insufficient memory (or if the
key is invalid, which means that pthread_key_create() failed).

+ pthread_getspecific() and pthread_once() can't fail.

Neither seem particularly likely to occur in practice. 1024 keys is
plenty (a library which uses per-thread storage typically uses a
single key), and if memory is so short that pthread_setspecific()
can't get enough memory to store a key/value pair, the process doesn't
have much of a future.

> Next problem is how to handle this procedure for both those
> interested in threads and those not caring a whit.  If it
> is placed in libproj4.a, users have to link with '-l threads'
> regardless of using threads.  Make two different libraries?
> Do not include pj_errno.o library and force user to include
> pj_errno.o on compile line?  Note: I will include a compile
> switch to allow for compiling as either a vanilla or pthreads
> version---it makes no difference to the macro inclusion nor
> the remainder of the libproj4 system.
> 
> Comments, suggestions would be appreciated here.

One possibility is to put all of the pthread code into a separate
source file, and conditionalise the pj_errno definition, e.g.:

	#ifdef PROJ_USES_PTHREADS
	#define pj_errno (*pj_errno_loc())
	#else
	extern int pj_static_errno;
	#define pj_errno pj_static_errno
	#endif

If the user compiles without PROJ_USES_PTHREADS, pj_errno_loc() will
never be referenced, so the corresponding .o file from libproj.a won't
get linked in, so there should be no references to the pthread
functions in the final executable.

-- 
Glynn Clements <glynn at gclements.plus.com>



More information about the Proj mailing list