Differences From Artifact [6d8493f63f]:
- File
src/platform/windows/thread.m
— part of check-in
[e16590dcb7]
at
2020-06-14 15:30:53
on branch trunk
— Make threads work on Windows 98
Windows 98 does not like the pointer to a DWORD to store the thread ID
being NULL. (user: js, size: 2299) [annotate] [blame] [check-ins using]
To Artifact [ec067e732d]:
- File
src/platform/windows/thread.m
— part of check-in
[e342aa8358]
at
2020-06-14 15:50:47
on branch trunk
— Add a function wrapper for threads on Windows
This is necessary because CreateThread() expects the function to be
stdcall, while the one we get passed is cdecl. (user: js, size: 2723) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include <errno.h> #import "thread.h" #import "macros.h" #include <windows.h> bool of_thread_attr_init(of_thread_attr_t *attr) { attr->priority = 0; attr->stackSize = 0; return true; } bool of_thread_new(of_thread_t *thread, const char *name, void (*function)(id), id object, const of_thread_attr_t *attr) { DWORD threadID; *thread = CreateThread(NULL, (attr != NULL ? attr->stackSize : 0), | > > > > > > > > > > > > > > > > > > > > > > > | > > | | | | > > > > | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #include <errno.h> #import "thread.h" #import "macros.h" #include <windows.h> struct thread_context { void (*function)(id); id object; }; static WINAPI void functionWrapper(struct thread_context *context) { context->function(context->object); free(context); } bool of_thread_attr_init(of_thread_attr_t *attr) { attr->priority = 0; attr->stackSize = 0; return true; } bool of_thread_new(of_thread_t *thread, const char *name, void (*function)(id), id object, const of_thread_attr_t *attr) { struct thread_context *context; DWORD threadID; if ((context = malloc(sizeof(*context))) == NULL) { errno = ENOMEM; return false; } context->function = function; context->object = object; *thread = CreateThread(NULL, (attr != NULL ? attr->stackSize : 0), (LPTHREAD_START_ROUTINE)functionWrapper, context, 0, &threadID); if (thread == NULL) { int errNo; switch (GetLastError()) { case ERROR_NOT_ENOUGH_MEMORY: errNo = ENOMEM; break; case ERROR_ACCESS_DENIED: errNo = EACCES; break; default: OF_ENSURE(0); } free(context); errno = errNo; return false; } if (attr != NULL && attr->priority != 0) { DWORD priority; if (attr->priority < -1 || attr->priority > 1) { errno = EINVAL; |
︙ | ︙ |