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

📄 _solaris.h

📁 Netscape NSPR库源码
💻 H
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- *//*  * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is the Netscape Portable Runtime (NSPR). *  * The Initial Developer of the Original Code is Netscape * Communications Corporation.  Portions created by Netscape are  * Copyright (C) 1998-2000 Netscape Communications Corporation.  All * Rights Reserved. *  * Contributor(s): *  * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable  * instead of those above.  If you wish to allow use of your  * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL.  If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. */#ifndef nspr_solaris_defs_h___#define nspr_solaris_defs_h___/* * Internal configuration macros */#define PR_LINKER_ARCH	"solaris"#define _PR_SI_SYSNAME	"SOLARIS"#ifdef sparc#define _PR_SI_ARCHITECTURE	"sparc"#elif defined(i386)#define _PR_SI_ARCHITECTURE	"x86"#else#error unknown processor#endif#define PR_DLL_SUFFIX		".so"#define _PR_VMBASE		0x30000000#define _PR_STACK_VMBASE	0x50000000#define _MD_DEFAULT_STACK_SIZE	(2*65536L)#define _MD_MMAP_FLAGS          MAP_SHARED#undef  HAVE_STACK_GROWING_UP#ifndef HAVE_WEAK_IO_SYMBOLS#define	HAVE_WEAK_IO_SYMBOLS#endif#undef	HAVE_WEAK_MALLOC_SYMBOLS#define	HAVE_DLL#define	USE_DLFCN#define NEED_STRFTIME_LOCK/* * Intel x86 has atomic instructions. * * Sparc v8 does not have instructions to efficiently implement * atomic increment/decrement operations.  In the local threads * only and pthreads versions, we use the default atomic routine * implementation in pratom.c.  The obsolete global threads only * version uses a global mutex_t to implement the atomic routines * in solaris.c, which is actually equivalent to the default * implementation. * * 64-bit Solaris requires sparc v9, which has atomic instructions. */#if defined(i386) || defined(_PR_GLOBAL_THREADS_ONLY) || defined(IS_64)#define _PR_HAVE_ATOMIC_OPS#endif#if defined(_PR_GLOBAL_THREADS_ONLY) || defined(_PR_PTHREADS)/* * We have assembly language implementation of atomic * stacks for the 32-bit sparc and x86 architectures only. * * Note: We ran into thread starvation problem with the * 32-bit sparc assembly language implementation of atomic * stacks, so we do not use it now. (Bugzilla bug 113740) */#if !defined(sparc)#define _PR_HAVE_ATOMIC_CAS#endif#endif#define _PR_POLL_AVAILABLE#define _PR_USE_POLL#define _PR_STAT_HAS_ST_ATIM#ifdef SOLARIS2_5#define _PR_HAVE_SYSV_SEMAPHORES#define PR_HAVE_SYSV_NAMED_SHARED_MEMORY#else#define _PR_HAVE_POSIX_SEMAPHORES#define PR_HAVE_POSIX_NAMED_SHARED_MEMORY#endif#define _PR_HAVE_GETIPNODEBYNAME#define _PR_HAVE_GETIPNODEBYADDR#define _PR_INET6_PROBE#define _PR_ACCEPT_INHERIT_NONBLOCK#ifndef _PR_INET6#define AF_INET6 26#define AI_V4MAPPED 0x0001 #define AI_ALL      0x0002#define AI_ADDRCONFIG   0x0004#define _PR_HAVE_MD_SOCKADDR_IN6/* isomorphic to struct in6_addr on Solaris 8 */struct _md_in6_addr {    union {        PRUint8  _S6_u8[16];        PRUint32 _S6_u32[4];        PRUint32 __S6_align;    } _S6_un;};/* isomorphic to struct sockaddr_in6 on Solaris 8 */struct _md_sockaddr_in6 {    PRUint16 sin6_family;    PRUint16 sin6_port;    PRUint32 sin6_flowinfo;    struct _md_in6_addr sin6_addr;    PRUint32 sin6_scope_id;    PRUint32 __sin6_src_id;};#endif#if defined(_PR_GLOBAL_THREADS_ONLY) || defined(_PR_PTHREADS)#define _PR_HAVE_GETHOST_R#define _PR_HAVE_GETHOST_R_POINTER#endif#include "prinrval.h"NSPR_API(PRIntervalTime) _MD_Solaris_GetInterval(void);#define _MD_GET_INTERVAL                  _MD_Solaris_GetIntervalNSPR_API(PRIntervalTime) _MD_Solaris_TicksPerSecond(void);#define _MD_INTERVAL_PER_SEC              _MD_Solaris_TicksPerSecond#if defined(_PR_HAVE_ATOMIC_OPS)/*** Atomic Operations*/#define _MD_INIT_ATOMIC()NSPR_API(PRInt32) _MD_AtomicIncrement(PRInt32 *val);#define _MD_ATOMIC_INCREMENT _MD_AtomicIncrementNSPR_API(PRInt32) _MD_AtomicAdd(PRInt32 *ptr, PRInt32 val);#define _MD_ATOMIC_ADD _MD_AtomicAddNSPR_API(PRInt32) _MD_AtomicDecrement(PRInt32 *val);#define _MD_ATOMIC_DECREMENT _MD_AtomicDecrementNSPR_API(PRInt32) _MD_AtomicSet(PRInt32 *val, PRInt32 newval);#define _MD_ATOMIC_SET _MD_AtomicSet#endif /* _PR_HAVE_ATOMIC_OPS */#if defined(_PR_PTHREADS)NSPR_API(void)		_MD_EarlyInit(void);#define _MD_EARLY_INIT		_MD_EarlyInit#define _MD_FINAL_INIT		_PR_UnixInit#elif defined(_PR_GLOBAL_THREADS_ONLY)#include "prthread.h"#include <ucontext.h>/*** Iinitialization Related definitions*/NSPR_API(void)		_MD_EarlyInit(void);#define _MD_EARLY_INIT		_MD_EarlyInit#define _MD_FINAL_INIT		_PR_UnixInit#define _MD_GET_SP(threadp)	threadp->md.sp/*** Clean-up the thread machine dependent data structure*/#define	_MD_INIT_THREAD				_MD_InitializeThread#define	_MD_INIT_ATTACHED_THREAD	_MD_InitializeThreadNSPR_API(PRStatus) _MD_CreateThread(PRThread *thread, 					void (*start)(void *), 					PRThreadPriority priority,					PRThreadScope scope, 					PRThreadState state, 					PRUint32 stackSize);#define _MD_CREATE_THREAD _MD_CreateThread#define	_PR_CONTEXT_TYPE	ucontext_t#define CONTEXT(_thread) (&(_thread)->md.context)#include <thread.h>#include <sys/lwp.h>#include <synch.h>extern struct PRLock *_pr_schedLock;/*** Thread Local Storage */#define THREAD_KEY_T thread_key_textern struct PRThread *_pr_current_thread_tls();extern struct _PRCPU *_pr_current_cpu_tls();extern struct PRThread *_pr_last_thread_tls();extern THREAD_KEY_T threadid_key;extern THREAD_KEY_T cpuid_key;extern THREAD_KEY_T last_thread_key;#define _MD_CURRENT_THREAD() _pr_current_thread_tls()#define _MD_CURRENT_CPU() _pr_current_cpu_tls()#define _MD_LAST_THREAD() _pr_last_thread_tls()	#define _MD_SET_CURRENT_THREAD(newval) 			\	PR_BEGIN_MACRO					\	thr_setspecific(threadid_key, (void *)newval);	\	PR_END_MACRO#define _MD_SET_CURRENT_CPU(newval) 			\	PR_BEGIN_MACRO					\	thr_setspecific(cpuid_key, (void *)newval);	\	PR_END_MACRO#define _MD_SET_LAST_THREAD(newval)	 			\	PR_BEGIN_MACRO						\	thr_setspecific(last_thread_key, (void *)newval);	\	PR_END_MACRO	#define	_MD_CLEAN_THREAD(_thread)	_MD_cleanup_thread(_thread)extern void _MD_exit_thread(PRThread *thread);#define _MD_EXIT_THREAD(thread)		_MD_exit_thread(thread)#define	_MD_SUSPEND_THREAD(thread)	_MD_Suspend(thread)#define	_MD_RESUME_THREAD(thread)	thr_continue((thread)->md.handle)/* XXXX Needs to be defined - Prashant */#define _MD_SUSPEND_CPU(cpu)#define _MD_RESUME_CPU(cpu)extern void _MD_Begin_SuspendAll(void);extern void _MD_End_SuspendAll(void);extern void _MD_End_ResumeAll(void);#define _MD_BEGIN_SUSPEND_ALL()		_MD_Begin_SuspendAll()#define _MD_BEGIN_RESUME_ALL()		#define	_MD_END_SUSPEND_ALL()		_MD_End_SuspendAll()#define	_MD_END_RESUME_ALL()		_MD_End_ResumeAll()#define _MD_INIT_LOCKS()#define _MD_NEW_LOCK(md_lockp) (mutex_init(&((md_lockp)->lock),USYNC_THREAD,NULL) ? PR_FAILURE : PR_SUCCESS)#define _MD_FREE_LOCK(md_lockp) mutex_destroy(&((md_lockp)->lock))#define _MD_UNLOCK(md_lockp) mutex_unlock(&((md_lockp)->lock))#define _MD_TEST_AND_LOCK(md_lockp) mutex_trylock(&((md_lockp)->lock))struct _MDLock;NSPR_API(void) _MD_lock(struct _MDLock *md_lock);#undef PROFILE_LOCKS#ifndef PROFILE_LOCKS#define _MD_LOCK(md_lockp) _MD_lock(md_lockp)#else#define _MD_LOCK(md_lockp)                 \    PR_BEGIN_MACRO \    int rv = _MD_TEST_AND_LOCK(md_lockp); \    if (rv == 0) { \        (md_lockp)->hitcount++; \    } else { \        (md_lockp)->misscount++; \        _MD_lock(md_lockp); \    } \    PR_END_MACRO#endif#define _PR_LOCK_HEAP() if (_pr_heapLock) _MD_LOCK(&_pr_heapLock->md)#define _PR_UNLOCK_HEAP() if (_pr_heapLock) _MD_UNLOCK(&_pr_heapLock->md)#define _MD_ATTACH_THREAD(threadp)#define THR_KEYCREATE thr_keycreate#define THR_SELF thr_self#define _MD_NEW_CV(condp) cond_init(&((condp)->cv), USYNC_THREAD, 0)#define COND_WAIT(condp, mutexp) cond_wait(condp, mutexp)#define COND_TIMEDWAIT(condp, mutexp, tspec) \                                     cond_timedwait(condp, mutexp, tspec)#define _MD_NOTIFY_CV(condp, lockp) cond_signal(&((condp)->cv))#define _MD_NOTIFYALL_CV(condp,unused) cond_broadcast(&((condp)->cv))	#define _MD_FREE_CV(condp) cond_destroy(&((condp)->cv))#define _MD_YIELD() thr_yield()#include <time.h>/*  * Because clock_gettime() on Solaris/x86 2.4 always generates a * segmentation fault, we use an emulated version _pr_solx86_clock_gettime(), * which is implemented using gettimeofday(). */#if defined(i386) && defined(SOLARIS2_4)extern int _pr_solx86_clock_gettime(clockid_t clock_id, struct timespec *tp);#define GETTIME(tt) _pr_solx86_clock_gettime(CLOCK_REALTIME, (tt))#else#define GETTIME(tt) clock_gettime(CLOCK_REALTIME, (tt))#endif  /* i386 && SOLARIS2_4 */#define MUTEX_T mutex_t#define COND_T cond_t#define _MD_NEW_SEM(md_semp,_val)  sema_init(&((md_semp)->sem),_val,USYNC_THREAD,NULL)#define _MD_DESTROY_SEM(md_semp) sema_destroy(&((md_semp)->sem))#define _MD_WAIT_SEM(md_semp) sema_wait(&((md_semp)->sem))#define _MD_POST_SEM(md_semp) sema_post(&((md_semp)->sem))#define _MD_SAVE_ERRNO(_thread)#define _MD_RESTORE_ERRNO(_thread)#define _MD_INIT_RUNNING_CPU(cpu) _MD_unix_init_running_cpu(cpu)extern struct _MDLock _pr_ioq_lock;#define _MD_IOQ_LOCK()		_MD_LOCK(&_pr_ioq_lock)#define _MD_IOQ_UNLOCK()	_MD_UNLOCK(&_pr_ioq_lock)extern PRStatus _MD_wait(struct PRThread *, PRIntervalTime timeout);#define _MD_WAIT _MD_waitextern PRStatus _MD_WakeupWaiter(struct PRThread *);#define _MD_WAKEUP_WAITER _MD_WakeupWaiterNSPR_API(void) _MD_InitIO(void);#define _MD_INIT_IO _MD_InitIO#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)#define _MD_SWITCH_CONTEXT(_thread)#define _MD_RESTORE_CONTEXT(_newThread)struct _MDLock {    MUTEX_T lock;#ifdef PROFILE_LOCKS    PRInt32 hitcount;    PRInt32 misscount;#endif};struct _MDCVar {    COND_T cv;};struct _MDSemaphore {    sema_t sem;};struct _MDThread {    _PR_CONTEXT_TYPE context;    thread_t handle;    lwpid_t lwpid;    uint_t sp;		/* stack pointer */    uint_t threadID;	/* ptr to solaris-internal thread id structures */    struct _MDSemaphore waiter_sem;};struct _MDThreadStack {    PRInt8 notused;};struct _MDSegment {    PRInt8 notused;};/* * md-specific cpu structure field, common to all Unix platforms */#define _PR_MD_MAX_OSFD FD_SETSIZEstruct _MDCPU_Unix {    PRCList ioQ;    PRUint32 ioq_timeout;    PRInt32 ioq_max_osfd;    PRInt32 ioq_osfd_cnt;#ifndef _PR_USE_POLL    fd_set fd_read_set, fd_write_set, fd_exception_set;    PRInt16 fd_read_cnt[_PR_MD_MAX_OSFD],fd_write_cnt[_PR_MD_MAX_OSFD],				fd_exception_cnt[_PR_MD_MAX_OSFD];#else	struct pollfd *ioq_pollfds;	int ioq_pollfds_size;#endif	/* _PR_USE_POLL */

⌨️ 快捷键说明

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