public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* Binutils 2.20 - Windres problems building pthreads/libiconv on Open   Solaris
@ 2010-02-07  3:51 Tony Theodore
  2010-02-09 10:57 ` Nick Clifton
  0 siblings, 1 reply; 11+ messages in thread
From: Tony Theodore @ 2010-02-07  3:51 UTC (permalink / raw)
  To: binutils

[-- Attachment #1: Type: text/plain, Size: 2330 bytes --]

Hi All,

The mingw-cross-env project builds a gcc win32 cross-compiler and
various libraries. One of the first steps is to make and install a
native binutils configured as follows:

./configure \
--target='i686-pc-mingw32' \
--prefix='~/mingw-cross-env/usr' \
--with-gcc \
--with-gnu-ld \
--with-gnu-as \
--disable-nls \
--disable-shared

A recent update from binutils 2.19.1 to 2.20 causes the resulting
i686-pc-mingw32-windres to segfault on Open Solaris 2009.06 when
building pthreads with the following command:

i686-pc-mingw32-windres --include-dir=. -D__CLEANUP_C -o version.o version.rc
gmake[3]: *** [version.o] Segmentation Fault (core dumped)

I get the same result on two different machines and have tried
building binutils with both gcc 3.4.3 and 4.3.2. The update to 2.20
works on several other sytems (Debian, FreeBSD, Mac OSX, Ubuntu).

Removing other options and simply calling:

i686-pc-mingw32-windres version.rc version.o

results in the same segfault. After a long process of trying different
options, it seems that specifying a codepage:

i686-pc-mingw32-windres -c 1252 version.rc version.o

allows the build to succeed (though I'm not sure if that is the actual
codepage, a few others work also).

It doesn't get very far though, the next package, libiconv, fails also:

/bin/sh ../libtool --mode=compile --tag=RC i686-pc-mingw32-windres
`/bin/sh ./../windows/windres-options --escape 1.13.1` -i
./../windows/libiconv.rc -o libiconv.res.lo --output-format=coff
libtool: compile:  i686-pc-mingw32-windres
"-DPACKAGE_VERSION_STRING=\\\"1.13.1\\\"" -DPACKAGE_VERSION_MAJOR=1
-DPACKAGE_VERSION_MINOR=13 -DPACKAGE_VERSION_SUBMINOR=1 -i
./../windows/libiconv.rc --output-format=coff -o libiconv.res.o
../libtool[987]: eval: line 2: 7733: Memory fault(coredump)

Again, specifying a codepage causes the error to go away, but I'm not
sure it's the real problem.

I'm a little stuck now, and don't know how to proceed. I can't find a
way to specify a codepage globally, and reducing configure to a
minimal

./configure --target='i686-pc-mingw32' --prefix='~/mingw-cross-env/usr'

results in the same errors.

I've attached the version.rc from pthreads that seems to be the
simplest way to replicate the error.

Any help would be appreciated,

Tony

[-- Attachment #2: version.rc --]
[-- Type: application/octet-stream, Size: 15506 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on  Open   Solaris
  2010-02-07  3:51 Binutils 2.20 - Windres problems building pthreads/libiconv on Open Solaris Tony Theodore
@ 2010-02-09 10:57 ` Nick Clifton
  2010-02-10 11:17   ` Tony Theodore
  0 siblings, 1 reply; 11+ messages in thread
From: Nick Clifton @ 2010-02-09 10:57 UTC (permalink / raw)
  To: Tony Theodore; +Cc: binutils

Hi Tony,

   I tried reproducing this problem on an x86 Linux host machine, but it 
fails with:

   windres: version.rc:94: syntax error

I suspect that this means that PTW32_VERSION is not defined.  It is not 
clear to me where this macro should be defined.  Maybe in the pthread.h
file ?  Do you have a local version of pthread.h that is different from 
the system version ?


> i686-pc-mingw32-windres --include-dir=. -D__CLEANUP_C -o version.o version.rc
> gmake[3]: *** [version.o] Segmentation Fault (core dumped)

> i686-pc-mingw32-windres version.rc version.o
> results in the same segfault.

Interesting - I would have expected to see the #error message from the 
preprocessor about the "Resource compiler doesn't know which compiler 
you're using - see version.rc".  Which leads me to suspect that the 
problem is in the C-preprocessor that is being used by windres, rather 
than the windres program itself.  Have you tried using the 
--preprocessor=<> option to specify a different C preprocessor ? 
(Assuming that one is available on your system).


> After a long process of trying different
> options, it seems that specifying a codepage:
>
> i686-pc-mingw32-windres -c 1252 version.rc version.o
>
> allows the build to succeed

Which kind of destroys my theory about the C preprocessor being 
responsible, since the -c option is not passed along...

Are you able to run windres inside a debugger and find out where the 
segmentation fault is happening ?  I have a horrible feeling that it 
might be inside a system/library call and there might not be a lot that 
can be done about it. :-(


> I'm a little stuck now, and don't know how to proceed. I can't find a
> way to specify a codepage globally,

I *think* that you can do this by defining the macro CP_ACP to the 
codepage that you want.  (See the binutils/winduni.h source file). 
Either that or you could edit winduni.h directly...

Cheers
   Nick



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on   Open Solaris
  2010-02-09 10:57 ` Nick Clifton
