Update with post-3.5 fixes on the tip

This commit is contained in:
srinivas%netscape.com 1999-10-19 00:40:39 +00:00
Родитель c070ed6434
Коммит 169a3f4297
36 изменённых файлов: 396 добавлений и 119 удалений

Просмотреть файл

@ -60,7 +60,7 @@ endif
ifeq ($(OS_ARCH), HP-UX)
ifeq ($(USE_64),1)
XLDOPTS += +DD64
XLDOPTS += +DA2.0W
endif
endif

Просмотреть файл

@ -69,8 +69,11 @@ static PRVersionDescription prVersionDescription_libplds3 =
/*
* Version information for the 'ident' and 'what commands
*
* NOTE: the first component of the concatenated rcsid string
* must not end in a '$' to prevent rcs keyword substitution.
*/
static char rcsid[] = "$Version: NSPR " PR_VERSION _DEBUG_STRING
static char rcsid[] = "$Header: NSPR " PR_VERSION _DEBUG_STRING
" " _BUILD_STRING " $";
static char sccsid[] = "@(#)NSPR " PR_VERSION _DEBUG_STRING
" " _BUILD_STRING;

Просмотреть файл

@ -69,8 +69,11 @@ static PRVersionDescription prVersionDescription_libplc3 =
/*
* Version information for the 'ident' and 'what commands
*
* NOTE: the first component of the concatenated rcsid string
* must not end in a '$' to prevent rcs keyword substitution.
*/
static char rcsid[] = "$Version: NSPR " PR_VERSION _DEBUG_STRING
static char rcsid[] = "$Header: NSPR " PR_VERSION _DEBUG_STRING
" " _BUILD_STRING " $";
static char sccsid[] = "@(#)NSPR " PR_VERSION _DEBUG_STRING
" " _BUILD_STRING;

Просмотреть файл

@ -69,8 +69,11 @@ static PRVersionDescription prVersionDescription_libprstrms3 =
/*
* Version information for the 'ident' and 'what commands
*
* NOTE: the first component of the concatenated rcsid string
* must not end in a '$' to prevent rcs keyword substitution.
*/
static char rcsid[] = "$Version: NSPR " PR_VERSION _DEBUG_STRING
static char rcsid[] = "$Header: NSPR " PR_VERSION _DEBUG_STRING
" " _BUILD_STRING " $";
static char sccsid[] = "@(#)NSPR " PR_VERSION _DEBUG_STRING
" " _BUILD_STRING;

Просмотреть файл

@ -63,6 +63,8 @@ extern PRStatus _MD_OS2GetHostName(char *name, PRUint32 namelen);
#else
extern PRStatus _MD_WindowsGetHostName(char *name, PRUint32 namelen);
#define _MD_GETHOSTNAME _MD_WindowsGetHostName
extern PRStatus _MD_WindowsGetSysInfo(PRSysInfo cmd, char *name, PRUint32 namelen);
#define _MD_GETSYSINFO _MD_WindowsGetSysInfo
#endif
#endif /* prpcos_h___ */

Просмотреть файл

@ -393,6 +393,8 @@ extern PRInt32 _MD_socketavailable(PRFileDesc *fd);
extern PRInt64 _MD_socketavailable64(PRFileDesc *fd);
#define _MD_SOCKETAVAILABLE64 _MD_socketavailable64
#define _MD_PIPEAVAILABLE _MD_socketavailable
extern PRInt32 _MD_pr_poll(PRPollDesc *pds, PRIntn npds,
PRIntervalTime timeout);
#define _MD_PR_POLL _MD_pr_poll
@ -435,6 +437,9 @@ extern PRStatus _MD_set_fd_inheritable(PRFileDesc *fd, PRBool inheritable);
extern PRStatus _MD_gethostname(char *name, PRUint32 namelen);
#define _MD_GETHOSTNAME _MD_gethostname
extern PRStatus _MD_getsysinfo(PRSysInfo cmd, char *name, PRUint32 namelen);
#define _MD_GETSYSINFO _MD_getsysinfo
extern int _MD_unix_get_nonblocking_connect_error(int osfd);
#define HAVE_SOCKET_REUSEADDR

Просмотреть файл

