equal
deleted
inserted
replaced
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(); |