@ 2010-02-10 11:17   ` Tony Theodore
  2010-02-12  6:16     ` Tony Theodore
  2010-02-14  3:27     ` Dave Korn
  0 siblings, 2 replies; 11+ messages in thread
From: Tony Theodore @ 2010-02-10 11:17 UTC (permalink / raw)
  To: Nick Clifton; +Cc: binutils

[-- Attachment #1: Type: text/plain, Size: 2942 bytes --]

Hi Nick,

Thanks for taking the time to look at this.

On 9 February 2010 21:57, Nick Clifton <nickc@redhat.com> wrote:
> Hi Tony,
>
>  I tried reproducing this problem on an x86 Linux host machine, but it fails
> with:

I've only seen the problem on Open Solaris (2009.06 - x86), and only
after updating to 2.20. A range of 32 and 64bit FreeBSD, Linux, and
OSX systems all work fine.

>  windres: version.rc:94: syntax error
>
> I suspect that this means that PTW32_VERSION is not defined.  It is not
> clear to me where this macro should be defined.  Maybe in the pthread.h
> file ?  Do you have a local version of pthread.h that is different from the
> system version ?

Yes, it's in pthread.h, apologies they were already being found on my
system. pthread.h is patched to define PTW32_STATIC_LIB. I've attached
the three files - version.rc, pthreads.h and winver.h (from w32api).


> Which kind of destroys my theory about the C preprocessor being responsible,
> since the -c option is not passed along...
>
> Are you able to run windres inside a debugger and find out where the
> segmentation fault is happening ?  I have a horrible feeling that it might
> be inside a system/library call and there might not be a lot that can be
> done about it. :-(

It's the first time I've used it, but here is the log from gdb:

Starting program:
/export/home/tony/mingw-cross-env-binutils/usr/bin/i686-pc-mingw32-windres
version.rc version.o

Program received signal SIGSEGV, Segmentation fault.
0xcea46832 in iconv () from /lib/libc.so.1
#0  0xcea46832 in iconv () from /lib/libc.so.1
#1  0x08071dbd in iconv_onechar (cd=0xffffffff, s=0x81053d0 "FileDescription",
    d=0x8046940 "\022", d_len=32, n_s=0xffffffff, n_d=0xffffffff)
    at winduni.c:633
#2  0x08071fc3 in wind_MultiByteToWideChar (cp=4294967295,
    mb=0x81053d0 "FileDescription", u=0x0, u_len=0) at winduni.c:694
#3  0x08072052 in unicode_from_codepage (length=0x0, u=0x81053d0,
    src=0x81053d0 "FileDescription", cp=0) at winduni.c:584
#4  0x080720ae in unicode_from_ascii (length=0x0, unicode=0x8046a28,
    ascii=0x81053d0 "FileDescription") at winduni.c:194
#5  0x0806e74f in yyparse () at rcparse.y:1703
#6  0x08064c2e in read_rc_file (filename=0x8047ad7 "version.rc",
    preprocessor=0x80e002c "gcc -E -xc -DRC_INVOKED",
    preprocargs=0x80dfd80 "", language=1033, use_temp_file=0) at resrc.c:562
#7  0x08063aee in main (argc=3, argv=0x8047970) at windres.c:1025
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.


> I *think* that you can do this by defining the macro CP_ACP to the codepage
> that you want.  (See the binutils/winduni.h source file). Either that or you
> could edit winduni.h directly...

Ok, I'll give that a try. Specifying the default 0 via the -c option
also segfaults, so it seems this should work.

Thanks,

Tony

[-- Attachment #2: version.rc --]
[-- Type: application/octet-stream, Size: 15506 bytes --]

[-- Attachment #3: pthread.h --]
[-- Type: application/octet-stream, Size: 41800 bytes --]

/* This is an implementation of the threads API of POSIX 1003.1-2001.
 *
 * --------------------------------------------------------------------------
 *
 *      Pthreads-win32 - POSIX Threads Library for Win32
 *      Copyright(C) 1998 John E. Bossom
 *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 * 
 *      Contact Email: rpj@callisto.canberra.edu.au
 * 
 *      The current list of contributors is contained
 *      in the file CONTRIBUTORS included with the source
 *      code distribution. The list can also be seen at the
 *      following World Wide Web location:
 *      http://sources.redhat.com/pthreads-win32/contributors.html
 * 
 *      This library is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU Lesser General Public
 *      License as published by the Free Software Foundation; either
 *      version 2 of the License, or (at your option) any later version.
 * 
 *      This library is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *      Lesser General Public License for more details.
 * 
 *      You should have received a copy of the GNU Lesser General Public
 *      License along with this library in the file COPYING.LIB;
 *      if not, write to the Free Software Foundation, Inc.,
 *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 */

#if !defined( PTHREAD_H )
#define PTHREAD_H
#define PTW32_STATIC_LIB

/*
 * See the README file for an explanation of the pthreads-win32 version
 * numbering scheme and how the DLL is named etc.
 */
#define PTW32_VERSION 2,8,0,0
#define PTW32_VERSION_STRING "2, 8, 0, 0\0"

/* There are three implementations of cancel cleanup.
 * Note that pthread.h is included in both application
 * compilation units and also internally for the library.
 * The code here and within the library aims to work
 * for all reasonable combinations of environments.
 *
 * The three implementations are:
 *
 *   WIN32 SEH
 *   C
 *   C++
 *
 * Please note that exiting a push/pop block via
 * "return", "exit", "break", or "continue" will
 * lead to different behaviour amongst applications
 * depending upon whether the library was built
 * using SEH, C++, or C. For example, a library built
 * with SEH will call the cleanup routine, while both
 * C++ and C built versions will not.
 */

/*
 * Define defaults for cleanup code.
 * Note: Unless the build explicitly defines one of the following, then
 * we default to standard C style cleanup. This style uses setjmp/longjmp
 * in the cancelation and thread exit implementations and therefore won't
 * do stack unwinding if linked to applications that have it (e.g.
 * C++ apps). This is currently consistent with most/all commercial Unix
 * POSIX threads implementations.
 */
#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C )
# define __CLEANUP_C
#endif

#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC))
#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler.
#endif

/*
 * Stop here if we are being included by the resource compiler.
 */
#ifndef RC_INVOKED

#undef PTW32_LEVEL

#if defined(_POSIX_SOURCE)
#define PTW32_LEVEL 0
/* Early POSIX */
#endif

#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
#undef PTW32_LEVEL
#define PTW32_LEVEL 1
/* Include 1b, 1c and 1d */
#endif

#if defined(INCLUDE_NP)
#undef PTW32_LEVEL
#define PTW32_LEVEL 2
/* Include Non-Portable extensions */
#endif

#define PTW32_LEVEL_MAX 3

#if !defined(PTW32_LEVEL)
#define PTW32_LEVEL PTW32_LEVEL_MAX
/* Include everything */
#endif

#ifdef _UWIN
#   define HAVE_STRUCT_TIMESPEC 1
#   define HAVE_SIGNAL_H        1
#   undef HAVE_CONFIG_H
#   pragma comment(lib, "pthread")
#endif

/*
 * -------------------------------------------------------------
 *
 *
 * Module: pthread.h
 *
 * Purpose:
 *      Provides an implementation of PThreads based upon the
 *      standard:
 *
 *              POSIX 1003.1-2001
 *  and
 *    The Single Unix Specification version 3
 *
 *    (these two are equivalent)
 *
 *      in order to enhance code portability between Windows,
 *  various commercial Unix implementations, and Linux.
 *
 *      See the ANNOUNCE file for a full list of conforming
 *      routines and defined constants, and a list of missing
 *      routines and constants not defined in this implementation.
 *
 * Authors:
 *      There have been many contributors to this library.
 *      The initial implementation was contributed by
 *      John Bossom, and several others have provided major
 *      sections or revisions of parts of the implementation.
 *      Often significant effort has been contributed to
 *      find and fix important bugs and other problems to
 *      improve the reliability of the library, which sometimes
 *      is not reflected in the amount of code which changed as
 *      result.
 *      As much as possible, the contributors are acknowledged
 *      in the ChangeLog file in the source code distribution
 *      where their changes are noted in detail.
 *
 *      Contributors are listed in the CONTRIBUTORS file.
 *
 *      As usual, all bouquets go to the contributors, and all
 *      brickbats go to the project maintainer.
 *
 * Maintainer:
 *      The code base for this project is coordinated and
 *      eventually pre-tested, packaged, and made available by
 *
 *              Ross Johnson <rpj@callisto.canberra.edu.au>
 *
 * QA Testers:
 *      Ultimately, the library is tested in the real world by
 *      a host of competent and demanding scientists and
 *      engineers who report bugs and/or provide solutions
 *      which are then fixed or incorporated into subsequent
 *      versions of the library. Each time a bug is fixed, a
 *      test case is written to prove the fix and ensure
 *      that later changes to the code don't reintroduce the
 *      same error. The number of test cases is slowly growing
 *      and therefore so is the code reliability.
 *
 * Compliance:
 *      See the file ANNOUNCE for the list of implemented
 *      and not-implemented routines and defined options.
 *      Of course, these are all defined is this file as well.
 *
 * Web site:
 *      The source code and other information about this library
 *      are available from
 *
 *              http://sources.redhat.com/pthreads-win32/
 *
 * -------------------------------------------------------------
 */

/* Try to avoid including windows.h */
#if defined(__MINGW32__) && defined(__cplusplus)
#define PTW32_INCLUDE_WINDOWS_H
#endif

#ifdef PTW32_INCLUDE_WINDOWS_H
#include <windows.h>
#endif

#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__)
/*
 * VC++6.0 or early compiler's header has no DWORD_PTR type.
 */
typedef unsigned long DWORD_PTR;
#endif
/*
 * -----------------
 * autoconf switches
 * -----------------
 */

#if HAVE_CONFIG_H

#endif /* HAVE_CONFIG_H */

#ifndef NEED_FTIME
#include <time.h>
#else /* NEED_FTIME */
/* use native WIN32 time API */
#endif /* NEED_FTIME */

#if HAVE_SIGNAL_H
#include <signal.h>
#endif /* HAVE_SIGNAL_H */

#include <setjmp.h>
#include <limits.h>

/*
 * Boolean values to make us independent of system includes.
 */
enum {
  PTW32_FALSE = 0,
  PTW32_TRUE = (! PTW32_FALSE)
};

/*
 * This is a duplicate of what is in the autoconf config.h,
 * which is only used when building the pthread-win32 libraries.
 */

#ifndef PTW32_CONFIG_H
#  if defined(WINCE)
#    define NEED_ERRNO
#    define NEED_SEM
#  endif
#  if defined(_UWIN) || defined(__MINGW32__)
#    define HAVE_MODE_T
#  endif
#endif

/*
 *
 */

#if PTW32_LEVEL >= PTW32_LEVEL_MAX
#ifdef NEED_ERRNO
#include "need_errno.h"
#else
#include <errno.h>
#endif
#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */

/*
 * Several systems don't define some error numbers.
 */
#ifndef ENOTSUP
#  define ENOTSUP 48   /* This is the value in Solaris. */
#endif

#ifndef ETIMEDOUT
#  define ETIMEDOUT 10060     /* This is the value in winsock.h. */
#endif

#ifndef ENOSYS
#  define ENOSYS 140     /* Semi-arbitrary value */
#endif

#ifndef EDEADLK
#  ifdef EDEADLOCK
#    define EDEADLK EDEADLOCK
#  else
#    define EDEADLK 36     /* This is the value in MSVC. */
#  endif
#endif

#include <sched.h>

/*
 * To avoid including windows.h we define only those things that we
 * actually need from it.
 */
#ifndef PTW32_INCLUDE_WINDOWS_H
#ifndef HANDLE
# define PTW32__HANDLE_DEF
# define HANDLE void *
#endif
#ifndef DWORD
# define PTW32__DWORD_DEF
# define DWORD unsigned long
#endif
#endif

#ifndef HAVE_STRUCT_TIMESPEC
#define HAVE_STRUCT_TIMESPEC 1
struct timespec {
        long tv_sec;
        long tv_nsec;
};
#endif /* HAVE_STRUCT_TIMESPEC */

#ifndef SIG_BLOCK
#define SIG_BLOCK 0
#endif /* SIG_BLOCK */

#ifndef SIG_UNBLOCK 
#define SIG_UNBLOCK 1
#endif /* SIG_UNBLOCK */

#ifndef SIG_SETMASK
#define SIG_SETMASK 2
#endif /* SIG_SETMASK */

#ifdef __cplusplus
extern "C"
{
#endif                          /* __cplusplus */

/*
 * -------------------------------------------------------------
 *
 * POSIX 1003.1-2001 Options
 * =========================
 *
 * Options are normally set in <unistd.h>, which is not provided
 * with pthreads-win32.
 *
 * For conformance with the Single Unix Specification (version 3), all of the
 * options below are defined, and have a value of either -1 (not supported)
 * or 200112L (supported).
 *
 * These options can neither be left undefined nor have a value of 0, because
 * either indicates that sysconf(), which is not implemented, may be used at
 * runtime to check the status of the option.
 *
 * _POSIX_THREADS (== 200112L)
 *                      If == 200112L, you can use threads
 *
 * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L)
 *                      If == 200112L, you can control the size of a thread's
 *                      stack
 *                              pthread_attr_getstacksize
 *                              pthread_attr_setstacksize
 *
 * _POSIX_THREAD_ATTR_STACKADDR (== -1)
 *                      If == 200112L, you can allocate and control a thread's
 *                      stack. If not supported, the following functions
 *                      will return ENOSYS, indicating they are not
 *                      supported:
 *                              pthread_attr_getstackaddr
 *                              pthread_attr_setstackaddr
 *
 * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1)
 *                      If == 200112L, you can use realtime scheduling.
 *                      This option indicates that the behaviour of some
 *                      implemented functions conforms to the additional TPS
 *                      requirements in the standard. E.g. rwlocks favour
 *                      writers over readers when threads have equal priority.
 *
 * _POSIX_THREAD_PRIO_INHERIT (== -1)
 *                      If == 200112L, you can create priority inheritance
 *                      mutexes.
 *                              pthread_mutexattr_getprotocol +
 *                              pthread_mutexattr_setprotocol +
 *
 * _POSIX_THREAD_PRIO_PROTECT (== -1)
 *                      If == 200112L, you can create priority ceiling mutexes
 *                      Indicates the availability of:
 *                              pthread_mutex_getprioceiling
 *                              pthread_mutex_setprioceiling
 *                              pthread_mutexattr_getprioceiling
 *                              pthread_mutexattr_getprotocol     +
 *                              pthread_mutexattr_setprioceiling
 *                              pthread_mutexattr_setprotocol     +
 *
 * _POSIX_THREAD_PROCESS_SHARED (== -1)
 *                      If set, you can create mutexes and condition
 *                      variables that can be shared with another
 *                      process.If set, indicates the availability
 *                      of:
 *                              pthread_mutexattr_getpshared
 *                              pthread_mutexattr_setpshared
 *                              pthread_condattr_getpshared
 *                              pthread_condattr_setpshared
 *
 * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L)
 *                      If == 200112L you can use the special *_r library
 *                      functions that provide thread-safe behaviour
 *
 * _POSIX_READER_WRITER_LOCKS (== 200112L)
 *                      If == 200112L, you can use read/write locks
 *
 * _POSIX_SPIN_LOCKS (== 200112L)
 *                      If == 200112L, you can use spin locks
 *
 * _POSIX_BARRIERS (== 200112L)
 *                      If == 200112L, you can use barriers
 *
 *      + These functions provide both 'inherit' and/or
 *        'protect' protocol, based upon these macro
 *        settings.
 *
 * -------------------------------------------------------------
 */

/*
 * POSIX Options
 */
#undef _POSIX_THREADS
#define _POSIX_THREADS 200112L

#undef _POSIX_READER_WRITER_LOCKS
#define _POSIX_READER_WRITER_LOCKS 200112L

#undef _POSIX_SPIN_LOCKS
#define _POSIX_SPIN_LOCKS 200112L

#undef _POSIX_BARRIERS
#define _POSIX_BARRIERS 200112L

#undef _POSIX_THREAD_SAFE_FUNCTIONS
#define _POSIX_THREAD_SAFE_FUNCTIONS 200112L

#undef _POSIX_THREAD_ATTR_STACKSIZE
#define _POSIX_THREAD_ATTR_STACKSIZE 200112L

/*
 * The following options are not supported
 */
#undef _POSIX_THREAD_ATTR_STACKADDR
#define _POSIX_THREAD_ATTR_STACKADDR -1

#undef _POSIX_THREAD_PRIO_INHERIT
#define _POSIX_THREAD_PRIO_INHERIT -1

#undef _POSIX_THREAD_PRIO_PROTECT
#define _POSIX_THREAD_PRIO_PROTECT -1

/* TPS is not fully supported.  */
#undef _POSIX_THREAD_PRIORITY_SCHEDULING
#define _POSIX_THREAD_PRIORITY_SCHEDULING -1

#undef _POSIX_THREAD_PROCESS_SHARED
#define _POSIX_THREAD_PROCESS_SHARED -1


/*
 * POSIX 1003.1-2001 Limits
 * ===========================
 *
 * These limits are normally set in <limits.h>, which is not provided with
 * pthreads-win32.
 *
 * PTHREAD_DESTRUCTOR_ITERATIONS
 *                      Maximum number of attempts to destroy
 *                      a thread's thread-specific data on
 *                      termination (must be at least 4)
 *
 * PTHREAD_KEYS_MAX
 *                      Maximum number of thread-specific data keys
 *                      available per process (must be at least 128)
 *
 * PTHREAD_STACK_MIN
 *                      Minimum supported stack size for a thread
 *
 * PTHREAD_THREADS_MAX
 *                      Maximum number of threads supported per
 *                      process (must be at least 64).
 *
 * SEM_NSEMS_MAX
 *                      The maximum number of semaphores a process can have.
 *                      (must be at least 256)
 *
 * SEM_VALUE_MAX
 *                      The maximum value a semaphore can have.
 *                      (must be at least 32767)
 *
 */
#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS     4

#undef PTHREAD_DESTRUCTOR_ITERATIONS
#define PTHREAD_DESTRUCTOR_ITERATIONS           _POSIX_THREAD_DESTRUCTOR_ITERATIONS

#undef _POSIX_THREAD_KEYS_MAX
#define _POSIX_THREAD_KEYS_MAX                  128

#undef PTHREAD_KEYS_MAX
#define PTHREAD_KEYS_MAX                        _POSIX_THREAD_KEYS_MAX

#undef PTHREAD_STACK_MIN
#define PTHREAD_STACK_MIN                       0

#undef _POSIX_THREAD_THREADS_MAX
#define _POSIX_THREAD_THREADS_MAX               64

  /* Arbitrary value */
#undef PTHREAD_THREADS_MAX
#define PTHREAD_THREADS_MAX                     2019

#undef _POSIX_SEM_NSEMS_MAX
#define _POSIX_SEM_NSEMS_MAX                    256

  /* Arbitrary value */
#undef SEM_NSEMS_MAX
#define SEM_NSEMS_MAX                           1024

#undef _POSIX_SEM_VALUE_MAX
#define _POSIX_SEM_VALUE_MAX                    32767

#undef SEM_VALUE_MAX
#define SEM_VALUE_MAX                           INT_MAX


#if __GNUC__ && ! defined (__declspec)
# error Please upgrade your GNU compiler to one that supports __declspec.
#endif

/*
 * When building the DLL code, you should define PTW32_BUILD so that
 * the variables/functions are exported correctly. When using the DLL,
 * do NOT define PTW32_BUILD, and then the variables/functions will
 * be imported correctly.
 */
#ifndef PTW32_STATIC_LIB
#  ifdef PTW32_BUILD
#    define PTW32_DLLPORT __declspec (dllexport)
#  else
#    define PTW32_DLLPORT __declspec (dllimport)
#  endif
#else
#  define PTW32_DLLPORT
#endif

/*
 * The Open Watcom C/C++ compiler uses a non-standard calling convention
 * that passes function args in registers unless __cdecl is explicitly specified
 * in exposed function prototypes.
 *
 * We force all calls to cdecl even though this could slow Watcom code down
 * slightly. If you know that the Watcom compiler will be used to build both
 * the DLL and application, then you can probably define this as a null string.
 * Remember that pthread.h (this file) is used for both the DLL and application builds.
 */
#define PTW32_CDECL __cdecl

#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX
#   include     <sys/types.h>
#else
/*
 * Generic handle type - intended to extend uniqueness beyond
 * that available with a simple pointer. It should scale for either
 * IA-32 or IA-64.
 */
typedef struct {
    void * p;                   /* Pointer to actual object */
    unsigned int x;             /* Extra information - reuse count etc */
} ptw32_handle_t;

typedef ptw32_handle_t pthread_t;
typedef struct pthread_attr_t_ * pthread_attr_t;
typedef struct pthread_once_t_ pthread_once_t;
typedef struct pthread_key_t_ * pthread_key_t;
typedef struct pthread_mutex_t_ * pthread_mutex_t;
typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t;
typedef struct pthread_cond_t_ * pthread_cond_t;
typedef struct pthread_condattr_t_ * pthread_condattr_t;
#endif
typedef struct pthread_rwlock_t_ * pthread_rwlock_t;
typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t;
typedef struct pthread_spinlock_t_ * pthread_spinlock_t;
typedef struct pthread_barrier_t_ * pthread_barrier_t;
typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t;

/*
 * ====================
 * ====================
 * POSIX Threads
 * ====================
 * ====================
 */

enum {
/*
 * pthread_attr_{get,set}detachstate
 */
  PTHREAD_CREATE_JOINABLE       = 0,  /* Default */
  PTHREAD_CREATE_DETACHED       = 1,

/*
 * pthread_attr_{get,set}inheritsched
 */
  PTHREAD_INHERIT_SCHED         = 0,
  PTHREAD_EXPLICIT_SCHED        = 1,  /* Default */

/*
 * pthread_{get,set}scope
 */
  PTHREAD_SCOPE_PROCESS         = 0,
  PTHREAD_SCOPE_SYSTEM          = 1,  /* Default */

/*
 * pthread_setcancelstate paramters
 */
  PTHREAD_CANCEL_ENABLE         = 0,  /* Default */
  PTHREAD_CANCEL_DISABLE        = 1,

/*
 * pthread_setcanceltype parameters
 */
  PTHREAD_CANCEL_ASYNCHRONOUS   = 0,
  PTHREAD_CANCEL_DEFERRED       = 1,  /* Default */

/*
 * pthread_mutexattr_{get,set}pshared
 * pthread_condattr_{get,set}pshared
 */
  PTHREAD_PROCESS_PRIVATE       = 0,
  PTHREAD_PROCESS_SHARED        = 1,

/*
 * pthread_barrier_wait
 */
  PTHREAD_BARRIER_SERIAL_THREAD = -1
};

/*
 * ====================
 * ====================
 * Cancelation
 * ====================
 * ====================
 */
#define PTHREAD_CANCELED       ((void *) -1)


/*
 * ====================
 * ====================
 * Once Key
 * ====================
 * ====================
 */
#define PTHREAD_ONCE_INIT       { PTW32_FALSE, 0, 0, 0}

struct pthread_once_t_
{
  int          done;        /* indicates if user function has been executed */
  void *       lock;
  int          reserved1;
  int          reserved2;
};


/*
 * ====================
 * ====================
 * Object initialisers
 * ====================
 * ====================
 */
#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1)
#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t) -2)
#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t) -3)

/*
 * Compatibility with LinuxThreads
 */
#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER
#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER

#define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1)

#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) -1)

#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t) -1)


/*
 * Mutex types.
 */
enum
{
  /* Compatibility with LinuxThreads */
  PTHREAD_MUTEX_FAST_NP,
  PTHREAD_MUTEX_RECURSIVE_NP,
  PTHREAD_MUTEX_ERRORCHECK_NP,
  PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP,
  PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP,
  /* For compatibility with POSIX */
  PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP,
  PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
  PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
  PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
};


typedef struct ptw32_cleanup_t ptw32_cleanup_t;

#if defined(_MSC_VER)
/* Disable MSVC 'anachronism used' warning */
#pragma warning( disable : 4229 )
#endif

typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *);

#if defined(_MSC_VER)
#pragma warning( default : 4229 )
#endif

struct ptw32_cleanup_t
{
  ptw32_cleanup_callback_t routine;
  void *arg;
  struct ptw32_cleanup_t *prev;
};

#ifdef __CLEANUP_SEH
        /*
         * WIN32 SEH version of cancel cleanup.
         */

#define pthread_cleanup_push( _rout, _arg ) \
        { \
            ptw32_cleanup_t     _cleanup; \
            \
        _cleanup.routine        = (ptw32_cleanup_callback_t)(_rout); \
            _cleanup.arg        = (_arg); \
            __try \
              { \

#define pthread_cleanup_pop( _execute ) \
              } \
            __finally \
                { \
                    if( _execute || AbnormalTermination()) \
                      { \
                          (*(_cleanup.routine))( _cleanup.arg ); \
                      } \
                } \
        }

#else /* __CLEANUP_SEH */

#ifdef __CLEANUP_C

        /*
         * C implementation of PThreads cancel cleanup
         */

#define pthread_cleanup_push( _rout, _arg ) \
        { \
            ptw32_cleanup_t     _cleanup; \
            \
            ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \

#define pthread_cleanup_pop( _execute ) \
            (void) ptw32_pop_cleanup( _execute ); \
        }

#else /* __CLEANUP_C */

#ifdef __CLEANUP_CXX

        /*
         * C++ version of cancel cleanup.
         * - John E. Bossom.
         */

        class PThreadCleanup {
          /*
           * PThreadCleanup
           *
           * Purpose
           *      This class is a C++ helper class that is
           *      used to implement pthread_cleanup_push/
           *      pthread_cleanup_pop.
           *      The destructor of this class automatically
           *      pops the pushed cleanup routine regardless
           *      of how the code exits the scope
           *      (i.e. such as by an exception)
           */
      ptw32_cleanup_callback_t cleanUpRout;
          void    *       obj;
          int             executeIt;

        public:
          PThreadCleanup() :
            cleanUpRout( 0 ),
            obj( 0 ),
            executeIt( 0 )
            /*
             * No cleanup performed
             */
            {
            }

          PThreadCleanup(
             ptw32_cleanup_callback_t routine,
                         void    *       arg ) :
            cleanUpRout( routine ),
            obj( arg ),
            executeIt( 1 )
            /*
             * Registers a cleanup routine for 'arg'
             */
            {
            }

          ~PThreadCleanup()
            {
              if ( executeIt && ((void *) cleanUpRout != (void *) 0) )
                {
                  (void) (*cleanUpRout)( obj );
                }
            }

          void execute( int exec )
            {
              executeIt = exec;
            }
        };

        /*
         * C++ implementation of PThreads cancel cleanup;
         * This implementation takes advantage of a helper
         * class who's destructor automatically calls the
         * cleanup routine if we exit our scope weirdly
         */
#define pthread_cleanup_push( _rout, _arg ) \
        { \
            PThreadCleanup  cleanup((ptw32_cleanup_callback_t)(_rout), \
                                    (void *) (_arg) );

#define pthread_cleanup_pop( _execute ) \
            cleanup.execute( _execute ); \
        }

#else

#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined.

#endif /* __CLEANUP_CXX */

#endif /* __CLEANUP_C */

#endif /* __CLEANUP_SEH */

/*
 * ===============
 * ===============
 * Methods
 * ===============
 * ===============
 */

/*
 * PThread Attribute Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr,
                                         int *detachstate);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr,
                                       void **stackaddr);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr,
                                       size_t * stacksize);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr,
                                         int detachstate);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr,
                                       void *stackaddr);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr,
                                       size_t stacksize);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr,
                                        struct sched_param *param);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr,
                                        const struct sched_param *param);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *,
                                         int);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (pthread_attr_t *,
                                         int *);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr,
                                         int inheritsched);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(pthread_attr_t * attr,
                                         int * inheritsched);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *,
                                   int);

PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *,
                                   int *);

/*
 * PThread Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,
                            const pthread_attr_t * attr,
                            void *(*start) (void *),
                            void *arg);

PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid);

PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1,
                           pthread_t t2);

PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr);

PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread,
                          void **value_ptr);

PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void);

PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread);

PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state,
                                    int *oldstate);

PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type,
                                   int *oldtype);

PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void);

PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control,
                          void (*init_routine) (void));

#if PTW32_LEVEL >= PTW32_LEVEL_MAX
PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute);

PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup,
                                 void (*routine) (void *),
                                 void *arg);
#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */

/*
 * Thread Specific Data Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key,
                                void (*destructor) (void *));

PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key);

PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key,
                                 const void *value);

PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key);


/*
 * Mutex Attribute Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t
                                          * attr,
                                          int *pshared);

PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr,
                                          int pshared);

PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind);
PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind);

/*
 * Barrier Attribute Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t
                                            * attr,
                                            int *pshared);

PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr,
                                            int pshared);

/*
 * Mutex Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex,
                                const pthread_mutexattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex);

PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex);

PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t *mutex,
                                    const struct timespec *abstime);

PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex);

PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex);

/*
 * Spinlock Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared);

PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock);

PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock);

PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock);

PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock);

/*
 * Barrier Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier,
                                  const pthread_barrierattr_t * attr,
                                  unsigned int count);

PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier);

PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier);

/*
 * Condition Variable Attribute Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr,
                                         int *pshared);

PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr,
                                         int pshared);

/*
 * Condition Variable Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond,
                               const pthread_condattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond);

PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond,
                               pthread_mutex_t * mutex);

PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond,
                                    pthread_mutex_t * mutex,
                                    const struct timespec *abstime);

PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond);

PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond);

/*
 * Scheduling
 */
PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread,
                                   int policy,
                                   const struct sched_param *param);

PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread,
                                   int *policy,
                                   struct sched_param *param);

PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int);
 
PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void);

/*
 * Read-Write Lock Functions
 */
PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock,
                                const pthread_rwlockattr_t *attr);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock,
                                       const struct timespec *abstime);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock,
                                       const struct timespec *abstime);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr,
                                           int *pshared);

PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr,
                                           int pshared);

#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1

/*
 * Signal Functions. Should be defined in <signal.h> but MSVC and MinGW32
 * already have signal.h that don't define these.
 */
PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig);

/*
 * Non-portable functions
 */

/*
 * Compatibility with Linux.
 */
PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr,
                                         int kind);
PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr,
                                         int *kind);

/*
 * Possibly supported by other POSIX threads implementations
 */
PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval);
PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void);

/*
 * Useful if an application wants to statically link
 * the lib rather than load the DLL at run-time.
 */
PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void);
PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void);
PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void);
PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void);

/*
 * Features that are auto-detected at load/run time.
 */
PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int);
enum ptw32_features {
  PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */
  PTW32_ALERTABLE_ASYNC_CANCEL              = 0x0002  /* Can cancel blocked threads. */
};

/*
 * Register a system time change with the library.
 * Causes the library to perform various functions
 * in response to the change. Should be called whenever
 * the application's top level window receives a
 * WM_TIMECHANGE message. It can be passed directly to
 * pthread_create() as a new thread if desired.
 */
PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *);

#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */

#if PTW32_LEVEL >= PTW32_LEVEL_MAX

/*
 * Returns the Win32 HANDLE for the POSIX thread.
 */
PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread);


/*
 * Protected Methods
 *
 * This function blocks until the given WIN32 handle
 * is signaled or pthread_cancel had been called.
 * This function allows the caller to hook into the
 * PThreads cancel mechanism. It is implemented using
 *
 *              WaitForMultipleObjects
 *
 * on 'waitHandle' and a manually reset WIN32 Event
 * used to implement pthread_cancel. The 'timeout'
 * argument to TimedWait is simply passed to
 * WaitForMultipleObjects.
 */
PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle);
PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle,
                                        DWORD timeout);

#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */

/*
 * Thread-Safe C Runtime Library Mappings.
 */
#ifndef _UWIN
#  if defined(NEED_ERRNO)
     PTW32_DLLPORT int * PTW32_CDECL _errno( void );
#  else
#    ifndef errno
#      if (defined(_MT) || defined(_DLL))
         __declspec(dllimport) extern int * __cdecl _errno(void);
#        define errno   (*_errno())
#      endif
#    endif
#  endif
#endif

/*
 * WIN32 C runtime library had been made thread-safe
 * without affecting the user interface. Provide
 * mappings from the UNIX thread-safe versions to
 * the standard C runtime library calls.
 * Only provide function mappings for functions that
 * actually exist on WIN32.
 */

#if !defined(__MINGW32__)
#define strtok_r( _s, _sep, _lasts ) \
        ( *(_lasts) = strtok( (_s), (_sep) ) )
#endif /* !__MINGW32__ */

#define asctime_r( _tm, _buf ) \
        ( strcpy( (_buf), asctime( (_tm) ) ), \
          (_buf) )

#define ctime_r( _clock, _buf ) \
        ( strcpy( (_buf), ctime( (_clock) ) ),  \
          (_buf) )

#define gmtime_r( _clock, _result ) \
        ( *(_result) = *gmtime( (_clock) ), \
          (_result) )

#define localtime_r( _clock, _result ) \
        ( *(_result) = *localtime( (_clock) ), \
          (_result) )

#define rand_r( _seed ) \
        ( _seed == _seed? rand() : rand() )


/*
 * Some compiler environments don't define some things.
 */
#if defined(__BORLANDC__)
#  define _ftime ftime
#  define _timeb timeb
#endif

#ifdef __cplusplus

/*
 * Internal exceptions
 */
class ptw32_exception {};
class ptw32_exception_cancel : public ptw32_exception {};
class ptw32_exception_exit   : public ptw32_exception {};

#endif

#if PTW32_LEVEL >= PTW32_LEVEL_MAX

/* FIXME: This is only required if the library was built using SEH */
/*
 * Get internal SEH tag
 */
PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void);

#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */

#ifndef PTW32_BUILD

#ifdef __CLEANUP_SEH

/*
 * Redefine the SEH __except keyword to ensure that applications
 * propagate our internal exceptions up to the library's internal handlers.
 */
#define __except( E ) \
        __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \
                 ? EXCEPTION_CONTINUE_SEARCH : ( E ) )

#endif /* __CLEANUP_SEH */

#ifdef __CLEANUP_CXX

/*
 * Redefine the C++ catch keyword to ensure that applications
 * propagate our internal exceptions up to the library's internal handlers.
 */
#ifdef _MSC_VER
        /*
         * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll'
         * if you want Pthread-Win32 cancelation and pthread_exit to work.
         */

#ifndef PtW32NoCatchWarn

#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.")
#pragma message("------------------------------------------------------------------")
#pragma message("When compiling applications with MSVC++ and C++ exception handling:")
#pragma message("  Replace any 'catch( ... )' in routines called from POSIX threads")
#pragma message("  with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread")
#pragma message("  cancelation and pthread_exit to work. For example:")
#pragma message("")
#pragma message("    #ifdef PtW32CatchAll")
#pragma message("      PtW32CatchAll")
#pragma message("    #else")
#pragma message("      catch(...)")
#pragma message("    #endif")
#pragma message("        {")
#pragma message("          /* Catchall block processing */")
#pragma message("        }")
#pragma message("------------------------------------------------------------------")

#endif

#define PtW32CatchAll \
        catch( ptw32_exception & ) { throw; } \
        catch( ... )

#else /* _MSC_VER */

#define catch( E ) \
        catch( ptw32_exception & ) { throw; } \
        catch( E )

#endif /* _MSC_VER */

#endif /* __CLEANUP_CXX */

#endif /* ! PTW32_BUILD */

#ifdef __cplusplus
}                               /* End of extern "C" */
#endif                          /* __cplusplus */

#ifdef PTW32__HANDLE_DEF
# undef HANDLE
#endif
#ifdef PTW32__DWORD_DEF
# undef DWORD
#endif

#undef PTW32_LEVEL
#undef PTW32_LEVEL_MAX

#endif /* ! RC_INVOKED */

#endif /* PTHREAD_H */

[-- Attachment #4: winver.h --]
[-- Type: application/octet-stream, Size: 3905 bytes --]

#ifndef _WINVER_H
#define _WINVER_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif

#ifdef __cplusplus
extern "C" {
#endif
#define VS_FILE_INFO RT_VERSION
#define VS_VERSION_INFO 1
#define VS_USER_DEFINED 100
#define VS_FFI_SIGNATURE 0xFEEF04BD
#define VS_FFI_STRUCVERSION 0x10000
#define VS_FFI_FILEFLAGSMASK 0x3F
#define VS_FF_DEBUG 1
#define VS_FF_PRERELEASE 2
#define VS_FF_PATCHED 4
#define VS_FF_PRIVATEBUILD 8
#define VS_FF_INFOINFERRED 16
#define VS_FF_SPECIALBUILD 32
#define VOS_UNKNOWN 0
#define VOS_DOS 0x10000
#define VOS_OS216 0x20000
#define VOS_OS232 0x30000
#define VOS_NT 0x40000
#define VOS__BASE 0
#define VOS__WINDOWS16 1
#define VOS__PM16 2
#define VOS__PM32 3
#define VOS__WINDOWS32 4
#define VOS_DOS_WINDOWS16 0x10001
#define VOS_DOS_WINDOWS32 0x10004
#define VOS_OS216_PM16 0x20002
#define VOS_OS232_PM32 0x30003
#define VOS_NT_WINDOWS32 0x40004
#define VFT_UNKNOWN 0
#define VFT_APP 1
#define VFT_DLL 2
#define VFT_DRV 3
#define VFT_FONT 4
#define VFT_VXD 5
#define VFT_STATIC_LIB 7
#define VFT2_UNKNOWN 0
#define VFT2_DRV_PRINTER 1
#define VFT2_DRV_KEYBOARD 2
#define VFT2_DRV_LANGUAGE 3
#define VFT2_DRV_DISPLAY 4
#define VFT2_DRV_MOUSE 5
#define VFT2_DRV_NETWORK 6
#define VFT2_DRV_SYSTEM 7
#define VFT2_DRV_INSTALLABLE 8
#define VFT2_DRV_SOUND 9
#define VFT2_DRV_COMM 10
#define VFT2_DRV_INPUTMETHOD 11
#define VFT2_FONT_RASTER 1
#define VFT2_FONT_VECTOR 2
#define VFT2_FONT_TRUETYPE 3
#define VFFF_ISSHAREDFILE 1
#define VFF_CURNEDEST 1
#define VFF_FILEINUSE 2
#define VFF_BUFFTOOSMALL 4
#define VIFF_FORCEINSTALL 1
#define VIFF_DONTDELETEOLD 2
#define VIF_TEMPFILE 1
#define VIF_MISMATCH 2
#define VIF_SRCOLD 4
#define VIF_DIFFLANG 8
#define VIF_DIFFCODEPG 16
#define VIF_DIFFTYPE 32
#define VIF_WRITEPROT 64
#define VIF_FILEINUSE 128
#define VIF_OUTOFSPACE 256
#define VIF_ACCESSVIOLATION 512
#define VIF_SHARINGVIOLATION 1024
#define VIF_CANNOTCREATE 2048
#define VIF_CANNOTDELETE 4096
#define VIF_CANNOTRENAME 8192
#define VIF_CANNOTDELETECUR 16384
#define VIF_OUTOFMEMORY 32768
#define VIF_CANNOTREADSRC  65536
#define VIF_CANNOTREADDST 0x20000
#define VIF_BUFFTOOSMALL 0x40000
#ifndef RC_INVOKED
typedef struct tagVS_FIXEDFILEINFO {
	DWORD dwSignature;
	DWORD dwStrucVersion;
	DWORD dwFileVersionMS;
	DWORD dwFileVersionLS;
	DWORD dwProductVersionMS;
	DWORD dwProductVersionLS;
	DWORD dwFileFlagsMask;
	DWORD dwFileFlags;
	DWORD dwFileOS;
	DWORD dwFileType;
	DWORD dwFileSubtype;
	DWORD dwFileDateMS;
	DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;
DWORD WINAPI VerFindFileA(DWORD,LPSTR,LPSTR,LPSTR,LPSTR,PUINT,LPSTR,PUINT);
DWORD WINAPI VerFindFileW(DWORD,LPWSTR,LPWSTR,LPWSTR,LPWSTR,PUINT,LPWSTR,PUINT);
DWORD WINAPI VerInstallFileA(DWORD,LPSTR,LPSTR,LPSTR,LPSTR,LPSTR,LPSTR,PUINT);
DWORD WINAPI VerInstallFileW(DWORD,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,PUINT);
DWORD WINAPI GetFileVersionInfoSizeA(LPCSTR,PDWORD);
DWORD WINAPI GetFileVersionInfoSizeW(LPCWSTR,PDWORD);
BOOL WINAPI GetFileVersionInfoA(LPCSTR,DWORD,DWORD,PVOID);
BOOL WINAPI GetFileVersionInfoW(LPCWSTR,DWORD,DWORD,PVOID);
DWORD WINAPI VerLanguageNameA(DWORD,LPSTR,DWORD);
DWORD WINAPI VerLanguageNameW(DWORD,LPWSTR,DWORD);
BOOL WINAPI VerQueryValueA(const LPVOID,LPCSTR,LPVOID*,PUINT);
BOOL WINAPI VerQueryValueW(const LPVOID,LPCWSTR,LPVOID*,PUINT);
#ifdef UNICODE
#define VerFindFile VerFindFileW
#define VerQueryValue VerQueryValueW
#define VerInstallFile VerInstallFileW
#define GetFileVersionInfoSize GetFileVersionInfoSizeW
#define GetFileVersionInfo GetFileVersionInfoW
#define VerLanguageName VerLanguageNameW
#define VerQueryValue VerQueryValueW
#else
#define VerQueryValue VerQueryValueA
#define VerFindFile VerFindFileA
#define VerInstallFile VerInstallFileA
#define GetFileVersionInfoSize GetFileVersionInfoSizeA
#define GetFileVersionInfo GetFileVersionInfoA
#define VerLanguageName VerLanguageNameA
#define VerQueryValue VerQueryValueA
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on   Open Solaris
  2010-02-10 11:17   ` Tony Theodore
