Change stdio to use atexit() rather than the internal __clean variable; this
breaks the dependency between exit/atexit and stdio. Buffers are no longer flushed on abort() (because it's pretty risky). Move the relevant functions into sys/core.
This commit is contained in:
parent
f744a21699
commit
af22b7ea85
|
@ -44,7 +44,7 @@ for _, plat in ipairs(vars.plats) do
|
||||||
"./core/ctype/*.c",
|
"./core/ctype/*.c",
|
||||||
"./core/misc/*.c",
|
"./core/misc/*.c",
|
||||||
"./sys/malloc/*.c",
|
"./sys/malloc/*.c",
|
||||||
"./signal/*.c",
|
"./sys/exit/*.c",
|
||||||
"./assert/*.c",
|
"./assert/*.c",
|
||||||
"./stdio/*.c",
|
"./stdio/*.c",
|
||||||
"./stdlib/*.c",
|
"./stdlib/*.c",
|
||||||
|
|
|
@ -4,17 +4,11 @@
|
||||||
*/
|
*/
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#if defined(_POSIX_SOURCE)
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
extern void (*_clean)(void);
|
#include <signal.h>
|
||||||
|
|
||||||
void abort(void)
|
void abort(void)
|
||||||
{
|
{
|
||||||
if (_clean)
|
|
||||||
_clean(); /* flush all output files */
|
|
||||||
raise(SIGABRT);
|
raise(SIGABRT);
|
||||||
}
|
}
|
|
@ -4,14 +4,17 @@
|
||||||
*/
|
*/
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#if defined(_POSIX_SOURCE)
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
#if ACKCONF_WANT_EMULATED_RAISE
|
||||||
|
|
||||||
int raise(int sig)
|
int raise(int sig)
|
||||||
{
|
{
|
||||||
if (sig < 0 || sig > _NSIG)
|
if (sig < 0 || sig > _NSIG)
|
||||||
return -1;
|
return -1;
|
||||||
return kill(getpid(), sig);
|
return kill(getpid(), sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -24,4 +24,14 @@
|
||||||
#define ACKCONF_WANT_TERMIOS 0
|
#define ACKCONF_WANT_TERMIOS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef ACKCONF_WANT_EMULATED_RAISE
|
||||||
|
/* Implement raise() in terms of kill() and getpid(). */
|
||||||
|
#define ACKCONF_WANT_EMULATED_RAISE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ACKCONF_WANT_MALLOC
|
||||||
|
/* Uses sbrk() to get memory from the system. */
|
||||||
|
#define ACKCONF_WANT_MALLOC 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
raise.c
|
|
|
@ -1,2 +0,0 @@
|
||||||
clean:
|
|
||||||
rm -f raise.o OLIST
|
|
|
@ -68,7 +68,7 @@ int fflush(FILE* stream)
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __cleanup(void)
|
static void cleanup(void)
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
|
|
||||||
|
@ -76,3 +76,13 @@ void __cleanup(void)
|
||||||
if (__iotab[i] && io_testflag(__iotab[i], _IOWRITING))
|
if (__iotab[i] && io_testflag(__iotab[i], _IOWRITING))
|
||||||
(void)fflush(__iotab[i]);
|
(void)fflush(__iotab[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __register_stdio_cleanup(void)
|
||||||
|
{
|
||||||
|
static char registered = 0;
|
||||||
|
if (!registered)
|
||||||
|
{
|
||||||
|
registered = 1;
|
||||||
|
atexit(cleanup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -8,8 +8,6 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "loc_incl.h"
|
#include "loc_incl.h"
|
||||||
|
|
||||||
extern void (*_clean)(void);
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_write(int d, char* buf, int nbytes)
|
do_write(int d, char* buf, int nbytes)
|
||||||
{
|
{
|
||||||
|
@ -28,7 +26,7 @@ do_write(int d, char* buf, int nbytes)
|
||||||
|
|
||||||
int __flushbuf(int c, FILE* stream)
|
int __flushbuf(int c, FILE* stream)
|
||||||
{
|
{
|
||||||
_clean = __cleanup;
|
__register_stdio_cleanup();
|
||||||
if (fileno(stream) < 0)
|
if (fileno(stream) < 0)
|
||||||
return EOF;
|
return EOF;
|
||||||
if (!io_testflag(stream, _IOWRITE))
|
if (!io_testflag(stream, _IOWRITE))
|
||||||
|
|
|
@ -14,7 +14,8 @@ int _doprnt(const char *format, va_list ap, FILE *stream);
|
||||||
int _doscan(FILE * stream, const char *format, va_list ap);
|
int _doscan(FILE * stream, const char *format, va_list ap);
|
||||||
char *_i_compute(unsigned long val, int base, char *s, int nrdigits);
|
char *_i_compute(unsigned long val, int base, char *s, int nrdigits);
|
||||||
char *_f_print(va_list *ap, int flags, char *s, char c, int precision);
|
char *_f_print(va_list *ap, int flags, char *s, char c, int precision);
|
||||||
void __cleanup(void);
|
|
||||||
|
extern void __register_stdio_cleanup(void);
|
||||||
|
|
||||||
FILE *popen(const char *command, const char *type);
|
FILE *popen(const char *command, const char *type);
|
||||||
FILE *fdopen(int fd, const char *mode);
|
FILE *fdopen(int fd, const char *mode);
|
||||||
|
|
|
@ -13,7 +13,7 @@ int setvbuf(register FILE* stream, char* buf, int mode, size_t size)
|
||||||
{
|
{
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
_clean = __cleanup;
|
__register_stdio_cleanup();
|
||||||
if (mode != _IOFBF && mode != _IOLBF && mode != _IONBF)
|
if (mode != _IOFBF && mode != _IOLBF && mode != _IONBF)
|
||||||
return EOF;
|
return EOF;
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include "atexits.h"
|
||||||
#define NEXITS 32
|
|
||||||
|
|
||||||
extern void (*__functab[NEXITS])(void);
|
|
||||||
extern int __funccnt;
|
|
||||||
|
|
||||||
int atexit(void (*func)(void))
|
int atexit(void (*func)(void))
|
||||||
{
|
{
|
9
lang/cem/libcc.ansi/sys/exit/atexits.h
Normal file
9
lang/cem/libcc.ansi/sys/exit/atexits.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef ATEXITS_H
|
||||||
|
#define ATEXITS_H
|
||||||
|
|
||||||
|
#define NEXITS 32
|
||||||
|
|
||||||
|
extern void (*__functab[NEXITS])(void);
|
||||||
|
extern int __funccnt;
|
||||||
|
|
||||||
|
#endif
|
|
@ -7,29 +7,16 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include "atexits.h"
|
||||||
#define NEXITS 32
|
|
||||||
|
|
||||||
void (*__functab[NEXITS])(void);
|
void (*__functab[NEXITS])(void);
|
||||||
int __funccnt = 0;
|
int __funccnt = 0;
|
||||||
|
|
||||||
/* only flush output buffers when necessary */
|
|
||||||
int (*_clean)(void) = NULL;
|
|
||||||
|
|
||||||
static void
|
|
||||||
_calls(void)
|
|
||||||
{
|
|
||||||
register int i = __funccnt;
|
|
||||||
|
|
||||||
/* "Called in reversed order of their registration" */
|
|
||||||
while (--i >= 0)
|
|
||||||
(*__functab[i])();
|
|
||||||
}
|
|
||||||
|
|
||||||
void exit(int status)
|
void exit(int status)
|
||||||
{
|
{
|
||||||
_calls();
|
/* "Called in reversed order of their registration" */
|
||||||
if (_clean)
|
while (__funccnt >= 0)
|
||||||
_clean();
|
(*__functab[__funccnt])();
|
||||||
|
|
||||||
_exit(status);
|
_exit(status);
|
||||||
}
|
}
|
Loading…
Reference in a new issue