⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pthread.h

📁 “网络安全技术实践与代码详解”实例代码
💻 H
📖 第 1 页 / 共 3 页
字号:
/* This is an implementation of the threads API of POSIX 1003.1-2001.
 *
 * --------------------------------------------------------------------------
 *
 *      Pthreads-win32 - POSIX Threads Library for Win32
 *      Copyright(C) 1998 John E. Bossom
 *      Copyright(C) 1999,2003 Pthreads-win32 contributors
 * 
 *      Contact Email: rpj@callisto.canberra.edu.au
 * 
 *      The current list of contributors is contained
 *      in the file CONTRIBUTORS included with the source
 *      code distribution. The list can also be seen at the
 *      following World Wide Web location:
 *      http://sources.redhat.com/pthreads-win32/contributors.html
 * 
 *      This library is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU Lesser General Public
 *      License as published by the Free Software Foundation; either
 *      version 2 of the License, or (at your option) any later version.
 * 
 *      This library is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *      Lesser General Public License for more details.
 * 
 *      You should have received a copy of the GNU Lesser General Public
 *      License along with this library in the file COPYING.LIB;
 *      if not, write to the Free Software Foundation, Inc.,
 *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 */

#if !defined( PTHREAD_H )
#define PTHREAD_H

#undef PTW32_LEVEL

#if defined(_POSIX_SOURCE)
#define PTW32_LEVEL 0
/* Early POSIX */
#endif

#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
#undef PTW32_LEVEL
#define PTW32_LEVEL 1
/* Include 1b, 1c and 1d */
#endif

#if defined(INCLUDE_NP)
#undef PTW32_LEVEL
#define PTW32_LEVEL 2
/* Include Non-Portable extensions */
#endif

#define PTW32_LEVEL_MAX 3

#if !defined(PTW32_LEVEL)
#define PTW32_LEVEL PTW32_LEVEL_MAX
/* Include everything */
#endif

#ifdef _UWIN
#   define HAVE_STRUCT_TIMESPEC 1
#   define HAVE_SIGNAL_H	1
#   undef HAVE_CONFIG_H
#   pragma comment(lib, "pthread")
#endif

/*
 * -------------------------------------------------------------
 *
 *
 * Module: pthread.h
 *
 * Purpose:
 *	Provides an implementation of PThreads based upon the
 *	standard:
 *
 *		POSIX 1003.1-2001
 *  and
 *    The Single Unix Specification version 3
 *
 *    (these two are equivalent)
 *
 *	in order to enhance code portability between Windows,
 *  various commercial Unix implementations, and Linux.
 *
 *	See the ANNOUNCE file for a full list of conforming
 *	routines and defined constants, and a list of missing
 *	routines and constants not defined in this implementation.
 *
 * Authors:
 *	There have been many contributors to this library.
 *	The initial implementation was contributed by
 *	John Bossom, and several others have provided major
 *	sections or revisions of parts of the implementation.
 *	Often significant effort has been contributed to
 *	find and fix important bugs and other problems to
 *	improve the reliability of the library, which sometimes
 *	is not reflected in the amount of code which changed as
 *	result.
 *	As much as possible, the contributors are acknowledged
 *	in the ChangeLog file in the source code distribution
 *	where their changes are noted in detail.
 *
 *	Contributors are listed in the CONTRIBUTORS file.
 *
 *	As usual, all bouquets go to the contributors, and all
 *	brickbats go to the project maintainer.
 *
 * Maintainer:
 *	The code base for this project is coordinated and
 *	eventually pre-tested, packaged, and made available by
 *
 *		Ross Johnson <rpj@ise.canberra.edu.au>
 *
 * QA Testers:
 *	Ultimately, the library is tested in the real world by
 *	a host of competent and demanding scientists and
 *	engineers who report bugs and/or provide solutions
 *	which are then fixed or incorporated into subsequent
 *	versions of the library. Each time a bug is fixed, a
 *	test case is written to prove the fix and ensure
 *	that later changes to the code don't reintroduce the
 *	same error. The number of test cases is slowly growing
 *	and therefore so is the code reliability.
 *
 * Compliance:
 *	See the file ANNOUNCE for the list of implemented
 *	and not-implemented routines and defined options.
 *	Of course, these are all defined is this file as well.
 *
 * Web site:
 *	The source code and other information about this library
 *	are available from
 *
 *		http://sources.redhat.com/pthreads-win32/
 *
 * -------------------------------------------------------------
 */