@ 2010-02-12  6:16     ` Tony Theodore
  2010-02-14  3:27     ` Dave Korn
  1 sibling, 0 replies; 11+ messages in thread
From: Tony Theodore @ 2010-02-12  6:16 UTC (permalink / raw)
  To: Nick Clifton; +Cc: binutils

>> I *think* that you can do this by defining the macro CP_ACP to the codepage
>> that you want.  (See the binutils/winduni.h source file). Either that or you
>> could edit winduni.h directly...
>
> Ok, I'll give that a try. Specifying the default 0 via the -c option
> also segfaults, so it seems this should work.

That does indeed work, thanks for the tip.

After reading http://sourceware.org/binutils/docs-2.20/binutils/Reporting-Bugs.html,
I think I'll try to prepare a bug report.

Cheers,

Tony

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on    Open Solaris
  2010-02-10 11:17   ` Tony Theodore
  2010-02-12  6:16     ` Tony Theodore
@ 2010-02-14  3:27     ` Dave Korn
  2010-02-14  3:36       ` Dave Korn
  1 sibling, 1 reply; 11+ messages in thread
From: Dave Korn @ 2010-02-14  3:27 UTC (permalink / raw)
  To: Tony Theodore; +Cc: Nick Clifton, binutils

On 10/02/2010 11:17, Tony Theodore wrote:

