mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
- Small fixes to fcntl() and select() to cover the thread-safe
fd->fd_DefaultFile == ZERO case. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14901 87f5fb63-7c3d-0410-a384-fd976d0f7a62
This commit is contained in:
@ -130,15 +130,12 @@
|
|||||||
be pulled in only if something references the HUGE_VAL
|
be pulled in only if something references the HUGE_VAL
|
||||||
constant.
|
constant.
|
||||||
|
|
||||||
- The thread-safe system() call now blocks all standard I/O operations
|
|
||||||
until the function has returned. Which is harsh, but there is no
|
|
||||||
elegant solution to the issue of keeping the same dos.library
|
|
||||||
file handles from concurrent use which SystemTagList() might just
|
|
||||||
end up using.
|
|
||||||
|
|
||||||
- Activated the dormant thread-safe standard input/output/error
|
- Activated the dormant thread-safe standard input/output/error
|
||||||
handling code.
|
handling code.
|
||||||
|
|
||||||
|
- Small fixes to fcntl() and select() to cover the thread-safe
|
||||||
|
fd->fd_DefaultFile == ZERO case.
|
||||||
|
|
||||||
|
|
||||||
c.lib 1.189 (5.3.2005)
|
c.lib 1.189 (5.3.2005)
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_fcntl.c,v 1.13 2005-03-16 09:28:37 obarthel Exp $
|
* $Id: fcntl_fcntl.c,v 1.14 2005-03-25 08:50:59 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@ -90,6 +90,12 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(fd->fd_DefaultFile == ZERO)
|
||||||
|
{
|
||||||
|
__set_errno(EBADF);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
va_start(arg,cmd);
|
va_start(arg,cmd);
|
||||||
l = va_arg(arg,struct flock *);
|
l = va_arg(arg,struct flock *);
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
@ -140,6 +146,12 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
|
|
||||||
SHOWMSG("cmd=F_SETFL");
|
SHOWMSG("cmd=F_SETFL");
|
||||||
|
|
||||||
|
if(fd->fd_DefaultFile == ZERO)
|
||||||
|
{
|
||||||
|
__set_errno(EBADF);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
va_start(arg,cmd);
|
va_start(arg,cmd);
|
||||||
flags = va_arg(arg,int);
|
flags = va_arg(arg,int);
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_select.c,v 1.8 2005-03-18 12:38:23 obarthel Exp $
|
* $Id: socket_select.c,v 1.9 2005-03-25 08:50:59 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@ -309,7 +309,7 @@ map_descriptor_sets(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We only watch files bound to console streams. */
|
/* We only watch files bound to console streams. */
|
||||||
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_INTERACTIVE))
|
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_INTERACTIVE) || fd->fd_DefaultFile == ZERO)
|
||||||
{
|
{
|
||||||
SHOWMSG("this is a file");
|
SHOWMSG("this is a file");
|
||||||
continue;
|
continue;
|
||||||
@ -761,7 +761,7 @@ select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct
|
|||||||
{
|
{
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_READ))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_READ))
|
||||||
{
|
{
|
||||||
assert( FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) );
|
assert( FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) && fd->fd_DefaultFile != ZERO );
|
||||||
|
|
||||||
/* Does this one have input? */
|
/* Does this one have input? */
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
@ -921,7 +921,7 @@ select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct
|
|||||||
{
|
{
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_READ))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_READ))
|
||||||
{
|
{
|
||||||
assert( FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) );
|
assert( FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) && fd->fd_DefaultFile != ZERO );
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_constructor_begin.c,v 1.9 2005-03-20 12:14:09 obarthel Exp $
|
* $Id: stdlib_constructor_begin.c,v 1.10 2005-03-25 08:50:59 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@ -52,7 +52,12 @@ extern void (* __far __dtors[])(void);
|
|||||||
|
|
||||||
/* With SAS/C this function is placed in front of the first constructor
|
/* With SAS/C this function is placed in front of the first constructor
|
||||||
table entry. It will invoke all following constructors and
|
table entry. It will invoke all following constructors and
|
||||||
finally all the destructors. We don't use this approach here. */
|
finally all the destructors. We don't use this approach here and
|
||||||
|
we can't because the naming scheme we use for the constructor and
|
||||||
|
destructor functions differs from the default SAS/C usage. With
|
||||||
|
SAS/C the default behaviour is to invoke the constructors in
|
||||||
|
ascending order of priority. We invoke them in descending order of
|
||||||
|
priority (highest first). */
|
||||||
void
|
void
|
||||||
__construct(void)
|
__construct(void)
|
||||||
{
|
{
|
||||||
@ -71,6 +76,7 @@ _init(void)
|
|||||||
int num_constructors;
|
int num_constructors;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* Count the number of constructors we have to deal with. */
|
||||||
num_constructors = 0;
|
num_constructors = 0;
|
||||||
|
|
||||||
while(__ctors[num_constructors] != NULL)
|
while(__ctors[num_constructors] != NULL)
|
||||||
@ -98,6 +104,7 @@ _fini(void)
|
|||||||
|
|
||||||
int num_destructors;
|
int num_destructors;
|
||||||
|
|
||||||
|
/* Count the number of destructors we have to deal with. */
|
||||||
num_destructors = 0;
|
num_destructors = 0;
|
||||||
|
|
||||||
while(__dtors[num_destructors] != NULL)
|
while(__dtors[num_destructors] != NULL)
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_system.c,v 1.6 2005-03-24 15:31:16 obarthel Exp $
|
* $Id: stdlib_system.c,v 1.7 2005-03-25 08:50:59 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@ -177,17 +177,13 @@ system(const char * command)
|
|||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
/* In thread-safe mode, system() operation can interfere with
|
/* Push all currently buffered output towards the file handles,
|
||||||
regular file I/O if the same dos.library file handles are
|
in case the program to be launched writes to these files
|
||||||
involved. Because we really cannot predict which file handles
|
or the console, too. */
|
||||||
will be associated with the current Output() and Input()
|
__flush_all_files(-1);
|
||||||
streams, we play it safe and just block everything. */
|
|
||||||
__stdio_lock();
|
|
||||||
|
|
||||||
result = SystemTagList((STRPTR)command, (struct TagItem *)system_tags);
|
result = SystemTagList((STRPTR)command, (struct TagItem *)system_tags);
|
||||||
|
|
||||||
__stdio_unlock();
|
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user