📄 _unixos.h
字号:
/* -*- 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 + -