mirror of
https://github.com/moparisthebest/curl
synced 2024-10-31 15:45:12 -04:00
Constantine Sapuntzakis provided initial thread abstraction layer
This commit is contained in:
parent
340ab2f87f
commit
c054b8bfa7
@ -11,7 +11,7 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
|
|||||||
inet_ntop.c parsedate.c select.c gtls.c sslgen.c tftp.c splay.c \
|
inet_ntop.c parsedate.c select.c gtls.c sslgen.c tftp.c splay.c \
|
||||||
strdup.c socks.c ssh.c nss.c qssl.c rawstr.c curl_addrinfo.c \
|
strdup.c socks.c ssh.c nss.c qssl.c rawstr.c curl_addrinfo.c \
|
||||||
socks_gssapi.c socks_sspi.c curl_sspi.c slist.c nonblock.c \
|
socks_gssapi.c socks_sspi.c curl_sspi.c slist.c nonblock.c \
|
||||||
curl_memrchr.c imap.c pop3.c smtp.c pingpong.c rtsp.c
|
curl_memrchr.c imap.c pop3.c smtp.c pingpong.c rtsp.c curl_threads.c
|
||||||
|
|
||||||
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \
|
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \
|
||||||
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
|
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
|
||||||
@ -23,4 +23,4 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \
|
|||||||
transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h gtls.h \
|
transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h gtls.h \
|
||||||
tftp.h sockaddr.h splay.h strdup.h setup_once.h socks.h ssh.h nssg.h \
|
tftp.h sockaddr.h splay.h strdup.h setup_once.h socks.h ssh.h nssg.h \
|
||||||
curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h \
|
curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h \
|
||||||
curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h
|
curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h curl_threads.h
|
||||||
|
124
lib/curl_threads.c
Normal file
124
lib/curl_threads.c
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
***************************************************************************/
|
||||||
|
#include "setup.h"
|
||||||
|
|
||||||
|
#if defined(USE_THREADS_POSIX)
|
||||||
|
# ifdef HAVE_PTHREAD_H
|
||||||
|
# include <pthread.h>
|
||||||
|
# endif
|
||||||
|
#elif defined(USE_THREADS_WIN32)
|
||||||
|
# ifdef HAVE_PROCESS_H
|
||||||
|
# include <process.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "curl_threads.h"
|
||||||
|
|
||||||
|
#define _MPRINTF_REPLACE /* use our functions only */
|
||||||
|
#include <curl/mprintf.h>
|
||||||
|
|
||||||
|
#include "curl_memory.h"
|
||||||
|
/* The last #include file should be: */
|
||||||
|
#include "memdebug.h"
|
||||||
|
|
||||||
|
#if defined(USE_THREADS_POSIX)
|
||||||
|
|
||||||
|
struct curl_actual_call {
|
||||||
|
unsigned int (*func)(void *);
|
||||||
|
void *arg;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void *curl_thread_create_thunk(void *arg)
|
||||||
|
{
|
||||||
|
struct curl_actual_call * ac = arg;
|
||||||
|
unsigned int (*func)(void *) = ac->func;
|
||||||
|
void *real_arg = ac->arg;
|
||||||
|
|
||||||
|
free(ac);
|
||||||
|
|
||||||
|
(*func)(real_arg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_thread_t Curl_thread_create(unsigned int (*func) (void*), void *arg)
|
||||||
|
{
|
||||||
|
curl_thread_t t;
|
||||||
|
struct curl_actual_call *ac = malloc(sizeof(struct curl_actual_call));
|
||||||
|
if(!ac)
|
||||||
|
return curl_thread_t_null;
|
||||||
|
|
||||||
|
ac->func = func;
|
||||||
|
ac->arg = arg;
|
||||||
|
|
||||||
|
if(pthread_create(&t, NULL, curl_thread_create_thunk, ac) != 0) {
|
||||||
|
free(ac);
|
||||||
|
return curl_thread_t_null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Curl_thread_destroy(curl_thread_t hnd)
|
||||||
|
{
|
||||||
|
if(hnd != curl_thread_t_null)
|
||||||
|
pthread_detach(hnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Curl_thread_join(curl_thread_t *hnd)
|
||||||
|
{
|
||||||
|
int ret = (pthread_join(*hnd, NULL) == 0);
|
||||||
|
|
||||||
|
*hnd = curl_thread_t_null;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(USE_THREADS_WIN32)
|
||||||
|
|
||||||
|
curl_thread_t Curl_thread_create(unsigned int (CURL_STDCALL *func) (void*), void *arg)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
return CreateThread(NULL, 0, func, arg, 0, NULL);
|
||||||
|
#else
|
||||||
|
return (curl_thread_t)_beginthreadex(NULL, 0, func, arg, 0, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Curl_thread_destroy(curl_thread_t hnd)
|
||||||
|
{
|
||||||
|
CloseHandle(hnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Curl_thread_join(curl_thread_t *hnd)
|
||||||
|
{
|
||||||
|
int ret = (WaitForSingleObject(*hnd, INFINITE) == WAIT_OBJECT_0);
|
||||||
|
|
||||||
|
Curl_thread_destroy(*hnd);
|
||||||
|
|
||||||
|
*hnd = curl_thread_t_null;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* USE_THREADS_* */
|
58
lib/curl_threads.h
Normal file
58
lib/curl_threads.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#ifndef HEADER_CURL_THREADS_H
|
||||||
|
#define HEADER_CURL_THREADS_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
***************************************************************************/
|
||||||
|
#include "setup.h"
|
||||||
|
|
||||||
|
#if defined(USE_THREADS_POSIX)
|
||||||
|
# define CURL_STDCALL
|
||||||
|
# define curl_mutex_t pthread_mutex_t
|
||||||
|
# define curl_thread_t pthread_t
|
||||||
|
# define curl_thread_t_null (pthread_t)0
|
||||||
|
# define Curl_mutex_init(m) pthread_mutex_init(m, NULL)
|
||||||
|
# define Curl_mutex_acquire(m) pthread_mutex_lock(m)
|
||||||
|
# define Curl_mutex_release(m) pthread_mutex_unlock(m)
|
||||||
|
# define Curl_mutex_destroy(m) pthread_mutex_destroy(m)
|
||||||
|
#elif defined(USE_THREADS_WIN32)
|
||||||
|
# define CURL_STDCALL __stdcall
|
||||||
|
# define curl_mutex_t CRITICAL_SECTION
|
||||||
|
# define curl_thread_t HANDLE
|
||||||
|
# define curl_thread_t_null (HANDLE)0
|
||||||
|
# define Curl_mutex_init(m) InitializeCriticalSection(m)
|
||||||
|
# define Curl_mutex_acquire(m) EnterCriticalSection(m)
|
||||||
|
# define Curl_mutex_release(m) LeaveCriticalSection(m)
|
||||||
|
# define Curl_mutex_destroy(m) DeleteCriticalSection(m)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
|
||||||
|
|
||||||
|
curl_thread_t Curl_thread_create(unsigned int (CURL_STDCALL *func) (void*),
|
||||||
|
void *arg);
|
||||||
|
|
||||||
|
void Curl_thread_destroy(curl_thread_t hnd);
|
||||||
|
|
||||||
|
int Curl_thread_join(curl_thread_t *hnd);
|
||||||
|
|
||||||
|
#endif /* USE_THREADS_POSIX || USE_THREADS_WIN32 */
|
||||||
|
|
||||||
|
#endif /* HEADER_CURL_THREADS_H */
|
Loading…
Reference in New Issue
Block a user