Mosh スレッド Windows 対応

ビルドは通ったが GC のエラーが出る。


Boehm GC のドキュメントを読もう。Fatal error in gc. Collecting from unknown thread.

追記

threads should be created with GC_CreateThread or GC_beginthreadex

追記2

#define GC_WIN32_THREADS 1 としてビルドすると何やらよく分からないエラーになった。
ML で似た症状を探してみよう。

:\Program Files\Microsoft Visual Studio 9.0\VC\include\process.h(54) :
error C2059: 構文エラー : '{'
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\process.h(54)
: error C2143: 構文エラー : ';''{' の前にありません。
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\process.h(54)
: error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\process.h(54)
: error C2059: 構文エラー : '['
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\process.h(59)
: warning C4985: 'GC_beginthreadex': 前の宣言に属性が存在しません。
       c:\mosh\gc-7.1\include\gc.h(1048) : 'GC_beginthreadex' の宣言を確認してください。
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\process.h(60)
: warning C4985: 'GC_endthreadex': 前の宣言に属性が存在しません。
       c:\mosh\gc-7.1\include\gc.h(1053) : 'GC_endthreadex' の宣言を確認してください。

process.h

#ifdef  _MT
_CRTIMP uintptr_t __cdecl _beginthread (_In_ void (__cdecl *
_StartAddress) (void *),
       _In_ unsigned _StackSize, _In_opt_ void * _ArgList);
_CRTIMP void __cdecl _endthread(void);
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void * _Security,
_In_ unsigned _StackSize,
       _In_ unsigned (__stdcall * _StartAddress) (void *), _In_opt_
void * _ArgList,
       _In_ unsigned _InitFlag, _In_opt_ unsigned * _ThrdAddr);
_CRTIMP void __cdecl _endthreadex(_In_ unsigned _Retval);


gc.h

#if (defined(__DMC__) || defined(_MSC_VER)) && defined(GC_DLL)
# ifdef GC_BUILD
#   define GC_API extern __declspec(dllexport)
# else
#   define GC_API __declspec(dllimport)
# endif
#endif

#if defined(__WATCOMC__) && defined(GC_DLL)
# ifdef GC_BUILD
#   define GC_API extern __declspec(dllexport)
# else
#   define GC_API extern __declspec(dllimport)
# endif
#endif

#ifndef GC_API
#define GC_API extern
#endif

   GC_API uintptr_t GC_beginthreadex(
     void *security, unsigned stack_size,
     unsigned ( __stdcall *start_address )( void * ),
     void *arglist, unsigned initflag, unsigned *thrdaddr);

   GC_API void GC_endthreadex(unsigned retval);

追記3

process.h の include を止めたら直った。
しかし test\concurrent.scm が通らない。