@ -219,6 +219,7 @@ typedef enum PRSockOption
PR_SockOpt_NoDelay, /* don't delay send to coalesce packets */
PR_SockOpt_MaxSegment, /* maximum segment size */
PR_SockOpt_Broadcast, /* enable broadcast */
PR_SockOpt_Last
} PRSockOption;
@ -245,6 +246,7 @@ typedef struct PRSocketOptionData
PRBool keep_alive; /* Keep connections alive */
PRBool mcast_loopback; /* IP multicast loopback */
PRBool no_delay; /* Don't delay send to coalesce packets */
PRBool broadcast; /* Enable broadcast */
PRSize max_segment; /* Maximum segment size */
PRSize recv_buffer_size; /* Receive buffer size */
PRSize send_buffer_size; /* Send buffer size */
@ -278,7 +280,8 @@ typedef enum PRDescType
PR_DESC_FILE = 1,
PR_DESC_SOCKET_TCP = 2,
PR_DESC_SOCKET_UDP = 3,
PR_DESC_LAYERED = 4
PR_DESC_LAYERED = 4,
PR_DESC_PIPE = 5
} PRDescType;
typedef enum PRSeekWhence {

Просмотреть файл

@ -30,22 +30,6 @@
PR_BEGIN_EXTERN_C
/*
** File descriptors of the NSPR layer can be in one of the
** following states (stored in the 'state' field of struct
** PRFilePrivate):
** - _PR_FILEDESC_OPEN: The OS fd is open.
** - _PR_FILEDESC_CLOSED: The OS fd is closed. The PRFileDesc
** is still open but is unusable. The only operation allowed
** on the PRFileDesc is PR_Close().
** - _PR_FILEDESC_FREED: The OS fd is closed and the PRFileDesc
** structure is freed.
*/
#define _PR_FILEDESC_OPEN 0xaaaaaaaa /* 1010101... */
#define _PR_FILEDESC_CLOSED 0x55555555 /* 0101010... */
#define _PR_FILEDESC_FREED 0x11111111
/************************************************************************/
/************************************************************************/
@ -53,6 +37,7 @@ PR_BEGIN_EXTERN_C
PR_EXTERN(const PRIOMethods*) PR_GetFileMethods(void);
PR_EXTERN(const PRIOMethods*) PR_GetTCPMethods(void);
PR_EXTERN(const PRIOMethods*) PR_GetUDPMethods(void);
PR_EXTERN(const PRIOMethods*) PR_GetPipeMethods(void);
/*
** Convert a NSPR Socket Handle to a Native Socket handle.

Просмотреть файл

@ -1165,6 +1165,9 @@ extern PRInt32 _PR_MD_SOCKET(int af, int type, int flags);
extern PRInt32 _PR_MD_SOCKETAVAILABLE(PRFileDesc *fd);
#define _PR_MD_SOCKETAVAILABLE _MD_SOCKETAVAILABLE
extern PRInt32 _PR_MD_PIPEAVAILABLE(PRFileDesc *fd);
#define _PR_MD_PIPEAVAILABLE _MD_PIPEAVAILABLE
extern PRInt32 _PR_MD_PR_POLL(PRPollDesc *pds, PRIntn npds,
PRIntervalTime timeout);
#define _PR_MD_PR_POLL _MD_PR_POLL
@ -1503,6 +1506,22 @@ struct PRFileMap {
/************************************************************************/
/*
** File descriptors of the NSPR layer can be in one of the
** following states (stored in the 'state' field of struct
** PRFilePrivate):
** - _PR_FILEDESC_OPEN: The OS fd is open.
** - _PR_FILEDESC_CLOSED: The OS fd is closed. The PRFileDesc
** is still open but is unusable. The only operation allowed
** on the PRFileDesc is PR_Close().
** - _PR_FILEDESC_FREED: The OS fd is closed and the PRFileDesc
** structure is freed.
*/
#define _PR_FILEDESC_OPEN 0xaaaaaaaa /* 1010101... */
#define _PR_FILEDESC_CLOSED 0x55555555 /* 0101010... */
#define _PR_FILEDESC_FREED 0x11111111
struct PRFilePrivate {
PRInt32 state;
PRBool nonblocking;
@ -1876,6 +1895,9 @@ PR_EXTERN(PRInt32) _PR_MD_GET_SOCKET_ERROR(void);
extern PRStatus _PR_MD_GETHOSTNAME(char *name, PRUint32 namelen);
#define _PR_MD_GETHOSTNAME _MD_GETHOSTNAME
extern PRStatus _PR_MD_GETSYSINFO(PRSysInfo cmd, char *name, PRUint32 namelen);
#define _PR_MD_GETSYSINFO _MD_GETSYSINFO
#ifdef XP_BEOS
extern PRLock *_connectLock;

Просмотреть файл

@ -17,7 +17,6 @@
*/
#include "primpl.h"
#include "pratom.h"
#include <string.h>
@ -182,6 +181,8 @@ PR_IMPLEMENT(PRStatus) PR_SetFDCacheSize(PRIntn low, PRIntn high)
** turn the caches off, or turn them on. It is not dependent
** on the compilation setting of DEBUG.
*/
if (!_pr_initialized) _PR_ImplicitInitialization();
if (low > high) low = high; /* sanity check the params */
PR_Lock(_pr_fd_cache.ml);
@ -201,8 +202,7 @@ PR_IMPLEMENT(PRStatus) PR_SetFDCacheSize(PRIntn low, PRIntn high)
{
PRFileDesc *fd = _pr_fd_cache.head;
_pr_fd_cache.head = fd->higher;
fd->identity = PR_NSPR_IO_LAYER;
_PR_Putfd(fd);
PR_StackPush(_pr_fd_cache.stack, (PRStackElem*)(&fd->higher));
}
_pr_fd_cache.limit_low = 0;
_pr_fd_cache.tail = NULL;
@ -211,18 +211,20 @@ PR_IMPLEMENT(PRStatus) PR_SetFDCacheSize(PRIntn low, PRIntn high)
}
else /* starting up or just adjusting parameters */
{
PRBool was_using_cache = (0 != _pr_fd_cache.limit_high);
PRBool was_using_stack = (0 == _pr_fd_cache.limit_high);
_pr_fd_cache.limit_low = low;
_pr_fd_cache.limit_high = high;
if (was_using_cache) /* was using stack - feed into cache */
if (was_using_stack) /* was using stack - feed into cache */
{
PRStackElem *pop;
while (NULL != (pop = PR_StackPop(_pr_fd_cache.stack)))
{
PRFileDesc *fd = (PRFileDesc*)
((PRPtrdiff)pop - (PRPtrdiff)stack2fd);
fd->identity = PR_NSPR_IO_LAYER;
_PR_Putfd(fd);
if (NULL == _pr_fd_cache.tail) _pr_fd_cache.tail = fd;
fd->higher = _pr_fd_cache.head;
_pr_fd_cache.head = fd;
_pr_fd_cache.count += 1;
}
}
}
@ -241,20 +243,21 @@ void _PR_InitFdCache()
const char *low = PR_GetEnv("NSPR_FD_CACHE_SIZE_LOW");
const char *high = PR_GetEnv("NSPR_FD_CACHE_SIZE_HIGH");
_pr_fd_cache.limit_low = _pr_fd_cache.limit_high = 0;
if (NULL != low) _pr_fd_cache.limit_low = atoi(low);
if (NULL != high) _pr_fd_cache.limit_high = atoi(high);
/*
** _low is allowed to be zero, _high is not.
** If _high is zero, we're not doing the caching.
*/
_pr_fd_cache.limit_low = 0;
#if defined(DEBUG)
if (0 == _pr_fd_cache.limit_high)
_pr_fd_cache.limit_high = FD_SETSIZE;
_pr_fd_cache.limit_high = FD_SETSIZE;
#else
_pr_fd_cache.limit_high = 0;
#endif /* defined(DEBUG) */
if (NULL != low) _pr_fd_cache.limit_low = atoi(low);
if (NULL != high) _pr_fd_cache.limit_high = atoi(high);
if (_pr_fd_cache.limit_high < _pr_fd_cache.limit_low)
_pr_fd_cache.limit_high = _pr_fd_cache.limit_low;

Просмотреть файл

@ -155,6 +155,20 @@ static PRInt64 PR_CALLBACK FileAvailable64(PRFileDesc *fd)
return result;
}
static PRInt32 PR_CALLBACK PipeAvailable(PRFileDesc *fd)
{
PRInt32 rv;
rv = _PR_MD_PIPEAVAILABLE(fd);
return rv;
}
static PRInt64 PR_CALLBACK PipeAvailable64(PRFileDesc *fd)
{
PRInt64 rv;
LL_I2L(rv, _PR_MD_PIPEAVAILABLE(fd));
return rv;
}
static PRStatus PR_CALLBACK FileInfo(PRFileDesc *fd, PRFileInfo *info)
{
PRInt32 rv;
@ -256,6 +270,44 @@ PR_IMPLEMENT(const PRIOMethods*) PR_GetFileMethods(void)
return &_pr_fileMethods;
}
static PRIOMethods _pr_pipeMethods = {
PR_DESC_PIPE,
FileClose,
FileRead,
FileWrite,
#ifdef WIN32
FileAvailable,
FileAvailable64,
#else
PipeAvailable,
PipeAvailable64,
#endif
FileSync,
(PRSeekFN)_PR_InvalidInt,
(PRSeek64FN)_PR_InvalidInt64,
(PRFileInfoFN)_PR_InvalidStatus,
(PRFileInfo64FN)_PR_InvalidStatus,
(PRWritevFN)_PR_InvalidInt,
(PRConnectFN)_PR_InvalidStatus,
(PRAcceptFN)_PR_InvalidDesc,
(PRBindFN)_PR_InvalidStatus,
(PRListenFN)_PR_InvalidStatus,
(PRShutdownFN)_PR_InvalidStatus,
(PRRecvFN)_PR_InvalidInt,
(PRSendFN)_PR_InvalidInt,
(PRRecvfromFN)_PR_InvalidInt,
(PRSendtoFN)_PR_InvalidInt,
FilePoll,
(PRAcceptreadFN)_PR_InvalidInt,
(PRTransmitfileFN)_PR_InvalidInt,
(PRGetsocknameFN)_PR_InvalidStatus,
(PRGetpeernameFN)_PR_InvalidStatus,
(PRGetsockoptFN)_PR_InvalidStatus,
(PRSetsockoptFN)_PR_InvalidStatus,
(PRGetsocketoptionFN)_PR_InvalidStatus,
(PRSetsocketoptionFN)_PR_InvalidStatus
};
PR_IMPLEMENT(PRFileDesc*) PR_Open(const char *name, PRIntn flags, PRIntn mode)
{
PRInt32 osfd;
@ -553,13 +605,13 @@ PR_IMPLEMENT(PRStatus) PR_CreatePipe(
PR_SetError(PR_UNKNOWN_ERROR, GetLastError());
return PR_FAILURE;
}
*readPipe = PR_AllocFileDesc((PRInt32)readEnd, &_pr_fileMethods);
*readPipe = PR_AllocFileDesc((PRInt32)readEnd, &_pr_pipeMethods);
if (NULL == *readPipe) {
CloseHandle(readEnd);
CloseHandle(writeEnd);
return PR_FAILURE;
}
*writePipe = PR_AllocFileDesc((PRInt32)writeEnd, &_pr_fileMethods);
*writePipe = PR_AllocFileDesc((PRInt32)writeEnd, &_pr_pipeMethods);
if (NULL == *writePipe) {
PR_Close(*readPipe);
CloseHandle(writeEnd);
@ -582,13 +634,13 @@ PR_IMPLEMENT(PRStatus) PR_CreatePipe(
PR_SetError(PR_UNKNOWN_ERROR, errno);
return PR_FAILURE;
}
*readPipe = PR_AllocFileDesc(pipefd[0], &_pr_fileMethods);
*readPipe = PR_AllocFileDesc(pipefd[0], &_pr_pipeMethods);
if (NULL == *readPipe) {
close(pipefd[0]);
close(pipefd[1]);
return PR_FAILURE;
}
*writePipe = PR_AllocFileDesc(pipefd[1], &_pr_fileMethods);
*writePipe = PR_AllocFileDesc(pipefd[1], &_pr_pipeMethods);
if (NULL == *writePipe) {
PR_Close(*readPipe);
close(pipefd[1]);

Просмотреть файл

@ -43,17 +43,20 @@ void PR_CALLBACK pl_FDDestructor(PRFileDesc *fd)
*/
static PRStatus PR_CALLBACK pl_TopClose (PRFileDesc *fd)
{
PRStatus status;
PRFileDesc *top;
PR_ASSERT(fd != NULL);
PR_ASSERT(fd->lower != NULL);
PR_ASSERT(fd->secret == NULL);
PR_ASSERT(fd->methods->file_type == PR_DESC_LAYERED);
status = (fd->lower->methods->close)(fd->lower);
fd->lower = fd->higher = NULL;
fd->dtor(fd);
return status;
if (fd->higher != NULL)
{
PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0);
return PR_FAILURE;
}
top = PR_PopIOLayer(fd, PR_TOP_IO_LAYER);
top->dtor(top);
return (fd->methods->close)(fd);
}
static PRInt32 PR_CALLBACK pl_DefRead (PRFileDesc *fd, void *buf, PRInt32 amount)

Просмотреть файл

@ -92,6 +92,7 @@ PRStatus PR_CALLBACK _PR_SocketGetSocketOption(PRFileDesc *fd, PRSocketOptionDat
case PR_SockOpt_Reuseaddr:
case PR_SockOpt_Keepalive:
case PR_SockOpt_NoDelay:
case PR_SockOpt_Broadcast:
{
#ifdef WIN32 /* Winsock */
BOOL value;
@ -242,6 +243,7 @@ PRStatus PR_CALLBACK _PR_SocketSetSocketOption(PRFileDesc *fd, const PRSocketOpt
case PR_SockOpt_Reuseaddr:
case PR_SockOpt_Keepalive:
case PR_SockOpt_NoDelay:
case PR_SockOpt_Broadcast:
{
#ifdef WIN32 /* Winsock */
BOOL value;
@ -454,14 +456,14 @@ PRStatus _PR_MapOptionName(
0, SO_LINGER, SO_REUSEADDR, SO_KEEPALIVE, SO_RCVBUF, SO_SNDBUF,
IP_TTL, IP_TOS, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP,
IP_MULTICAST_IF, IP_MULTICAST_TTL, IP_MULTICAST_LOOP,
TCP_NODELAY, TCP_MAXSEG
TCP_NODELAY, TCP_MAXSEG, SO_BROADCAST
};
static PRInt32 socketLevels[PR_SockOpt_Last] =
{
0, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET,
IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP,
IPPROTO_IP, IPPROTO_IP, IPPROTO_IP,
IPPROTO_TCP, IPPROTO_TCP
IPPROTO_TCP, IPPROTO_TCP, SOL_SOCKET
};
if ((optname < PR_SockOpt_Linger)

Просмотреть файл

@ -80,6 +80,7 @@ struct hostent {
#define INADDR_ANY kOTAnyInetAddress
#define SOL_SOCKET XTI_GENERIC // Any type of socket
#define SO_REUSEADDR IP_REUSEADDR
#define SO_BROADCAST IP_BROADCAST
#define MSG_PEEK 0x2 // Just look at a message waiting, donÕt actually read it.
typedef unsigned long u_long;

Просмотреть файл

@ -30,11 +30,14 @@ CSRCS = \
unix.c \
unix_errors.c \
uxproces.c \
uxwrap.c \
uxpoll.c \
uxshm.c \
uxwrap.c \
$(NULL)
ifneq ($(USE_PTHREADS),1)
CSRCS += uxpoll.c
endif
PTH_USER_CSRCS = \
pthreads_user.c \
$(NULL)

Просмотреть файл

@ -24,9 +24,12 @@ CSRCS = \
uxproces.c \
uxshm.c \
uxwrap.c \
uxpoll.c \
$(NULL)
ifneq ($(USE_PTHREADS),1)
CSRCS += uxpoll.c
endif
PTH_USER_CSRCS = \
pthreads_user.c \
$(NULL)

Просмотреть файл

@ -27,6 +27,8 @@
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/utsname.h>
#ifdef _PR_POLL_AVAILABLE
#include <poll.h>
@ -3691,6 +3693,25 @@ PR_IMPLEMENT(PRStatus) _MD_gethostname(char *name, PRUint32 namelen)
return PR_FAILURE;
}
PR_IMPLEMENT(PRStatus) _MD_getsysinfo(PRSysInfo cmd, char *name, PRUint32 namelen)
{
struct utsname info;
PR_ASSERT((cmd == PR_SI_SYSNAME) || (cmd == PR_SI_RELEASE));
if (uname(&info) == -1) {
_PR_MD_MAP_DEFAULT_ERROR(errno);
return PR_FAILURE;
}
if (PR_SI_SYSNAME == cmd)
(void)PR_snprintf(name, namelen, info.sysname);
else if (PR_SI_RELEASE == cmd)
(void)PR_snprintf(name, namelen, info.release);
else
return PR_FAILURE;
return PR_SUCCESS;
}
/*
*******************************************************************
*

Просмотреть файл

@ -18,8 +18,7 @@
#if defined(_PR_PTHREADS)
/* Some compilers don't like an empty source file. */
static int dummy = 0;
#error "This file should not be compiled"
#else /* defined(_PR_PTHREADS) */
@ -681,5 +680,5 @@ PRInt32 _MD_pr_poll(PRPollDesc *pds, PRIntn npds, PRIntervalTime timeout)
#endif /* defined(_PR_PTHREADS) */
/* pruxpoll.c */
/* uxpoll.c */

Просмотреть файл

@ -551,6 +551,75 @@ PRStatus _MD_WindowsGetHostName(char *name, PRUint32 namelen)
return PR_FAILURE;
}
PRStatus _MD_WindowsGetSysInfo(PRSysInfo cmd, char *name, PRUint32 namelen)
{
OSVERSIONINFO osvi;
PR_ASSERT((cmd == PR_SI_SYSNAME) || (cmd == PR_SI_RELEASE));
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (! GetVersionEx (&osvi) ) {
_PR_MD_MAP_DEFAULT_ERROR(GetLastError());
return PR_FAILURE;
}
switch (osvi.dwPlatformId) {
case VER_PLATFORM_WIN32_NT:
if (PR_SI_SYSNAME == cmd)
(void)PR_snprintf(name, namelen, "Windows_NT");
else if (PR_SI_RELEASE == cmd)
(void)PR_snprintf(name, namelen, "%d.%d",osvi.dwMajorVersion,
osvi.dwMinorVersion);
break;
case VER_PLATFORM_WIN32_WINDOWS:
if (PR_SI_SYSNAME == cmd) {
if ((osvi.dwMajorVersion > 4) ||
((osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0)))
(void)PR_snprintf(name, namelen, "Windows_98");
else
(void)PR_snprintf(name, namelen, "Windows_95");
} else if (PR_SI_RELEASE == cmd) {
(void)PR_snprintf(name, namelen, "%d.%d",osvi.dwMajorVersion,
osvi.dwMinorVersion);
}
break;
default:
if (PR_SI_SYSNAME == cmd)
(void)PR_snprintf(name, namelen, "Windows_Unknown");
else if (PR_SI_RELEASE == cmd)
(void)PR_snprintf(name, namelen, "%d.%d",0,0);
break;
}
return PR_SUCCESS;
}
PRStatus _MD_WindowsGetReleaseName(char *name, PRUint32 namelen)
{
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (! GetVersionEx (&osvi) ) {
_PR_MD_MAP_DEFAULT_ERROR(GetLastError());
return PR_FAILURE;
}
switch (osvi.dwPlatformId) {
case VER_PLATFORM_WIN32_NT:
case VER_PLATFORM_WIN32_WINDOWS:
(void)PR_snprintf(name, namelen, "%d.%d",osvi.dwMajorVersion,
osvi.dwMinorVersion);
break;
default:
(void)PR_snprintf(name, namelen, "%d.%d",0,0);
break;
}
return PR_SUCCESS;
}
/*
**********************************************************************
*

Просмотреть файл

@ -874,51 +874,27 @@ _PR_MD_RMDIR(const char *name)
PRStatus
_PR_MD_LOCKFILE(PRInt32 f)
{
PRInt32 rv;
PRStatus rc = PR_SUCCESS;
DWORD rv;
/*
* loop trying to LockFile(),
* pause for a few miliseconds when can't get the lock
* and try again
*/
for( rv = FALSE; rv == FALSE; /* do nothing */ )
{
rv = LockFile( (HANDLE) f,
0l, 0l,
0x7fffffff, 0xffffffff );
if ( rv == FALSE )
{
DWORD rc = GetLastError();
Sleep( 50 ); // Sleep() a few milisecs and try again.
}
} /* end for() */
return PR_SUCCESS;
rv = LockFile( (HANDLE)f,
0l, 0l,
0x0l, 0xffffffffl );
if ( rv == 0 ) {
DWORD rc = GetLastError();
PR_LOG( _pr_io_lm, PR_LOG_ERROR,
("_PR_MD_LOCKFILE() failed. Error: %d", rc ));
rc = PR_FAILURE;
}
return rc;
} /* end _PR_MD_LOCKFILE() */
PRStatus
_PR_MD_TLOCKFILE(PRInt32 f)
{
PRInt32 rv;
/*
* loop trying to LockFile(),
* pause for a few miliseconds when can't get the lock
* and try again
*/
for( rv = FALSE; rv == FALSE; /* do nothing */ )
{
rv = LockFile( (HANDLE) f,
0l, 0l,
0x7fffffff, 0xffffffff );
if ( rv == FALSE )
{
DWORD rc = GetLastError();
Sleep( 50 ); // Sleep() a few milisecs and try again.
}
} /* end for() */
return PR_SUCCESS;
PR_SetError( PR_NOT_IMPLEMENTED_ERROR, 0 );
return PR_FAILURE;
} /* end _PR_MD_TLOCKFILE() */
@ -929,7 +905,7 @@ _PR_MD_UNLOCKFILE(PRInt32 f)
rv = UnlockFile( (HANDLE) f,
0l, 0l,
0x7fffffff, 0xffffffff );
0x0l, 0xffffffffl );
if ( rv )
{
@ -937,7 +913,7 @@ _PR_MD_UNLOCKFILE(PRInt32 f)
}
else
{
int err = GetLastError();
_PR_MD_MAP_DEFAULT_ERROR(GetLastError());
return PR_FAILURE;
}
} /* end _PR_MD_UNLOCKFILE() */

Просмотреть файл

@ -68,17 +68,19 @@ PR_IMPLEMENT(PRStatus) PR_GetSystemInfo(PRSysInfo cmd, char *buf, PRUint32 bufle
case PR_SI_SYSNAME:
/* Return the operating system name */
#if defined(XP_UNIX) || defined(WIN32)
if (PR_FAILURE == _PR_MD_GETSYSINFO(cmd, buf, (PRUintn)buflen))
return PR_FAILURE;
#else
(void)PR_snprintf(buf, buflen, _PR_SI_SYSNAME);
#endif
break;
case PR_SI_RELEASE:
/* Return the version of the operating system */
#if defined(XP_UNIX)
{
struct utsname info;
uname(&info);
(void)PR_snprintf(buf, buflen, info.release);
}
#if defined(XP_UNIX) || defined(WIN32)
if (PR_FAILURE == _PR_MD_GETSYSINFO(cmd, buf, (PRUintn)buflen))
return PR_FAILURE;
#endif
#if defined(XP_OS2)
{
@ -101,6 +103,10 @@ PR_IMPLEMENT(PRStatus) PR_GetSystemInfo(PRSysInfo cmd, char *buf, PRUint32 bufle
/* Return the architecture of the machine (ie. x86, mips, alpha, ...)*/
(void)PR_snprintf(buf, buflen, _PR_SI_ARCHITECTURE);
break;
default:
PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
return PR_FAILURE;
break;
}
return PR_SUCCESS;
}

Просмотреть файл

@ -69,8 +69,11 @@ static PRVersionDescription prVersionDescription_libnspr3 =
/*
* Version information for the 'ident' and 'what commands
*
* NOTE: the first component of the concatenated rcsid string
* must not end in a '$' to prevent rcs keyword substitution.
*/
static char rcsid[] = "$Version: NSPR " PR_VERSION _DEBUG_STRING
static char rcsid[] = "$Header: NSPR " PR_VERSION _DEBUG_STRING
" " _BUILD_STRING " $";
static char sccsid[] = "@(#)NSPR " PR_VERSION _DEBUG_STRING
" " _BUILD_STRING;

Просмотреть файл

@ -2639,6 +2639,7 @@ static PRStatus pt_GetSocketOption(PRFileDesc *fd, PRSocketOptionData *data)
case PR_SockOpt_Reuseaddr:
case PR_SockOpt_Keepalive:
case PR_SockOpt_NoDelay:
case PR_SockOpt_Broadcast:
{
PRIntn value;
length = sizeof(PRIntn);
@ -2757,6 +2758,7 @@ static PRStatus pt_SetSocketOption(PRFileDesc *fd, const PRSocketOptionData *dat
case PR_SockOpt_Reuseaddr:
case PR_SockOpt_Keepalive:
case PR_SockOpt_NoDelay:
case PR_SockOpt_Broadcast:
{
PRIntn value = (data->value.reuse_addr) ? 1 : 0;
rv = setsockopt(
@ -2865,6 +2867,39 @@ static PRIOMethods _pr_file_methods = {
(PRSetsocketoptionFN)_PR_InvalidStatus
};
static PRIOMethods _pr_pipe_methods = {
PR_DESC_PIPE,
pt_Close,
pt_Read,
pt_Write,
pt_Available_s,
pt_Available64_s,
pt_Fsync,
(PRSeekFN)_PR_InvalidInt,
(PRSeek64FN)_PR_InvalidInt64,
(PRFileInfoFN)_PR_InvalidStatus,
(PRFileInfo64FN)_PR_InvalidStatus,
(PRWritevFN)_PR_InvalidInt,
(PRConnectFN)_PR_InvalidStatus,
(PRAcceptFN)_PR_InvalidDesc,
(PRBindFN)_PR_InvalidStatus,
(PRListenFN)_PR_InvalidStatus,
(PRShutdownFN)_PR_InvalidStatus,
(PRRecvFN)_PR_InvalidInt,
(PRSendFN)_PR_InvalidInt,
(PRRecvfromFN)_PR_InvalidInt,
(PRSendtoFN)_PR_InvalidInt,
pt_Poll,
(PRAcceptreadFN)_PR_InvalidInt,
(PRTransmitfileFN)_PR_InvalidInt,
(PRGetsocknameFN)_PR_InvalidStatus,
(PRGetpeernameFN)_PR_InvalidStatus,
(PRGetsockoptFN)_PR_InvalidStatus,
(PRSetsockoptFN)_PR_InvalidStatus,
(PRGetsocketoptionFN)_PR_InvalidStatus,
(PRSetsocketoptionFN)_PR_InvalidStatus
};
static PRIOMethods _pr_tcp_methods = {
PR_DESC_SOCKET_TCP,
pt_Close,
@ -3017,6 +3052,9 @@ static PRFileDesc *pt_SetMethods(PRIntn osfd, PRDescType type)
flags |= _PR_FCNTL_FLAGS;
(void)fcntl(osfd, F_SETFL, flags);
break;
case PR_DESC_PIPE:
fd->methods = PR_GetPipeMethods();
break;
default:
break;
}
@ -3029,6 +3067,11 @@ PR_IMPLEMENT(const PRIOMethods*) PR_GetFileMethods()
return &_pr_file_methods;
} /* PR_GetFileMethods */
PR_IMPLEMENT(const PRIOMethods*) PR_GetPipeMethods()
{
return &_pr_pipe_methods;
} /* PR_GetFileMethods */
PR_IMPLEMENT(const PRIOMethods*) PR_GetTCPMethods()
{
return &_pr_tcp_methods;
@ -3658,7 +3701,7 @@ PR_IMPLEMENT(PRStatus) PR_CreatePipe(
PR_SetError(PR_UNKNOWN_ERROR, errno);
return PR_FAILURE;
}
*readPipe = pt_SetMethods(pipefd[0], PR_DESC_FILE);
*readPipe = pt_SetMethods(pipefd[0], PR_DESC_PIPE);
if (NULL == *readPipe)
{
close(pipefd[0]);
@ -3668,7 +3711,7 @@ PR_IMPLEMENT(PRStatus) PR_CreatePipe(
flags = fcntl(pipefd[0], F_GETFL, 0);
flags |= _PR_FCNTL_FLAGS;
(void)fcntl(pipefd[0], F_SETFL, flags);
*writePipe = pt_SetMethods(pipefd[1], PR_DESC_FILE);
*writePipe = pt_SetMethods(pipefd[1], PR_DESC_PIPE);
if (NULL == *writePipe)
{
PR_Close(*readPipe);

Просмотреть файл

@ -593,7 +593,7 @@ PR_IMPLEMENT(PRThreadPriority) PR_GetThreadPriority(const PRThread *thred)
PR_IMPLEMENT(void) PR_SetThreadPriority(PRThread *thred, PRThreadPriority newPri)
{
PRIntn rv;
PRIntn rv = -1;
PR_ASSERT(NULL != thred);
@ -605,7 +605,6 @@ PR_IMPLEMENT(void) PR_SetThreadPriority(PRThread *thred, PRThreadPriority newPri
#if defined(_PR_DCETHREADS)
rv = pthread_setprio(thred->id, pt_PriorityMap(newPri));
/* pthread_setprio returns the old priority */
PR_ASSERT(-1 != rv);
#elif defined(_POSIX_THREAD_PRIORITY_SCHEDULING)
if (EPERM != pt_schedpriv)
{
@ -613,19 +612,23 @@ PR_IMPLEMENT(void) PR_SetThreadPriority(PRThread *thred, PRThreadPriority newPri
struct sched_param schedule;
rv = pthread_getschedparam(thred->id, &policy, &schedule);
PR_ASSERT(0 == rv);
schedule.sched_priority = pt_PriorityMap(newPri);
rv = pthread_setschedparam(thred->id, policy, &schedule);
if (EPERM == rv)
{
pt_schedpriv = EPERM;
PR_LOG(_pr_thread_lm, PR_LOG_MIN,
("PR_SetThreadPriority: no thread scheduling privilege"));
}
if(0 == rv) {
schedule.sched_priority = pt_PriorityMap(newPri);
rv = pthread_setschedparam(thred->id, policy, &schedule);
if (EPERM == rv)
{
pt_schedpriv = EPERM;
PR_LOG(_pr_thread_lm, PR_LOG_MIN,
("PR_SetThreadPriority: no thread scheduling privilege"));
}
}
if (rv != 0)
rv = -1;
}
#endif
thred->priority = newPri;
if (rv != -1)
thred->priority = newPri;
} /* PR_SetThreadPriority */
#if 0

Просмотреть файл

@ -249,7 +249,6 @@ int err;
PR_IMPLEMENT(void)
PR_RWLock_Wlock(PRRWLock *rwlock)
{
PRInt32 lock_acquired = 0;
#if defined(DEBUG)
PRThread *me = PR_GetCurrentThread();
#endif

Просмотреть файл

@ -57,6 +57,7 @@ CSRCS = \
dtoa.c \
errcodes.c \
exit.c \
fdcach.c \
fileio.c \
foreign.c \
forktest.c \
@ -267,7 +268,8 @@ endif
ifeq ($(OS_ARCH), HP-UX)
LDOPTS += -z -Wl,+s,+b,$(ABSOLUTE_LIB_DIR)
ifeq ($(USE_64),1)
LDOPTS += -L/usr/lib/pa20_64 -lpthread +DD64
LDOPTS += +DA2.0W
EXTRA_LIBS = -lpthread
endif
endif

Просмотреть файл

@ -765,6 +765,7 @@ static void PR_CALLBACK Server(void *arg)
server->listener = PR_Socket(domain, SOCK_STREAM, protocol);
memset(&serverAddress, 0, sizeof(serverAddress));
rv = PR_InitializeNetAddr(PR_IpAddrAny, DEFAULT_PORT, &serverAddress);
rv = PR_Bind(server->listener, &serverAddress);

Просмотреть файл

@ -66,6 +66,11 @@ int main()
exit(1);
}
status = PR_SetFDInheritable(in_pipe[0], PR_FALSE);
if (status == PR_FAILURE) {
fprintf(stderr, "PR_SetFDInheritable failed\n");
exit(1);
}
status = PR_SetFDInheritable(in_pipe[1], PR_TRUE);
if (status == PR_FAILURE) {
fprintf(stderr, "PR_SetFDInheritable failed\n");
@ -76,6 +81,11 @@ int main()
fprintf(stderr, "PR_SetFDInheritable failed\n");
exit(1);
}
status = PR_SetFDInheritable(out_pipe[1], PR_FALSE);
if (status == PR_FAILURE) {
fprintf(stderr, "PR_SetFDInheritable failed\n");
exit(1);
}
attr = PR_NewProcessAttr();
if (attr == NULL) {

Просмотреть файл

@ -162,6 +162,7 @@ int main(int argc, char **argv)
failed_already=1;
goto exit_now;
}
memset(&addr, 0, sizeof(addr));
addr.inet.family = PR_AF_INET;
addr.inet.ip = PR_htonl(PR_INADDR_ANY);
addr.inet.port = PR_htons(0);

Просмотреть файл

@ -105,6 +105,7 @@ int main(int argc, char **argv)
if (!debug_mode) failed_already=1;
goto exit_now;
}
memset(&addr, 0, sizeof(addr));
addr.inet.family = PR_AF_INET;
addr.inet.ip = PR_htonl(PR_INADDR_ANY);
addr.inet.port = PR_htons(0);

Просмотреть файл

@ -934,6 +934,7 @@ static void PR_CALLBACK Server(void *arg)
server->listener = PR_Socket(domain, SOCK_STREAM, protocol);
memset(&serverAddress, 0, sizeof(serverAddress));
rv = PR_InitializeNetAddr(PR_IpAddrAny, DEFAULT_PORT, &serverAddress);
rv = PR_Bind(server->listener, &serverAddress);

Просмотреть файл

@ -83,6 +83,7 @@ dlltest
dtoa
errcodes
exit
fdcach
fileio
foreign
fsync
@ -162,6 +163,8 @@ version
writev
xnotify"
rval=0
OBJDIR=`basename $PWD`
echo "\nNSPR Test Results - $OBJDIR\n"
echo "BEGIN\t\t\t`date`"
@ -176,7 +179,10 @@ if [ 0 = $? ] ; then
echo "\t\t\tPassed";
else
echo "\t\t\tFAILED";
rval=1
fi;
echo "\nEND TEST: $prog\n" >> ${LOGFILE} 2>&1
done
echo "END\t\t\t`date`"
exit $rval

Просмотреть файл

@ -66,6 +66,7 @@ int main()
fprintf(stderr, "write to broken pipe failed but with wrong errno: %d\n", errno);
exit(1);
}
close(pipefd[1]);
printf("write to broken pipe failed with EPIPE, as expected\n");
printf("PASSED\n");
return 0;

Просмотреть файл

@ -84,6 +84,7 @@ PRIntn main(PRIntn argc, char *argv)
"PR_SockOpt_NoDelay", /* don't delay send to coalesce packets */
"PR_SockOpt_MaxSegment", /* maximum segment size */
"PR_SockOpt_Broadcast", /* Enable broadcast */
"PR_SockOpt_Last"
};
@ -143,6 +144,10 @@ PRIntn main(PRIntn argc, char *argv)
value = &ttl;
size = &ttlsize;
break;
case PR_SockOpt_Broadcast:
value = &boolean;
size = &booleansize;
break;
case PR_SockOpt_IpTypeOfService: /* type of service and precedence */
case PR_SockOpt_AddMember: /* add an IP group membership */
case PR_SockOpt_DropMember: /* drop an IP group membership */
@ -218,6 +223,10 @@ PRIntn main(PRIntn argc, char *argv)
data.value.max_segment = segment;
break;
#endif
case PR_SockOpt_Broadcast:
fd = udp;
data.value.broadcast = PR_TRUE;
break;
default: continue;
}
@ -239,6 +248,8 @@ PRIntn main(PRIntn argc, char *argv)
rv = PR_GetSocketOption(fd, &data);
if (PR_FAILURE == rv) Failed("PR_GetSocketOption()", tag[option]);
}
PR_Close(udp);
PR_Close(tcp);
}
#ifndef XP_MAC
PR_fprintf(err, "%s\n", (failed) ? "FAILED" : "PASSED");

Просмотреть файл

@ -59,6 +59,12 @@ int main()
exit(1);
}
status = PR_SetFDInheritable(sock[0], PR_FALSE);
if (status == PR_FAILURE) {
fprintf(stderr, "PR_SetFDInheritable failed: (%d, %d)\n",
PR_GetError(), PR_GetOSError());
exit(1);
}
status = PR_SetFDInheritable(sock[1], PR_TRUE);
if (status == PR_FAILURE) {
fprintf(stderr, "PR_SetFDInheritable failed: (%d, %d)\n",

Просмотреть файл

@ -41,7 +41,9 @@ typedef struct _DataRecord {
#define MAX_THREAD_CNT 100
#define DEFAULT_THREAD_CNT 4
#define DEFAULT_DATA_CNT 4
#define DEFAULT_DATA_CNT 100
#define DEFAULT_LOOP_CNT 10000
/*
* sum of the first n numbers using the formula n*(n+1)/2
*/
@ -52,6 +54,7 @@ typedef struct stack_data {
PRStack *list2;
PRInt32 initial_data_value;
PRInt32 data_cnt;
PRInt32 loops;
} stack_data;
static void stackop(void *arg);
@ -71,11 +74,12 @@ PRIntn main(PRIntn argc, char **argv)
PRInt32 thread_cnt = DEFAULT_THREAD_CNT;
PRInt32 data_cnt = DEFAULT_DATA_CNT;
PRInt32 loops = DEFAULT_LOOP_CNT;
PRThread **threads;
stack_data *thread_args;
PLOptStatus os;
PLOptState *opt = PL_CreateOptState(argc, argv, "dt:c:");
PLOptState *opt = PL_CreateOptState(argc, argv, "dt:c:l:");
while (PL_OPT_EOL != (os = PL_GetNextOpt(opt)))
{
@ -91,6 +95,9 @@ PRIntn main(PRIntn argc, char **argv)
case 'c': /* data count */
data_cnt = atoi(opt->value);
break;
case 'l': /* loop count */
loops = atoi(opt->value);
break;
default:
break;
}
@ -127,6 +134,7 @@ PRIntn main(PRIntn argc, char **argv)
thread_args[cnt].list1 = list1;
thread_args[cnt].list2 = list2;
thread_args[cnt].loops = loops;
thread_args[cnt].data_cnt = data_cnt;
thread_args[cnt].initial_data_value = 1 + cnt * data_cnt;
@ -211,7 +219,7 @@ PRIntn main(PRIntn argc, char **argv)
static void stackop(void *thread_arg)
{
PRInt32 val, cnt, index;
PRInt32 val, cnt, index, loops;
DataRecord *Items, *Item;
PRStack *list1, *list2;
PRStackElem *node;
@ -219,6 +227,7 @@ static void stackop(void *thread_arg)
val = arg->initial_data_value;
cnt = arg->data_cnt;
loops = arg->loops;
list1 = arg->list1;
list2 = arg->list2;
@ -244,6 +253,22 @@ static void stackop(void *thread_arg)
index++;
}
/*
* pop data records from list1 and add them back to list1
* generates contention for the stack accesses
*/
while (loops-- > 0) {
cnt = arg->data_cnt;
while (cnt-- > 0) {
node = PR_StackPop(list1);
if (node == NULL) {
PR_fprintf(errhandle, "Error - PR_StackPop returned NULL\n");
PR_ASSERT(node != NULL);
PR_ProcessExit(3);
}
PR_StackPush(list1, node);
}
}
/*
* remove the data records from list1 and add them to list2
*/