> Program received signal SIGSEGV, Segmentation fault.
> 0xcea46832 in iconv () from /lib/libc.so.1
> #0  0xcea46832 in iconv () from /lib/libc.so.1
> #1  0x08071dbd in iconv_onechar (cd=0xffffffff, s=0x81053d0 "FileDescription",
>     d=0x8046940 "\022", d_len=32, n_s=0xffffffff, n_d=0xffffffff)
>     at winduni.c:633
> #2  0x08071fc3 in wind_MultiByteToWideChar (cp=4294967295,
>     mb=0x81053d0 "FileDescription", u=0x0, u_len=0) at winduni.c:694
> #3  0x08072052 in unicode_from_codepage (length=0x0, u=0x81053d0,
>     src=0x81053d0 "FileDescription", cp=0) at winduni.c:584
> #4  0x080720ae in unicode_from_ascii (length=0x0, unicode=0x8046a28,
>     ascii=0x81053d0 "FileDescription") at winduni.c:194
> #5  0x0806e74f in yyparse () at rcparse.y:1703
> #6  0x08064c2e in read_rc_file (filename=0x8047ad7 "version.rc",
>     preprocessor=0x80e002c "gcc -E -xc -DRC_INVOKED",
>     preprocargs=0x80dfd80 "", language=1033, use_temp_file=0) at resrc.c:562
> #7  0x08063aee in main (argc=3, argv=0x8047970) at windres.c:1025

  I've reproduced this on osol0906jeos in a VM.  What happens is that here:

