Annotation of embedaddon/curl/lib/curl_threads.c, revision 1.1

1.1     ! misho       1: /***************************************************************************
        !             2:  *                                  _   _ ____  _
        !             3:  *  Project                     ___| | | |  _ \| |
        !             4:  *                             / __| | | | |_) | |
        !             5:  *                            | (__| |_| |  _ <| |___
        !             6:  *                             \___|\___/|_| \_\_____|
        !             7:  *
        !             8:  * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
        !             9:  *
        !            10:  * This software is licensed as described in the file COPYING, which
        !            11:  * you should have received as part of this distribution. The terms
        !            12:  * are also available at https://curl.haxx.se/docs/copyright.html.
        !            13:  *
        !            14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
        !            15:  * copies of the Software, and permit persons to whom the Software is
        !            16:  * furnished to do so, under the terms of the COPYING file.
        !            17:  *
        !            18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
        !            19:  * KIND, either express or implied.
        !            20:  *
        !            21:  ***************************************************************************/
        !            22: 
        !            23: #include "curl_setup.h"
        !            24: 
        !            25: #include <curl/curl.h>
        !            26: 
        !            27: #if defined(USE_THREADS_POSIX)
        !            28: #  ifdef HAVE_PTHREAD_H
        !            29: #    include <pthread.h>
        !            30: #  endif
        !            31: #elif defined(USE_THREADS_WIN32)
        !            32: #  ifdef HAVE_PROCESS_H
        !            33: #    include <process.h>
        !            34: #  endif
        !            35: #endif
        !            36: 
        !            37: #include "curl_threads.h"
        !            38: #include "curl_memory.h"
        !            39: /* The last #include file should be: */
        !            40: #include "memdebug.h"
        !            41: 
        !            42: #if defined(USE_THREADS_POSIX)
        !            43: 
        !            44: struct curl_actual_call {
        !            45:   unsigned int (*func)(void *);
        !            46:   void *arg;
        !            47: };
        !            48: 
        !            49: static void *curl_thread_create_thunk(void *arg)
        !            50: {
        !            51:   struct curl_actual_call * ac = arg;
        !            52:   unsigned int (*func)(void *) = ac->func;
        !            53:   void *real_arg = ac->arg;
        !            54: 
        !            55:   free(ac);
        !            56: 
        !            57:   (*func)(real_arg);
        !            58: 
        !            59:   return 0;
        !            60: }
        !            61: 
        !            62: curl_thread_t Curl_thread_create(unsigned int (*func) (void *), void *arg)
        !            63: {
        !            64:   curl_thread_t t = malloc(sizeof(pthread_t));
        !            65:   struct curl_actual_call *ac = malloc(sizeof(struct curl_actual_call));
        !            66:   if(!(ac && t))
        !            67:     goto err;
        !            68: 
        !            69:   ac->func = func;
        !            70:   ac->arg = arg;
        !            71: 
        !            72:   if(pthread_create(t, NULL, curl_thread_create_thunk, ac) != 0)
        !            73:     goto err;
        !            74: 
        !            75:   return t;
        !            76: 
        !            77: err:
        !            78:   free(t);
        !            79:   free(ac);
        !            80:   return curl_thread_t_null;
        !            81: }
        !            82: 
        !            83: void Curl_thread_destroy(curl_thread_t hnd)
        !            84: {
        !            85:   if(hnd != curl_thread_t_null) {
        !            86:     pthread_detach(*hnd);
        !            87:     free(hnd);
        !            88:   }
        !            89: }
        !            90: 
        !            91: int Curl_thread_join(curl_thread_t *hnd)
        !            92: {
        !            93:   int ret = (pthread_join(**hnd, NULL) == 0);
        !            94: 
        !            95:   free(*hnd);
        !            96:   *hnd = curl_thread_t_null;
        !            97: 
        !            98:   return ret;
        !            99: }
        !           100: 
        !           101: #elif defined(USE_THREADS_WIN32)
        !           102: 
        !           103: /* !checksrc! disable SPACEBEFOREPAREN 1 */
        !           104: curl_thread_t Curl_thread_create(unsigned int (CURL_STDCALL *func) (void *),
        !           105:                                  void *arg)
        !           106: {
        !           107: #ifdef _WIN32_WCE
        !           108:   typedef HANDLE curl_win_thread_handle_t;
        !           109: #elif defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)
        !           110:   typedef unsigned long curl_win_thread_handle_t;
        !           111: #else
        !           112:   typedef uintptr_t curl_win_thread_handle_t;
        !           113: #endif
        !           114:   curl_thread_t t;
        !           115:   curl_win_thread_handle_t thread_handle;
        !           116: #ifdef _WIN32_WCE
        !           117:   thread_handle = CreateThread(NULL, 0, func, arg, 0, NULL);
        !           118: #else
        !           119:   thread_handle = _beginthreadex(NULL, 0, func, arg, 0, NULL);
        !           120: #endif
        !           121:   t = (curl_thread_t)thread_handle;
        !           122:   if((t == 0) || (t == LongToHandle(-1L))) {
        !           123: #ifdef _WIN32_WCE
        !           124:     DWORD gle = GetLastError();
        !           125:     errno = ((gle == ERROR_ACCESS_DENIED ||
        !           126:               gle == ERROR_NOT_ENOUGH_MEMORY) ?
        !           127:              EACCES : EINVAL);
        !           128: #endif
        !           129:     return curl_thread_t_null;
        !           130:   }
        !           131:   return t;
        !           132: }
        !           133: 
        !           134: void Curl_thread_destroy(curl_thread_t hnd)
        !           135: {
        !           136:   CloseHandle(hnd);
        !           137: }
        !           138: 
        !           139: int Curl_thread_join(curl_thread_t *hnd)
        !           140: {
        !           141: #if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || \
        !           142:     (_WIN32_WINNT < _WIN32_WINNT_VISTA)
        !           143:   int ret = (WaitForSingleObject(*hnd, INFINITE) == WAIT_OBJECT_0);
        !           144: #else
        !           145:   int ret = (WaitForSingleObjectEx(*hnd, INFINITE, FALSE) == WAIT_OBJECT_0);
        !           146: #endif
        !           147: 
        !           148:   Curl_thread_destroy(*hnd);
        !           149: 
        !           150:   *hnd = curl_thread_t_null;
        !           151: 
        !           152:   return ret;
        !           153: }
        !           154: 
        !           155: #endif /* USE_THREADS_* */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>