Overview
| Comment: | Add a function wrapper for threads on Windows
This is necessary because CreateThread() expects the function to be |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
e342aa83588372501bb18ec837ece99f |
| User & Date: | js on 2020-06-14 15:50:47 |
| Other Links: | manifest | tags |
Context
|
2020-06-14
| ||
| 16:07 | Check thread attributes before spawning the thread (check-in: 164475afdb user: js tags: trunk) | |
| 15:50 | Add a function wrapper for threads on Windows (check-in: e342aa8358 user: js tags: trunk) | |
| 15:32 | Fix releasing semaphore stored in free'd memory (check-in: 903b3326e2 user: js tags: trunk) | |
Changes
Modified src/platform/windows/thread.m from [6d8493f63f] to [ec067e732d].
| ︙ | ︙ | |||
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;
|
| ︙ | ︙ |