> static rc_uint_type
> wind_MultiByteToWideChar (rc_uint_type cp, const char *mb,
> 			  unichar *u, rc_uint_type u_len)
> {
>   rc_uint_type ret = 0;
> 
> #if defined (_WIN32) || defined (__CYGWIN__)
   [ ... elided ... ]
> #elif defined (HAVE_ICONV)
>   int first = 1;
>   char tmp[32];
>   char *p_tmp;
>   const char *iconv_name = wind_iconv_cp (cp);
> 
>   if (!mb || !iconv_name)
>     return 0;
>   iconv_t cd = iconv_open ("UTF-16", iconv_name);

... this call to iconv_open fails (iconv_name is "MS-ANSI", returning
(iconv_t)-1 ...

>   while (1)
>     {
>       int iret;
>       const char *n_mb = "";
>       char *n_tmp = "";
> 
>       p_tmp = tmp;
>       iret = iconv_onechar (cd, (ICONV_CONST char *) mb, p_tmp, 32, & n_mb, & n_tmp);

... that we promptly go and use as if it were valid.  Hmm, that's obviously
not good.  Aborting with a "invalid code page" error of some kind is one thing
we could do.  But the other thing I'm wondering is if MS-ANSI isn't just a
slightly non-standard name for CP1252, so maybe we could change the default to
use that one (or perhaps attempt it as a secondary fallback).  I'm not very
familiar with iconv stuff, so I'll have to do some rtfming to make sure I've
got the right end of the stick, but one reference I found(*) suggests that my
be the case.

    cheers,
      DaveK
-- 
(*) - http://www.firstobject.com/character-set-name-alias-code-page.htm

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on  Open Solaris
  2010-02-14  3:27     ` Dave Korn
@ 2010-02-14  3:36       ` Dave Korn
  2010-02-14  5:52         ` Tony Theodore
  2010-02-15 10:16         ` Nick Clifton
  0 siblings, 2 replies; 11+ messages in thread
From: Dave Korn @ 2010-02-14  3:36 UTC (permalink / raw)
  To: Dave Korn; +Cc: Tony Theodore, Nick Clifton, binutils

[-- Attachment #1: Type: text/plain, Size: 332 bytes --]

On 14/02/2010 03:44, Dave Korn wrote:

> we could do.  But the other thing I'm wondering is if MS-ANSI isn't just a
> slightly non-standard name for CP1252, so maybe we could change the default to
> use that one 

  Tony, the attached patch fixes the crash on my osol VM, would you like to
give it a test?

    cheers,
      DaveK


[-- Attachment #2: solaris-windres-cp.diff --]
[-- Type: text/x-c, Size: 553 bytes --]

? binutils/oops.diff
Index: bfd/configure.host
===================================================================
RCS file: /cvs/src/src/bfd/configure.host,v
retrieving revision 1.17
diff -p -u -r1.17 configure.host
--- bfd/configure.host	30 Dec 2005 22:25:57 -0000	1.17
+++ bfd/configure.host	14 Feb 2010 03:34:14 -0000
@@ -56,6 +56,8 @@ mips*-*-riscos*)	HDEFINES="-G 4" ;;
 
 m68*-hp-hpux*)		HDEFINES=-DHOST_HP300HPUX ;;
 
+*-*-solaris2.11)	HDEFINES=-DCP_ACP=1 ;;
+
 *-*-windows*)
 			HOST_64BIT_TYPE=__int64
 			HOST_U_64BIT_TYPE="unsigned __int64"

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on   Open Solaris
  2010-02-14  3:36       ` Dave Korn
@ 2010-02-14  5:52         ` Tony Theodore
  2010-02-15  0:41           ` Dave Korn
  2010-02-15 10:16         ` Nick Clifton
  1 sibling, 1 reply; 11+ messages in thread
From: Tony Theodore @ 2010-02-14  5:52 UTC (permalink / raw)
  To: Dave Korn; +Cc: Nick Clifton, binutils

On 14 February 2010 14:54, Dave Korn <dave.korn.cygwin@googlemail.com> wrote:
> On 14/02/2010 03:44, Dave Korn wrote:
>
>> we could do.  But the other thing I'm wondering is if MS-ANSI isn't just a
>> slightly non-standard name for CP1252, so maybe we could change the default to
>> use that one
>
>  Tony, the attached patch fixes the crash on my osol VM, would you like to
> give it a test?

Thanks Dave, that seems to work (though it took me a while to find the
--enable-maintainer-mode). The segfault no longer occurs with the
default, and specifying -c 0 causes it to happen again.

I don't know a great deal about codepages, but it does seems that
Microsoft refers to the 1250-1258 range as ANSI to distinguish them
from Unicode.

Cheers,

Tony

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on  Open Solaris
  2010-02-14  5:52         ` Tony Theodore
@ 2010-02-15  0:41           ` Dave Korn
  0 siblings, 0 replies; 11+ messages in thread
From: Dave Korn @ 2010-02-15  0:41 UTC (permalink / raw)
  To: Tony Theodore; +Cc: Dave Korn, Nick Clifton, binutils

On 14/02/2010 05:52, Tony Theodore wrote:
> On 14 February 2010 14:54, Dave Korn wrote:
>> On 14/02/2010 03:44, Dave Korn wrote:
>> 
>>> we could do.  But the other thing I'm wondering is if MS-ANSI isn't
>>> just a slightly non-standard name for CP1252, so maybe we could change
>>> the default to use that one
>> Tony, the attached patch fixes the crash on my osol VM, would you like to
>>  give it a test?
> 
> Thanks Dave, that seems to work (though it took me a while to find the 
> --enable-maintainer-mode). The segfault no longer occurs with the default,
> and specifying -c 0 causes it to happen again.

  BTW, you might want to report this upstream as an opensolaris libc bug,
since iconv() should surely return EINVAL when passed (iconv_t)-1 as an input
argument, rather than throw a SEGV.

> I don't know a great deal about codepages, but it does seems that Microsoft
> refers to the 1250-1258 range as ANSI to distinguish them from Unicode.

  I'm fairly confident now that MS-ANSI really is just an alias for WINDOWS-1252.

    cheers,
      DaveK

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on  Open Solaris
  2010-02-14  3:36       ` Dave Korn
  2010-02-14  5:52         ` Tony Theodore
@ 2010-02-15 10:16         ` Nick Clifton
  2010-02-15 19:28           ` Dave Korn
  1 sibling, 1 reply; 11+ messages in thread
From: Nick Clifton @ 2010-02-15 10:16 UTC (permalink / raw)
  To: Dave Korn; +Cc: Tony Theodore, binutils

Hi Dave,

>    Tony, the attached patch fixes the crash on my osol VM, would you like to
> give it a test?

This patch is approved for the mainline, although I would like to see a 
comment describing why it is necessary to define CP_ACP, and possibly 
referring the reader back to the PR.

Cheers
   Nick


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on  Open Solaris
  2010-02-15 10:16         ` Nick Clifton
@ 2010-02-15 19:28           ` Dave Korn
  2010-02-16  8:11             ` Tony Theodore
  0 siblings, 1 reply; 11+ messages in thread
From: Dave Korn @ 2010-02-15 19:28 UTC (permalink / raw)
  To: Nick Clifton; +Cc: Dave Korn, Tony Theodore, binutils

[-- Attachment #1: Type: text/plain, Size: 456 bytes --]

On 15/02/2010 10:15, Nick Clifton wrote:
> Hi Dave,
> 
>> Tony, the attached patch fixes the crash on my osol VM, would you like to
>>  give it a test?
> 
> This patch is approved for the mainline, although I would like to see a 
> comment describing why it is necessary to define CP_ACP, and possibly 
> referring the reader back to the PR.

  Applied with a comment like so and changelog as posted elswhere separately.
 Thanks!

    cheers,
      DaveK


[-- Attachment #2: pr11280-applied.diff --]
[-- Type: text/x-c, Size: 851 bytes --]

Index: bfd/configure.host
===================================================================
RCS file: /cvs/src/src/bfd/configure.host,v
retrieving revision 1.17
diff -p -u -r1.17 configure.host
--- bfd/configure.host	30 Dec 2005 22:25:57 -0000	1.17
+++ bfd/configure.host	15 Feb 2010 19:23:30 -0000
@@ -56,6 +56,12 @@ mips*-*-riscos*)	HDEFINES="-G 4" ;;
 
 m68*-hp-hpux*)		HDEFINES=-DHOST_HP300HPUX ;;
 
+# Some Solaris systems (osol0906 at least) have a libc that doesn't recognise
+# the "MS-ANSI" code page name, so we define an override for CP_ACP (sets the
+# default code page used by windres/windmc when not specified by a commandline
+# option) to select the "WINDOWS-1252" name instead.  See PR11280 for details.
+*-*-solaris2.11)	HDEFINES=-DCP_ACP=1 ;;
+
 *-*-windows*)
 			HOST_64BIT_TYPE=__int64
 			HOST_U_64BIT_TYPE="unsigned __int64"

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Binutils 2.20 - Windres problems building pthreads/libiconv on   Open Solaris
  2010-02-15 19:28           ` Dave Korn
@ 2010-02-16  8:11             ` Tony Theodore
  0 siblings, 0 replies; 11+ messages in thread
From: Tony Theodore @ 2010-02-16  8:11 UTC (permalink / raw)
  To: Dave Korn, Nick Clifton; +Cc: binutils

On 16 February 2010 06:46, Dave Korn <dave.korn.cygwin@googlemail.com> wrote:
> On 15/02/2010 10:15, Nick Clifton wrote:
>> Hi Dave,
>>
>>> Tony, the attached patch fixes the crash on my osol VM, would you like to
>>>  give it a test?
>>
>> This patch is approved for the mainline, although I would like to see a
>> comment describing why it is necessary to define CP_ACP, and possibly
>> referring the reader back to the PR.
>
>  Applied with a comment like so and changelog as posted elswhere separately.
>  Thanks!
>
>    cheers,
>      DaveK

Thank you both again for all your help with this, it's much appreciated.

I'll start putting together an upstream bug report - though most of
this is over my head, it's good to learn.

Cheers,

Tony

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2010-02-16  8:11 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-07  3:51 Binutils 2.20 - Windres problems building pthreads/libiconv on Open Solaris Tony Theodore
2010-02-09 10:57 ` Nick Clifton
2010-02-10 11:17   ` Tony Theodore
2010-02-12  6:16     ` Tony Theodore
2010-02-14  3:27     ` Dave Korn
2010-02-14  3:36       ` Dave Korn
2010-02-14  5:52         ` Tony Theodore
2010-02-15  0:41           ` Dave Korn
2010-02-15 10:16         ` Nick Clifton
2010-02-15 19:28           ` Dave Korn
2010-02-16  8:11             ` Tony Theodore

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).