(svn r2810) Threads may now return information when they terminate using a void*.

Also add the new files to the MSVC project files.
This commit is contained in:
tron 2005-08-05 11:53:48 +00:00
parent f315c95fa1
commit bd48d67c28
5 changed files with 64 additions and 17 deletions

View File

@ -402,6 +402,10 @@ SOURCE=.\texteff.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\thread.c
# End Source File
# Begin Source File
SOURCE=.\tile.c SOURCE=.\tile.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -650,6 +654,10 @@ SOURCE=.\strings.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\thread.h
# End Source File
# Begin Source File
SOURCE=.\tile.h SOURCE=.\tile.h
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -401,6 +401,9 @@
<File <File
RelativePath="texteff.c"> RelativePath="texteff.c">
</File> </File>
<File
RelativePath=".\thread.c">
</File>
<File <File
RelativePath=".\tile.c"> RelativePath=".\tile.c">
</File> </File>
@ -612,6 +615,9 @@
<File <File
RelativePath=".\string.h"> RelativePath=".\string.h">
</File> </File>
<File
RelativePath=".\thread.h">
</File>
<File <File
RelativePath=".\tile.h"> RelativePath=".\tile.h">
</File> </File>

View File

@ -1235,7 +1235,7 @@ static inline void SaveFileDone(void)
/** We have written the whole game into memory, _save_pool, now find /** We have written the whole game into memory, _save_pool, now find
* and appropiate compressor and start writing to file. * and appropiate compressor and start writing to file.
*/ */
static void SaveFileToDisk(void* arg) static void* SaveFileToDisk(void* arg)
{ {
const SaveLoadFormat *fmt = GetSavegameFormat(_savegame_format); const SaveLoadFormat *fmt = GetSavegameFormat(_savegame_format);
/* XXX - backup _sl.buf cause it is used internally by the writer /* XXX - backup _sl.buf cause it is used internally by the writer
@ -1258,7 +1258,7 @@ static void SaveFileToDisk(void* arg)
ShowErrorMessage(STR_4007_GAME_SAVE_FAILED, STR_NULL, 0, 0); ShowErrorMessage(STR_4007_GAME_SAVE_FAILED, STR_NULL, 0, 0);
SaveFileDone(); SaveFileDone();
return; return NULL;
} }
/* We have written our stuff to memory, now write it to file! */ /* We have written our stuff to memory, now write it to file! */
@ -1293,6 +1293,7 @@ static void SaveFileToDisk(void* arg)
fclose(_sl.fh); fclose(_sl.fh);
SaveFileDone(); SaveFileDone();
return NULL;
} }

View File

@ -6,7 +6,7 @@
#if defined(__AMIGA__) || defined(__MORPHOS__) #if defined(__AMIGA__) || defined(__MORPHOS__)
Thread* OTTDCreateThread(ThreadFunc function, void* arg) { return NULL; } Thread* OTTDCreateThread(ThreadFunc function, void* arg) { return NULL; }
void OTTDJoinThread(Thread*) {} void* OTTDJoinThread(Thread*) { return NULL; }
#elif defined(__OS2__) #elif defined(__OS2__)
@ -17,15 +17,26 @@ void OTTDJoinThread(Thread*) {}
struct Thread { struct Thread {
TID thread; TID thread;
ThradFunc func;
void* arg;
void* ret;
}; };
static void Proxy(void* arg)
{
Thread* t = arg;
t->ret = t->func(t->arg);
}
Thread* OTTDCreateThread(ThreadFunc function, void* arg) Thread* OTTDCreateThread(ThreadFunc function, void* arg)
{ {
Thread* t = malloc(sizeof(*t)); Thread* t = malloc(sizeof(*t));
if (t == NULL) return NULL; if (t == NULL) return NULL;
t->thread = _beginthread(function, NULL, 32768, arg); t->func = function;
t->arg = arg;
t->thread = _beginthread(Proxy, NULL, 32768, t);
if (t->thread != -1) { if (t->thread != -1) {
return t; return t;
} else { } else {
@ -34,12 +45,16 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg)
} }
} }
void OTTDJoinThread(Thread* t) void* OTTDJoinThread(Thread* t)
{ {
if (t == NULL) return; void* ret;
if (t == NULL) return NULL;
DosWaitThread(&t->thread, DCWW_WAIT); DosWaitThread(&t->thread, DCWW_WAIT);
ret = t->ret;
free(t); free(t);
return ret;
} }
@ -57,7 +72,7 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg)
if (t == NULL) return NULL; if (t == NULL) return NULL;
if (pthread_create(&t->thread, NULL, (void* (*)(void*))function, arg) == 0) { if (pthread_create(&t->thread, NULL, function, arg) == 0) {
return t; return t;
} else { } else {
free(t); free(t);
@ -65,12 +80,15 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg)
} }
} }
void OTTDJoinThread(Thread* t) void* OTTDJoinThread(Thread* t)
{ {
if (t == NULL) return; void* ret;
pthread_join(t->thread, NULL); if (t == NULL) return NULL;
pthread_join(t->thread, &ret);
free(t); free(t);
return ret;
} }
@ -80,8 +98,18 @@ void OTTDJoinThread(Thread* t)
struct Thread { struct Thread {
HANDLE thread; HANDLE thread;
ThradFunc func;
void* arg;
void* ret;
}; };
static DWORD WINAPI Proxy(LPVOID arg)
{
Thread* t = arg;
t->ret = t->func(t->arg);
return 0;
}
Thread* OTTDCreateThread(ThreadFunc function, void* arg) Thread* OTTDCreateThread(ThreadFunc function, void* arg)
{ {
Thread* t = malloc(sizeof(*t)); Thread* t = malloc(sizeof(*t));
@ -89,9 +117,9 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg)
if (t == NULL) return NULL; if (t == NULL) return NULL;
t->thread = CreateThread( t->func = function;
NULL, 0, (LPTHREAD_START_ROUTINE)function, arg, 0, &dwThreadId t->arg = arg;
); t->thread = CreateThread(NULL, 0, Proxy, arg, 0, &dwThreadId);
if (t->thread != NULL) { if (t->thread != NULL) {
return t; return t;
@ -101,12 +129,16 @@ Thread* OTTDCreateThread(ThreadFunc function, void* arg)
} }
} }
void OTTDJoinThread(Thread* t) void* OTTDJoinThread(Thread* t)
{ {
if (t == NULL) return; void* ret;
if (t == NULL) return NULL;
WaitForSingleObject(t->thread, INFINITE); WaitForSingleObject(t->thread, INFINITE);
CloseHandle(t->thread); CloseHandle(t->thread);
ret = t->ret;
free(t); free(t);
return ret;
} }
#endif #endif

View File

@ -11,9 +11,9 @@
typedef struct Thread Thread; typedef struct Thread Thread;
typedef void (*ThreadFunc)(void*); typedef void* (*ThreadFunc)(void*);
Thread* OTTDCreateThread(ThreadFunc, void*); Thread* OTTDCreateThread(ThreadFunc, void*);
void OTTDJoinThread(Thread*); void* OTTDJoinThread(Thread*);
#endif #endif