/* Try to avoid including windows.h */
#if defined(__MINGW32__) && defined(__cplusplus)
/*
 * FIXME: The pthreadGCE.dll build gets linker unresolved errors
 * on pthread_key_create() unless windows.h is included here.
 * It appears to have something to do with an argument type mismatch.
 * Looking at tsd.o with 'nm' shows this line:
 * 00000000 T _pthread_key_create__FPP14pthread_key_t_PFPv_v
 * instead of
 * 00000000 T _pthread_key_create
 */
#define PTW32_INCLUDE_WINDOWS_H
#endif

#ifdef PTW32_INCLUDE_WINDOWS_H
#include <windows.h>
#endif

/*
 * -----------------
 * autoconf switches
 * -----------------
 */

#if HAVE_CONFIG_H
#include "config.h"
#endif /* HAVE_CONFIG_H */

#if PTW32_LEVEL >= PTW32_LEVEL_MAX

/* Try to avoid including windows.h */
#if defined(__MINGW32__) && defined(__cplusplus)
/*
 * FIXME: The pthreadGCE.dll build gets linker unresolved errors
 * on pthread_key_create() unless windows.h is included here.
 * It appears to have something to do with an argument type mismatch.
 * Looking at tsd.o with 'nm' shows this line:
 * 00000000 T _pthread_key_create__FPP14pthread_key_t_PFPv_v
 * instead of
 * 00000000 T _pthread_key_create
 */
#define PTW32_INCLUDE_WINDOWS_H
#endif

#ifdef PTW32_INCLUDE_WINDOWS_H
#include <windows.h>
#endif

#ifndef NEED_FTIME
#include <time.h>
#else /* NEED_FTIME */
/* use native WIN32 time API */
#endif /* NEED_FTIME */

#if HAVE_SIGNAL_H
#include <signal.h>
#endif /* HAVE_SIGNAL_H */

#include <setjmp.h>
#include <limits.h>

/*
 * Boolean values to make us independent of system includes.
 */
enum {
  PTW32_FALSE = 0,
  PTW32_TRUE = (! PTW32_FALSE)
};

/*
 * This is a duplicate of what is in the autoconf config.h,
 * which is only used when building the pthread-win32 libraries.
 */

#ifndef PTW32_CONFIG_H
#  if defined(WINCE)
#    define NEED_ERRNO
#    define NEED_SEM
#  endif
#  if defined(_UWIN) || defined(__MINGW32__)
#    define HAVE_MODE_T
#  endif
#endif

/*
 *
 */

#if PTW32_LEVEL >= PTW32_LEVEL_MAX
#ifdef NEED_ERRNO
#include "need_errno.h"
#else
#include <errno.h>
#endif
#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */

/*
 * Several systems don't define ENOTSUP. If not, we use
 * the same value as Solaris.
 */
#ifndef ENOTSUP
#  define ENOTSUP 48
#endif

#ifndef ETIMEDOUT
#  define ETIMEDOUT 10060     /* This is the value in winsock.h. */
#endif

#include <sched.h>

/*
 * To avoid including windows.h we define only those things that we
 * actually need from it. I don't like the potential incompatibility that
 * this creates with future versions of windows.
 */
#ifndef PTW32_INCLUDE_WINDOWS_H
#ifndef HANDLE
# define PTW32__HANDLE_DEF
# define HANDLE void *
#endif
#ifndef DWORD
# define PTW32__DWORD_DEF
# define DWORD unsigned long
#endif
#endif

#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */

#ifndef HAVE_STRUCT_TIMESPEC
struct timespec {
	long tv_sec;
	long tv_nsec;
};
#endif /* HAVE_STRUCT_TIMESPEC */

#ifndef SIG_BLOCK
#define SIG_BLOCK 0
#endif /* SIG_BLOCK */

#ifndef SIG_UNBLOCK 
#define SIG_UNBLOCK 1
#endif /* SIG_UNBLOCK */

#ifndef SIG_SETMASK
#define SIG_SETMASK 2
#endif /* SIG_SETMASK */

