Remove last platform specific code form thread.cpp
authorMarco Costalba <mcostalba@gmail.com>
Fri, 23 Mar 2012 12:12:26 +0000 (13:12 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 23 Mar 2012 18:28:20 +0000 (19:28 +0100)
A somewhat tricky function pointer cast allows us
to move the platform specifics to lock.h, the cast
is tricky because return type is not the same of the
casted function in Linux (for Windows return type is
a DWORD that is a long) but this should not be a
problem as long as the size is the same;

From: http://stackoverflow.com/questions/188839/function-pointer-cast-to-different-signature

"OpenSSL was only casting functions pointers to
other function types taking and returning the same
number of values of the same exact sizes, and this
(assuming you're not dealing with floating-point)
happens to be safe across all the platforms and
calling conventions I know of. However, anything
else is potentially unsafe."

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/lock.h
src/thread.cpp

index 1e71305ec1c7403bbcbebe538d50e6e135ddc9bc..85d32a5cbb0432753b500dd33e2f989f63ec8a35 100644 (file)
@@ -27,6 +27,7 @@
 typedef pthread_mutex_t Lock;
 typedef pthread_cond_t WaitCondition;
 typedef pthread_t ThreadHandle;
+typedef void*(*start_fn)(void*);
 
 #  define lock_init(x) pthread_mutex_init(&(x), NULL)
 #  define lock_grab(x) pthread_mutex_lock(&(x))
@@ -37,7 +38,7 @@ typedef pthread_t ThreadHandle;
 #  define cond_signal(x) pthread_cond_signal(&(x))
 #  define cond_wait(x,y) pthread_cond_wait(&(x),&(y))
 #  define cond_timedwait(x,y,z) pthread_cond_timedwait(&(x),&(y),z)
-#  define thread_create(x,f,id) !pthread_create(&(x),NULL,f,&(id))
+#  define thread_create(x,f,id) !pthread_create(&(x),NULL,(start_fn)f,&(id))
 #  define thread_join(x) pthread_join(x, NULL)
 
 #else
@@ -67,7 +68,7 @@ typedef HANDLE ThreadHandle;
 #  define cond_signal(x) SetEvent(x)
 #  define cond_wait(x,y) { lock_release(y); WaitForSingleObject(x, INFINITE); lock_grab(y); }
 #  define cond_timedwait(x,y,z) { lock_release(y); WaitForSingleObject(x,z); lock_grab(y); }
-#  define thread_create(x,f,id) (x = CreateThread(NULL,0,f,&(id),0,NULL), x != NULL)
+#  define thread_create(x,f,id) (x = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)f,&(id),0,NULL), x != NULL)
 #  define thread_join(x) { WaitForSingleObject(x, INFINITE); CloseHandle(x); }
 
 #endif
index 31c5961d2fc104f7af2d12afec86f7ee73f56ea2..5c23aa50373618f80a5f2b0a004cac5211548b90 100644 (file)
@@ -36,13 +36,7 @@ namespace { extern "C" {
  // and last thread are special. First one is the main search thread while the
  // last one mimics a timer, they run in main_loop() and timer_loop().
 
-#if defined(_WIN32) || defined(_WIN64)
-  DWORD WINAPI start_routine(LPVOID thread) {
-#else
-  void* start_routine(void* thread) {
-#endif
-
-    Thread* th = (Thread*)thread;
+  long start_routine(Thread* th) {
 
     if (th->threadID == 0)
         th->main_loop();
@@ -299,7 +293,7 @@ bool ThreadsManager::available_slave_exists(int master) const {
 template <bool Fake>
 Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta,
                             Value bestValue, Move* bestMove, Depth depth,
-                            Move threatMove, int moveCount, MovePicker *mp, int nodeType) {
+                            Move threatMove, int moveCount, MovePickermp, int nodeType) {
   assert(pos.pos_is_ok());
   assert(bestValue > -VALUE_INFINITE);
   assert(bestValue <= alpha);