contrib/python-zstandard/zstd/common/threading.c
changeset 37495 b1fb341d8a61
parent 30895 c32454d69b85
child 42937 69de49c4e39c
equal deleted inserted replaced
37494:1ce7a55b09d1 37495:b1fb341d8a61
     1 
       
     2 /**
     1 /**
     3  * Copyright (c) 2016 Tino Reichardt
     2  * Copyright (c) 2016 Tino Reichardt
     4  * All rights reserved.
     3  * All rights reserved.
     5  *
     4  *
     6  * This source code is licensed under the BSD-style license found in the
     5  * This source code is licensed under both the BSD-style license (found in the
     7  * LICENSE file in the root directory of this source tree. An additional grant
     6  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
     8  * of patent rights can be found in the PATENTS file in the same directory.
     7  * in the COPYING file in the root directory of this source tree).
     9  *
     8  *
    10  * You can contact the author at:
     9  * You can contact the author at:
    11  * - zstdmt source repository: https://github.com/mcmilk/zstdmt
    10  * - zstdmt source repository: https://github.com/mcmilk/zstdmt
    12  */
    11  */
    13 
    12 
    14 /**
    13 /**
    15  * This file will hold wrapper for systems, which do not support pthreads
    14  * This file will hold wrapper for systems, which do not support pthreads
    16  */
    15  */
    17 
    16 
    18 /* ======   Compiler specifics   ====== */
    17 /* create fake symbol to avoid empty trnaslation unit warning */
    19 #if defined(_MSC_VER)
    18 int g_ZSTD_threading_useles_symbol;
    20 #  pragma warning(disable : 4206)        /* disable: C4206: translation unit is empty (when ZSTD_MULTITHREAD is not defined) */
       
    21 #endif
       
    22 
       
    23 
    19 
    24 #if defined(ZSTD_MULTITHREAD) && defined(_WIN32)
    20 #if defined(ZSTD_MULTITHREAD) && defined(_WIN32)
    25 
    21 
    26 /**
    22 /**
    27  * Windows minimalist Pthread Wrapper, based on :
    23  * Windows minimalist Pthread Wrapper, based on :
    37 
    33 
    38 /* ===  Implementation  === */
    34 /* ===  Implementation  === */
    39 
    35 
    40 static unsigned __stdcall worker(void *arg)
    36 static unsigned __stdcall worker(void *arg)
    41 {
    37 {
    42     pthread_t* const thread = (pthread_t*) arg;
    38     ZSTD_pthread_t* const thread = (ZSTD_pthread_t*) arg;
    43     thread->arg = thread->start_routine(thread->arg);
    39     thread->arg = thread->start_routine(thread->arg);
    44     return 0;
    40     return 0;
    45 }
    41 }
    46 
    42 
    47 int pthread_create(pthread_t* thread, const void* unused,
    43 int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused,
    48             void* (*start_routine) (void*), void* arg)
    44             void* (*start_routine) (void*), void* arg)
    49 {
    45 {
    50     (void)unused;
    46     (void)unused;
    51     thread->arg = arg;
    47     thread->arg = arg;
    52     thread->start_routine = start_routine;
    48     thread->start_routine = start_routine;
    56         return errno;
    52         return errno;
    57     else
    53     else
    58         return 0;
    54         return 0;
    59 }
    55 }
    60 
    56 
    61 int _pthread_join(pthread_t * thread, void **value_ptr)
    57 int ZSTD_pthread_join(ZSTD_pthread_t thread, void **value_ptr)
    62 {
    58 {
    63     DWORD result;
    59     DWORD result;
    64 
    60 
    65     if (!thread->handle) return 0;
    61     if (!thread.handle) return 0;
    66 
    62 
    67     result = WaitForSingleObject(thread->handle, INFINITE);
    63     result = WaitForSingleObject(thread.handle, INFINITE);
    68     switch (result) {
    64     switch (result) {
    69     case WAIT_OBJECT_0:
    65     case WAIT_OBJECT_0:
    70         if (value_ptr) *value_ptr = thread->arg;
    66         if (value_ptr) *value_ptr = thread.arg;
    71         return 0;
    67         return 0;
    72     case WAIT_ABANDONED:
    68     case WAIT_ABANDONED:
    73         return EINVAL;
    69         return EINVAL;
    74     default:
    70     default:
    75         return GetLastError();
    71         return GetLastError();