#ifdef __cplusplus
extern "C"
{
#endif				/* __cplusplus */

/*
 * -------------------------------------------------------------
 *
 * POSIX 1003.1-2001 Options
 * =========================
 *
 * _POSIX_THREADS (set)
 *			If set, you can use threads
 *
 * _POSIX_THREAD_ATTR_STACKSIZE (set)
 *			If set, you can control the size of a thread's
 *			stack
 *				pthread_attr_getstacksize
 *				pthread_attr_setstacksize
 *
 * _POSIX_THREAD_ATTR_STACKADDR (not set)
 *			If set, you can allocate and control a thread's
 *			stack. If not supported, the following functions
 *			will return ENOSYS, indicating they are not
 *			supported:
 *				pthread_attr_getstackaddr
 *				pthread_attr_setstackaddr
 *
 * _POSIX_THREAD_PRIORITY_SCHEDULING (set)
 *			If set, you can use realtime scheduling.
 *			Indicates the availability of:
 *				pthread_attr_getinheritsched
 *				pthread_attr_getschedparam
 *				pthread_attr_getschedpolicy
 *				pthread_attr_getscope
 *				pthread_attr_setinheritsched
 *				pthread_attr_setschedparam
 *				pthread_attr_setschedpolicy
 *				pthread_attr_setscope
 *				pthread_getschedparam
 *				pthread_setschedparam
 *				sched_get_priority_max
 *				sched_get_priority_min
 *				sched_rr_set_interval
 *
 * _POSIX_THREAD_PRIO_INHERIT (not set)
 *			If set, you can create priority inheritance
 *			mutexes.
 *				pthread_mutexattr_getprotocol +
 *				pthread_mutexattr_setprotocol +
 *
 * _POSIX_THREAD_PRIO_PROTECT (not set)
 *			If set, you can create priority ceiling mutexes
 *			Indicates the availability of:
 *				pthread_mutex_getprioceiling
 *				pthread_mutex_setprioceiling
 *				pthread_mutexattr_getprioceiling
 *				pthread_mutexattr_getprotocol	  +
 *				pthread_mutexattr_setprioceiling
 *				pthread_mutexattr_setprotocol	  +
 *
 * _POSIX_THREAD_PROCESS_SHARED (not set)
 *			If set, you can create mutexes and condition
 *			variables that can be shared with another
 *			process.If set, indicates the availability
 *			of:
 *				pthread_mutexattr_getpshared
 *				pthread_mutexattr_setpshared
 *				pthread_condattr_getpshared
 *				pthread_condattr_setpshared
 *
 * _POSIX_THREAD_SAFE_FUNCTIONS (set)
 *			If set you can use the special *_r library
 *			functions that provide thread-safe behaviour
 *
 * _POSIX_READER_WRITER_LOCKS (set)
 *			If set, you can use read/write locks
 *
 * _POSIX_SPIN_LOCKS (set)
 *			If set, you can use spin locks
 *
 * _POSIX_BARRIERS (set)
 *			If set, you can use barriers
 *
 *	+ These functions provide both 'inherit' and/or
 *	  'protect' protocol, based upon these macro
 *	  settings.
 *
 * POSIX 1003.1-2001 Limits
 * ===========================
 *
 * PTHREAD_DESTRUCTOR_ITERATIONS
 *			Maximum number of attempts to destroy
 *			a thread's thread-specific data on
 *			termination (must be at least 4)
 *
 * PTHREAD_KEYS_MAX
 *			Maximum number of thread-specific data keys
 *			available per process (must be at least 128)
 *
 * PTHREAD_STACK_MIN
 *			Minimum supported stack size for a thread
 *
 * PTHREAD_THREADS_MAX
 *			Maximum number of threads supported per
 *			process (must be at least 64).
 *
 * _POSIX_SEM_NSEMS_MAX
 *	The maximum number of semaphores a process can have.
 *	(only defined if not already defined)
 *
 * _POSIX_SEM_VALUE_MAX
 *	The maximum value a semaphore can have.
 *	(only defined if not already defined)
 *
 * -------------------------------------------------------------
 */

/*
 * POSIX Options
 */
#ifndef _POSIX_THREADS
#define _POSIX_THREADS
#endif

#ifndef _POSIX_READER_WRITER_LOCKS
#define _POSIX_READER_WRITER_LOCKS
#endif

#ifndef _POSIX_SPIN_LOCKS
#define _POSIX_SPIN_LOCKS
#endif

#ifndef _POSIX_BARRIERS
#define _POSIX_BARRIERS
#endif

#define _POSIX_THREAD_SAFE_FUNCTIONS
#define _POSIX_THREAD_ATTR_STACKSIZE
#define _POSIX_THREAD_PRIORITY_SCHEDULING

#if defined( KLUDGE )
/*
 * The following are not supported
 */
#define _POSIX_THREAD_ATTR_STACKADDR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -