mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-17 21:25:40 +00:00
(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:
parent
f315c95fa1
commit
bd48d67c28
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
58
thread.c
58
thread.c
@ -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
|
||||||
|
4
thread.h
4
thread.h
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user