mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
- Rewrote the code that allocates the file descriptor and file
buffer tables so that all the memory allocations are in one place and it's possible to specify exactly how many table entries are required at a time. - Creation and initialization of semaphores now uses the AmigaOS4 specific functions for this purpose, if available. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14857 87f5fb63-7c3d-0410-a384-fd976d0f7a62
This commit is contained in:
@ -96,6 +96,14 @@
|
||||
harder to break code by accidentally forgetting to call
|
||||
InitSemaphore() after having allocated the memory for it.
|
||||
|
||||
- Rewrote the code that allocates the file descriptor and file
|
||||
buffer tables so that all the memory allocations are in one
|
||||
place and it's possible to specify exactly how many table
|
||||
entries are required at a time.
|
||||
|
||||
- Creation and initialization of semaphores now uses the AmigaOS4
|
||||
specific functions for this purpose, if available.
|
||||
|
||||
|
||||
c.lib 1.188 (7.2.2005)
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: fcntl_fcntl.c,v 1.11 2005-02-28 13:22:53 obarthel Exp $
|
||||
* $Id: fcntl_fcntl.c,v 1.12 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -216,30 +216,18 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
||||
goto out;
|
||||
}
|
||||
|
||||
__stdio_lock();
|
||||
|
||||
/* Check if we have that many fd's already */
|
||||
while(fdbase >= __num_fd)
|
||||
{
|
||||
__stdio_unlock();
|
||||
|
||||
if(__check_abort_enabled)
|
||||
__check_abort();
|
||||
|
||||
/* No; enlarge it */
|
||||
if(__grow_fd_table() < 0)
|
||||
goto out;
|
||||
|
||||
__stdio_lock();
|
||||
}
|
||||
|
||||
__stdio_unlock();
|
||||
/* Make sure that we have the required number of file
|
||||
descriptors available. */
|
||||
if(__grow_fd_table(fdbase + 1) < 0)
|
||||
goto out;
|
||||
|
||||
vacant_slot = -1;
|
||||
|
||||
/* Guaranteed to have enough here */
|
||||
do
|
||||
{
|
||||
__stdio_unlock();
|
||||
|
||||
if(__check_abort_enabled)
|
||||
__check_abort();
|
||||
|
||||
@ -254,10 +242,8 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
||||
}
|
||||
}
|
||||
|
||||
__stdio_unlock();
|
||||
|
||||
/* Didn't really find any, grow the table further */
|
||||
if(vacant_slot < 0 && __grow_fd_table() < 0)
|
||||
if(vacant_slot < 0 && __grow_fd_table(0) < 0)
|
||||
goto out;
|
||||
}
|
||||
while(vacant_slot < 0);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: fcntl_open.c,v 1.13 2005-03-03 14:20:55 obarthel Exp $
|
||||
* $Id: fcntl_open.c,v 1.14 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -144,7 +144,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
||||
fd_slot_number = __find_vacant_fd_entry();
|
||||
if(fd_slot_number < 0)
|
||||
{
|
||||
if(__grow_fd_table() < 0)
|
||||
if(__grow_fd_table(0) < 0)
|
||||
{
|
||||
SHOWMSG("couldn't find a vacant file descriptor, and couldn't allocate one either");
|
||||
goto out;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_accept.c,v 1.8 2005-03-03 14:20:55 obarthel Exp $
|
||||
* $Id: socket_accept.c,v 1.9 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -94,7 +94,7 @@ accept(int sockfd,struct sockaddr *cliaddr,int *addrlen)
|
||||
new_fd_slot_number = __find_vacant_fd_entry();
|
||||
if(new_fd_slot_number < 0)
|
||||
{
|
||||
if(__grow_fd_table() < 0)
|
||||
if(__grow_fd_table(0) < 0)
|
||||
{
|
||||
SHOWMSG("couldn't find a vacant fd slot and no memory to create one");
|
||||
goto out;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_socket.c,v 1.6 2005-03-03 14:20:55 obarthel Exp $
|
||||
* $Id: socket_socket.c,v 1.7 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -61,7 +61,7 @@ socket(int domain,int type,int protocol)
|
||||
fd_slot_number = __find_vacant_fd_entry();
|
||||
if(fd_slot_number < 0)
|
||||
{
|
||||
if(__grow_fd_table() < 0)
|
||||
if(__grow_fd_table(0) < 0)
|
||||
{
|
||||
SHOWMSG("couldn't find a vacant fd slot and no memory to create one");
|
||||
goto out;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_fopen.c,v 1.5 2005-02-27 21:58:21 obarthel Exp $
|
||||
* $Id: stdio_fopen.c,v 1.6 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -76,7 +76,7 @@ fopen(const char *filename, const char *mode)
|
||||
slot_number = __find_vacant_iob_entry();
|
||||
if(slot_number < 0)
|
||||
{
|
||||
if(__grow_iob_table() < 0)
|
||||
if(__grow_iob_table(0) < 0)
|
||||
{
|
||||
SHOWMSG("couldn't find a free file table, and no memory for a new one");
|
||||
goto out;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_growfdtable.c,v 1.3 2005-02-03 16:56:16 obarthel Exp $
|
||||
* $Id: stdio_growfdtable.c,v 1.4 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -44,54 +44,64 @@
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
__grow_fd_table(void)
|
||||
__grow_fd_table(int max_fd)
|
||||
{
|
||||
const int granularity = 10;
|
||||
struct fd ** new_fd;
|
||||
int new_num_fd;
|
||||
int result = -1;
|
||||
int i;
|
||||
|
||||
new_num_fd = __num_fd + granularity;
|
||||
if(max_fd == 0)
|
||||
new_num_fd = __num_fd + granularity;
|
||||
else
|
||||
new_num_fd = max_fd;
|
||||
|
||||
new_fd = malloc(sizeof(*new_fd) * new_num_fd);
|
||||
if(new_fd == NULL)
|
||||
if(new_num_fd > __num_fd)
|
||||
{
|
||||
SHOWMSG("not enough memory for new file descriptor table");
|
||||
struct fd ** new_fd;
|
||||
int i;
|
||||
|
||||
__set_errno(ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
|
||||
for(i = __num_fd ; i < new_num_fd ; i++)
|
||||
{
|
||||
new_fd[i] = malloc(sizeof(*new_fd[i]));
|
||||
if(new_fd[i] == NULL)
|
||||
new_fd = malloc(sizeof(*new_fd) * new_num_fd);
|
||||
if(new_fd == NULL)
|
||||
{
|
||||
int j;
|
||||
|
||||
SHOWMSG("not enough memory for new file descriptor table entry");
|
||||
|
||||
for(j = __num_fd ; j < i ; j++)
|
||||
free(new_fd[j]);
|
||||
|
||||
free(new_fd);
|
||||
SHOWMSG("not enough memory for new file descriptor table");
|
||||
|
||||
__set_errno(ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
|
||||
memset(new_fd[i],0,sizeof(*new_fd[i]));
|
||||
for(i = __num_fd ; i < new_num_fd ; i++)
|
||||
{
|
||||
new_fd[i] = malloc(sizeof(*new_fd[i]));
|
||||
if(new_fd[i] == NULL)
|
||||
{
|
||||
int j;
|
||||
|
||||
SHOWMSG("not enough memory for new file descriptor table entry");
|
||||
|
||||
for(j = __num_fd ; j < i ; j++)
|
||||
free(new_fd[j]);
|
||||
|
||||
free(new_fd);
|
||||
|
||||
__set_errno(ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
|
||||
memset(new_fd[i],0,sizeof(*new_fd[i]));
|
||||
}
|
||||
|
||||
if(__fd != NULL)
|
||||
{
|
||||
for(i = 0 ; i < __num_fd ; i++)
|
||||
new_fd[i] = __fd[i];
|
||||
|
||||
free(__fd);
|
||||
}
|
||||
|
||||
__fd = new_fd;
|
||||
__num_fd = new_num_fd;
|
||||
}
|
||||
|
||||
for(i = 0 ; i < __num_fd ; i++)
|
||||
new_fd[i] = __fd[i];
|
||||
|
||||
free(__fd);
|
||||
|
||||
__fd = new_fd;
|
||||
__num_fd = new_num_fd;
|
||||
|
||||
result = 0;
|
||||
|
||||
out:
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_growiobtable.c,v 1.3 2005-02-03 16:56:16 obarthel Exp $
|
||||
* $Id: stdio_growiobtable.c,v 1.4 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -44,54 +44,64 @@
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
__grow_iob_table(void)
|
||||
__grow_iob_table(int max_iob)
|
||||
{
|
||||
const int granularity = 10;
|
||||
struct iob ** new_iob;
|
||||
int new_num_iob;
|
||||
int result = -1;
|
||||
int i;
|
||||
|
||||
new_num_iob = __num_iob + granularity;
|
||||
if(max_iob == 0)
|
||||
new_num_iob = __num_iob + granularity;
|
||||
else
|
||||
new_num_iob = max_iob;
|
||||
|
||||
new_iob = malloc(sizeof(*new_iob) * new_num_iob);
|
||||
if(new_iob == NULL)
|
||||
if(new_num_iob > __num_iob)
|
||||
{
|
||||
SHOWMSG("not enough memory for file table");
|
||||
struct iob ** new_iob;
|
||||
int i;
|
||||
|
||||
__set_errno(ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
|
||||
for(i = __num_iob ; i < new_num_iob ; i++)
|
||||
{
|
||||
new_iob[i] = malloc(sizeof(*new_iob[i]));
|
||||
if(new_iob[i] == NULL)
|
||||
new_iob = malloc(sizeof(*new_iob) * new_num_iob);
|
||||
if(new_iob == NULL)
|
||||
{
|
||||
int j;
|
||||
|
||||
SHOWMSG("not enough memory for file table entry");
|
||||
|
||||
for(j = __num_iob ; j < i ; j++)
|
||||
free(new_iob[j]);
|
||||
|
||||
free(new_iob);
|
||||
SHOWMSG("not enough memory for file table");
|
||||
|
||||
__set_errno(ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
|
||||
memset(new_iob[i],0,sizeof(*new_iob[i]));
|
||||
for(i = __num_iob ; i < new_num_iob ; i++)
|
||||
{
|
||||
new_iob[i] = malloc(sizeof(*new_iob[i]));
|
||||
if(new_iob[i] == NULL)
|
||||
{
|
||||
int j;
|
||||
|
||||
SHOWMSG("not enough memory for file table entry");
|
||||
|
||||
for(j = __num_iob ; j < i ; j++)
|
||||
free(new_iob[j]);
|
||||
|
||||
free(new_iob);
|
||||
|
||||
__set_errno(ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
|
||||
memset(new_iob[i],0,sizeof(*new_iob[i]));
|
||||
}
|
||||
|
||||
if(__iob != NULL)
|
||||
{
|
||||
for(i = 0 ; i < __num_iob ; i++)
|
||||
new_iob[i] = __iob[i];
|
||||
|
||||
free(__iob);
|
||||
}
|
||||
|
||||
__iob = new_iob;
|
||||
__num_iob = new_num_iob;
|
||||
}
|
||||
|
||||
for(i = 0 ; i < __num_iob ; i++)
|
||||
new_iob[i] = __iob[i];
|
||||
|
||||
free(__iob);
|
||||
|
||||
__iob = new_iob;
|
||||
__num_iob = new_num_iob;
|
||||
|
||||
result = 0;
|
||||
|
||||
out:
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_init_exit.c,v 1.22 2005-03-03 14:20:55 obarthel Exp $
|
||||
* $Id: stdio_init_exit.c,v 1.23 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -131,36 +131,12 @@ __stdio_init(void)
|
||||
if(__stdio_lock_init() < 0)
|
||||
goto out;
|
||||
|
||||
__iob = malloc(sizeof(*__iob) * num_standard_files);
|
||||
if(__iob == NULL)
|
||||
if(__grow_iob_table(num_standard_files) < 0)
|
||||
goto out;
|
||||
|
||||
for(i = 0 ; i < num_standard_files ; i++)
|
||||
{
|
||||
__iob[i] = malloc(sizeof(*__iob[i]));
|
||||
if(__iob[i] == NULL)
|
||||
goto out;
|
||||
|
||||
memset(__iob[i],0,sizeof(*__iob[i]));
|
||||
}
|
||||
|
||||
__num_iob = num_standard_files;
|
||||
|
||||
__fd = malloc(sizeof(*__fd) * num_standard_files);
|
||||
if(__fd == NULL)
|
||||
if(__grow_fd_table(num_standard_files) < 0)
|
||||
goto out;
|
||||
|
||||
for(i = 0 ; i < num_standard_files ; i++)
|
||||
{
|
||||
__fd[i] = malloc(sizeof(*__fd[i]));
|
||||
if(__fd[i] == NULL)
|
||||
goto out;
|
||||
|
||||
memset(__fd[i],0,sizeof(*__fd[i]));
|
||||
}
|
||||
|
||||
__num_fd = num_standard_files;
|
||||
|
||||
/* Now initialize the standard I/O streams (input, output, error). */
|
||||
for(i = STDIN_FILENO ; i <= STDERR_FILENO ; i++)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_protos.h,v 1.11 2005-02-28 13:22:53 obarthel Exp $
|
||||
* $Id: stdio_protos.h,v 1.12 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -114,12 +114,12 @@ extern int __find_vacant_iob_entry(void);
|
||||
/****************************************************************************/
|
||||
|
||||
/* stdio_growfdtable.c */
|
||||
extern int __grow_fd_table(void);
|
||||
extern int __grow_fd_table(int max_fd);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* stdio_growiobtable.c */
|
||||
extern int __grow_iob_table(void);
|
||||
extern int __grow_iob_table(int max_fd);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_record_locking.c,v 1.4 2005-02-28 10:07:31 obarthel Exp $
|
||||
* $Id: stdio_record_locking.c,v 1.5 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -147,20 +147,35 @@ obtain_file_lock_semaphore(BOOL shared)
|
||||
{
|
||||
SHOWMSG("didn't find it; we're going to make our own");
|
||||
|
||||
FileLockSemaphore = AllocMem(sizeof(*FileLockSemaphore) + strlen(__file_lock_semaphore_name)+1,MEMF_ANY|MEMF_PUBLIC);
|
||||
#if defined(__amigaos4__)
|
||||
{
|
||||
FileLockSemaphore = AllocSysObjectTags(ASOT_SEMAPHORE,
|
||||
ASOSEM_Size, sizeof(*FileLockSemaphore),
|
||||
ASOSEM_Name, __file_lock_semaphore_name,
|
||||
ASOSEM_Pri, 1,
|
||||
TAG_END);
|
||||
}
|
||||
#else
|
||||
{
|
||||
FileLockSemaphore = AllocMem(sizeof(*FileLockSemaphore) + strlen(__file_lock_semaphore_name)+1,MEMF_ANY|MEMF_PUBLIC);
|
||||
if(FileLockSemaphore != NULL)
|
||||
{
|
||||
memset(FileLockSemaphore,0,sizeof(*FileLockSemaphore));
|
||||
|
||||
InitSemaphore(&FileLockSemaphore->fls_Semaphore);
|
||||
|
||||
FileLockSemaphore->fls_Semaphore.ss_Link.ln_Name = (char *)(FileLockSemaphore + 1);
|
||||
strcpy(FileLockSemaphore->fls_Semaphore.ss_Link.ln_Name,__file_lock_semaphore_name);
|
||||
|
||||
FileLockSemaphore->fls_Semaphore.ss_Link.ln_Pri = 1;
|
||||
}
|
||||
}
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
if(FileLockSemaphore != NULL)
|
||||
{
|
||||
SHOWMSG("adding our own semaphore");
|
||||
|
||||
memset(FileLockSemaphore,0,sizeof(*FileLockSemaphore));
|
||||
|
||||
InitSemaphore(&FileLockSemaphore->fls_Semaphore);
|
||||
|
||||
FileLockSemaphore->fls_Semaphore.ss_Link.ln_Name = (char *)(FileLockSemaphore + 1);
|
||||
strcpy(FileLockSemaphore->fls_Semaphore.ss_Link.ln_Name,__file_lock_semaphore_name);
|
||||
|
||||
FileLockSemaphore->fls_Semaphore.ss_Link.ln_Pri = 1;
|
||||
|
||||
FileLockSemaphore->fls_Size = sizeof(*FileLockSemaphore);
|
||||
NewList((struct List *)&FileLockSemaphore->fls_LockList);
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd_dup2.c,v 1.7 2005-02-27 21:58:21 obarthel Exp $
|
||||
* $Id: unistd_dup2.c,v 1.8 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -75,7 +75,7 @@ dup2(int file_descriptor1, int file_descriptor2)
|
||||
if(file_descriptor2 < 0)
|
||||
{
|
||||
/* No free space, so let's grow the table. */
|
||||
if(__grow_fd_table() < 0)
|
||||
if(__grow_fd_table(0) < 0)
|
||||
{
|
||||
SHOWMSG("not enough memory for new file descriptor");
|
||||
goto out;
|
||||
@ -88,14 +88,8 @@ dup2(int file_descriptor1, int file_descriptor2)
|
||||
else if (file_descriptor1 != file_descriptor2)
|
||||
{
|
||||
/* Make sure the requested duplicate exists. */
|
||||
while(file_descriptor2 >= __num_fd)
|
||||
{
|
||||
if(__check_abort_enabled)
|
||||
__check_abort();
|
||||
|
||||
if(__grow_fd_table() < 0)
|
||||
goto out;
|
||||
}
|
||||
if(__grow_fd_table(file_descriptor2 + 1) < 0)
|
||||
goto out;
|
||||
|
||||
assert( file_descriptor2 >= 0 && file_descriptor2 < __num_fd );
|
||||
assert( __fd[file_descriptor2] != NULL );
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd_fdopen.c,v 1.5 2005-02-27 21:58:21 obarthel Exp $
|
||||
* $Id: unistd_fdopen.c,v 1.6 2005-03-04 09:07:09 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -80,7 +80,7 @@ fdopen(int file_descriptor, const char * type)
|
||||
slot_number = __find_vacant_iob_entry();
|
||||
if(slot_number < 0)
|
||||
{
|
||||
if(__grow_iob_table() < 0)
|
||||
if(__grow_iob_table(0) < 0)
|
||||
{
|
||||
SHOWMSG("not enough memory for a file buffer slot");
|
||||
goto out;
|
||||
|
||||
Reference in New Issue
Block a user