mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
1.8 KiB
82 lines
1.8 KiB
/** |
|
* Copyright (c) 2016 Tino Reichardt |
|
* All rights reserved. |
|
* |
|
* This source code is licensed under both the BSD-style license (found in the |
|
* LICENSE file in the root directory of this source tree) and the GPLv2 (found |
|
* in the COPYING file in the root directory of this source tree). |
|
* |
|
* You can contact the author at: |
|
* - zstdmt source repository: https://github.com/mcmilk/zstdmt |
|
*/ |
|
|
|
/** |
|
* This file will hold wrapper for systems, which do not support pthreads |
|
*/ |
|
|
|
|
|
/* === Build Macro === */ |
|
|
|
#ifndef POOL_MT // can be defined on command line |
|
# define POOL_MT 1 |
|
#endif |
|
|
|
|
|
/* create fake symbol to avoid empty translation unit warning */ |
|
int g_ZSTD_threading_useles_symbol; |
|
|
|
#if POOL_MT && defined(_WIN32) |
|
|
|
/** |
|
* Windows minimalist Pthread Wrapper |
|
*/ |
|
|
|
|
|
/* === Dependencies === */ |
|
#include <process.h> |
|
#include <errno.h> |
|
#include "threading.h" |
|
|
|
|
|
/* === Implementation === */ |
|
|
|
static unsigned __stdcall worker(void *arg) |
|
{ |
|
ZSTD_pthread_t* const thread = (ZSTD_pthread_t*) arg; |
|
thread->arg = thread->start_routine(thread->arg); |
|
return 0; |
|
} |
|
|
|
int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, |
|
void* (*start_routine) (void*), void* arg) |
|
{ |
|
(void)unused; |
|
thread->arg = arg; |
|
thread->start_routine = start_routine; |
|
thread->handle = (HANDLE) _beginthreadex(NULL, 0, worker, thread, 0, NULL); |
|
|
|
if (!thread->handle) |
|
return errno; |
|
else |
|
return 0; |
|
} |
|
|
|
int ZSTD_pthread_join(ZSTD_pthread_t thread, void **value_ptr) |
|
{ |
|
DWORD result; |
|
|
|
if (!thread.handle) return 0; |
|
|
|
result = WaitForSingleObject(thread.handle, INFINITE); |
|
switch (result) { |
|
case WAIT_OBJECT_0: |
|
if (value_ptr) *value_ptr = thread.arg; |
|
return 0; |
|
case WAIT_ABANDONED: |
|
return EINVAL; |
|
default: |
|
return (int)GetLastError(); |
|
} |
|
} |
|
|
|
#endif /* POOL_MT */
|
|
|