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

📄 _unixos.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 prunixos_h___#define prunixos_h___/* * If FD_SETSIZE is not defined on the command line, set the default value * before include select.h *//* * Linux: FD_SETSIZE is defined in /usr/include/sys/select.h and should * not be redefined. */#if !defined(LINUX) && !defined(DARWIN) && !defined(NEXTSTEP)#ifndef FD_SETSIZE#define FD_SETSIZE  4096#endif#endif#include <unistd.h>#include <stddef.h>#include <sys/stat.h>#include <dirent.h>#include <errno.h>#include "prio.h"#include "prmem.h"#include "prclist.h"/* * For select(), fd_set, and struct timeval. * * In The Single UNIX(R) Specification, Version 2, * the header file for select() is <sys/time.h>. * * fd_set is defined in <sys/types.h>.  Usually * <sys/time.h> includes <sys/types.h>, but on some * older systems <sys/time.h> does not include * <sys/types.h>, so we include it explicitly. */#include <sys/time.h>#include <sys/types.h>#if defined(AIX)  /* Only pre-4.2 AIX needs it, but for simplicity... */#include <sys/select.h>#endif#define PR_DIRECTORY_SEPARATOR		'/'#define PR_DIRECTORY_SEPARATOR_STR	"/"#define PR_PATH_SEPARATOR		':'#define PR_PATH_SEPARATOR_STR		":"#define GCPTRtypedef int (*FARPROC)();/* * intervals at which GLOBAL threads wakeup to check for pending interrupt */#define _PR_INTERRUPT_CHECK_INTERVAL_SECS 5extern PRIntervalTime intr_timeout_ticks;/* * The bit flags for the in_flags and out_flags fields * of _PR_UnixPollDesc */#ifdef _PR_USE_POLL#define _PR_UNIX_POLL_READ    POLLIN#define _PR_UNIX_POLL_WRITE   POLLOUT#define _PR_UNIX_POLL_EXCEPT  POLLPRI#define _PR_UNIX_POLL_ERR     POLLERR#define _PR_UNIX_POLL_NVAL    POLLNVAL#define _PR_UNIX_POLL_HUP     POLLHUP#else /* _PR_USE_POLL */#define _PR_UNIX_POLL_READ    0x1#define _PR_UNIX_POLL_WRITE   0x2#define _PR_UNIX_POLL_EXCEPT  0x4#define _PR_UNIX_POLL_ERR     0x8#define _PR_UNIX_POLL_NVAL    0x10#define _PR_UNIX_POLL_HUP     0x20#endif /* _PR_USE_POLL */typedef struct _PRUnixPollDesc {	PRInt32 osfd;	PRInt16 in_flags;	PRInt16 out_flags;} _PRUnixPollDesc;typedef struct PRPollQueue {    PRCList links;        /* for linking PRPollQueue's together */    _PRUnixPollDesc *pds;        /* array of poll descriptors */    PRUintn npds;            /* length of the array */    PRPackedBool on_ioq;    /* is this on the async i/o work q? */    PRIntervalTime timeout;        /* timeout, in ticks */    struct PRThread *thr;} PRPollQueue;#define _PR_POLLQUEUE_PTR(_qp) \    ((PRPollQueue*) ((char*) (_qp) - offsetof(PRPollQueue,links)))extern PRInt32 _PR_WaitForMultipleFDs(    _PRUnixPollDesc *unixpds,    PRInt32 pdcnt,    PRIntervalTime timeout);extern void _PR_Unblock_IO_Wait(struct PRThread *thr);#if defined(_PR_LOCAL_THREADS_ONLY) || defined(_PR_GLOBAL_THREADS_ONLY)#define _MD_CHECK_FOR_EXIT()#endifextern fd_set _pr_md_read_set, _pr_md_write_set, _pr_md_exception_set;extern PRInt16 _pr_md_read_cnt[], _pr_md_write_cnt[], _pr_md_exception_cnt[];extern PRInt32 _pr_md_ioq_max_osfd;extern PRUint32 _pr_md_ioq_timeout;struct _MDFileDesc {    int osfd;#if defined(LINUX) && defined(_PR_PTHREADS)    int tcp_nodelay;  /* used by pt_LinuxSendFile */#endif};struct _MDDir {	DIR *d;};struct _PRCPU;extern void _MD_unix_init_running_cpu(struct _PRCPU *cpu);/*** Make a redzone at both ends of the stack segment. Disallow access** to those pages of memory. It's ok if the mprotect call's don't** work - it just means that we don't really have a functional** redzone.*/#include <sys/mman.h>#ifndef PROT_NONE#define PROT_NONE 0x0#endif#if defined(DEBUG) && !defined(DARWIN) && !defined(NEXTSTEP)#if !defined(SOLARIS)	#include <string.h>  /* for memset() */#define _MD_INIT_STACK(ts,REDZONE)					\    PR_BEGIN_MACRO                 					\	(void) mprotect((void*)ts->seg->vaddr, REDZONE, PROT_NONE);	\	(void) mprotect((void*) ((char*)ts->seg->vaddr + REDZONE + ts->stackSize),\			REDZONE, PROT_NONE);				\    /*									\    ** Fill stack memory with something that turns into an illegal	\    ** pointer value. This will sometimes find runtime references to	\    ** uninitialized pointers. We don't do this for solaris because we	\    ** can use purify instead.						\    */									\    if (_pr_debugStacks) {						\	memset(ts->allocBase + REDZONE, 0xf7, ts->stackSize);		\    }									\    PR_END_MACRO#else	/* !SOLARIS	*/#define _MD_INIT_STACK(ts,REDZONE)					\    PR_BEGIN_MACRO                 					\	(void) mprotect((void*)ts->seg->vaddr, REDZONE, PROT_NONE);	\	(void) mprotect((void*) ((char*)ts->seg->vaddr + REDZONE + ts->stackSize),\			REDZONE, PROT_NONE);				\    PR_END_MACRO#endif	/* !SOLARIS	*//* * _MD_CLEAR_STACK *	Allow access to the redzone pages; the access was turned off in *	_MD_INIT_STACK. */#define _MD_CLEAR_STACK(ts)						\    PR_BEGIN_MACRO                 					\	(void) mprotect((void*)ts->seg->vaddr, REDZONE, PROT_READ|PROT_WRITE);\	(void) mprotect((void*) ((char*)ts->seg->vaddr + REDZONE + ts->stackSize),\			REDZONE, PROT_READ|PROT_WRITE);			\    PR_END_MACRO#else	/* DEBUG */#define _MD_INIT_STACK(ts,REDZONE)#define _MD_CLEAR_STACK(ts)#endif	/* DEBUG */#if !defined(SOLARIS) #define PR_SET_INTSOFF(newval)#endif/************************************************************************/extern void _PR_UnixInit(void);/************************************************************************/struct _MDProcess {    pid_t pid;};struct PRProcess;struct PRProcessAttr;/* Create a new process (fork() + exec()) */#define _MD_CREATE_PROCESS _MD_CreateUnixProcessextern struct PRProcess * _MD_CreateUnixProcess(    const char *path,    char *const *argv,    char *const *envp,    const struct PRProcessAttr *attr);#define _MD_DETACH_PROCESS _MD_DetachUnixProcessextern PRStatus _MD_DetachUnixProcess(struct PRProcess *process);/* Wait for a child process to terminate */#define _MD_WAIT_PROCESS _MD_WaitUnixProcessextern PRStatus _MD_WaitUnixProcess(struct PRProcess *process,    PRInt32 *exitCode);#define _MD_KILL_PROCESS _MD_KillUnixProcessextern PRStatus _MD_KillUnixProcess(struct PRProcess *process);/************************************************************************/extern void _MD_EnableClockInterrupts(void);extern void _MD_DisableClockInterrupts(void);#define _MD_START_INTERRUPTS			_MD_StartInterrupts#define _MD_STOP_INTERRUPTS				_MD_StopInterrupts#define _MD_DISABLE_CLOCK_INTERRUPTS	_MD_DisableClockInterrupts#define _MD_ENABLE_CLOCK_INTERRUPTS		_MD_EnableClockInterrupts#define _MD_BLOCK_CLOCK_INTERRUPTS		_MD_BlockClockInterrupts#define _MD_UNBLOCK_CLOCK_INTERRUPTS	_MD_UnblockClockInterrupts/************************************************************************/extern void		_MD_InitCPUS(void);#define _MD_INIT_CPUS           _MD_InitCPUSextern void		_MD_Wakeup_CPUs(void);#define _MD_WAKEUP_CPUS _MD_Wakeup_CPUs#define _MD_PAUSE_CPU			_MD_PauseCPU#if defined(_PR_LOCAL_THREADS_ONLY) || defined(_PR_GLOBAL_THREADS_ONLY)#define _MD_CLEANUP_BEFORE_EXIT()#endif#ifndef IRIX#define _MD_EXIT(status)		_exit(status)#endif/************************************************************************/#define _MD_GET_ENV				getenv#define _MD_PUT_ENV				putenv/************************************************************************/#define _MD_INIT_FILEDESC(fd)extern void		_MD_MakeNonblock(PRFileDesc *fd);#define _MD_MAKE_NONBLOCK			_MD_MakeNonblock		/************************************************************************/#if !defined(_PR_PTHREADS)extern void		_MD_InitSegs(void);extern PRStatus	_MD_AllocSegment(PRSegment *seg, PRUint32 size,				void *vaddr);extern void		_MD_FreeSegment(PRSegment *seg);#define _MD_INIT_SEGS			_MD_InitSegs#define _MD_ALLOC_SEGMENT		_MD_AllocSegment#define _MD_FREE_SEGMENT		_MD_FreeSegment#endif /* !defined(_PR_PTHREADS) *//************************************************************************/

⌨️ 快捷键说明

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