diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | libio/Versions | 4 | ||||
-rw-r--r-- | libio/genops.c | 44 | ||||
-rw-r--r-- | libio/libioP.h | 15 |
4 files changed, 78 insertions, 0 deletions
@@ -1,3 +1,18 @@ +2000-06-04 Kaz Kylheku <kaz@ashi.footprints.net> + + Lock for stdio stream list becomes global, for use in LinuxThreads. + + * libio/genops.c (_IO_iter_begin, _IO_iter_end, + _IO_iter_next, _IO_iter_file, _IO_list_lock, _IO_list_unlock, + _IO_list_resetlock): New interface for iterating global list of + streams without accessing the _IO_list_all global variable, + and for manipulating the lock which protects this list. + * libio/libioP.h: Likewise. + * libio/Version: Add entries for the new functions. + + * libio/libioP.h (_IO_ITER): New typedef, just an alias for + pointer to _IO_FILE. + 2000-06-07 Ulrich Drepper <drepper@redhat.com> * locale/programs/ld-ctype.c (set_class_defaults): Several uses of diff --git a/libio/Versions b/libio/Versions index 654ca29..1fbc313 100644 --- a/libio/Versions +++ b/libio/Versions @@ -104,6 +104,10 @@ libc { # functions used in libstdc++ _IO_fgetpos; _IO_fgetpos64; _IO_fsetpos; _IO_fsetpos64; + # LinuxThreads uses this protected interface + _IO_iter_begin; _IO_iter_end; _IO_iter_next; _IO_iter_file; + _IO_list_lock; _IO_list_unlock; _IO_list_resetlock; + # f* fgetpos; fgetpos64; fgetwc; fgetwc_unlocked; fgetws; fgetws_unlocked; fputwc; fputwc_unlocked; fputws; fputws_unlocked; fsetpos; fsetpos64; diff --git a/libio/genops.c b/libio/genops.c index c595181..fb4f08b 100644 --- a/libio/genops.c +++ b/libio/genops.c @@ -1028,6 +1028,50 @@ _IO_default_imbue (fp, locale) { } +_IO_ITER +_IO_iter_begin() +{ + return _IO_list_all; +} + +_IO_ITER +_IO_iter_end() +{ + return NULL; +} + +_IO_ITER +_IO_iter_next(iter) + _IO_ITER iter; +{ + return iter->_chain; +} + +_IO_FILE * +_IO_iter_file(iter) + _IO_ITER iter; +{ + return iter; +} + +void +_IO_list_lock() +{ + _IO_lock_lock (list_all_lock); +} + +void +_IO_list_unlock() +{ + _IO_lock_unlock (list_all_lock); +} + +void +_IO_list_resetlock() +{ + _IO_lock_init (list_all_lock); +} + #ifdef TODO #if defined(linux) diff --git a/libio/libioP.h b/libio/libioP.h index 59d20cd..090f98a 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -313,6 +313,10 @@ struct _IO_FILE_plus const struct _IO_jump_t *vtable; }; +/* Iterator type for walking global linked list of _IO_FILE objects. */ + +typedef _IO_FILE *_IO_ITER; + /* Generic functions */ extern void _IO_switch_to_main_get_area __P ((_IO_FILE *)); @@ -351,6 +355,17 @@ extern int _IO_wmarker_delta __P ((struct _IO_marker *)); extern int _IO_seekmark __P ((_IO_FILE *, struct _IO_marker *, int)); extern int _IO_seekwmark __P ((_IO_FILE *, struct _IO_marker *, int)); +/* Functions for iterating global list and dealing with + its lock */ + +extern _IO_ITER _IO_iter_begin __P ((void)); +extern _IO_ITER _IO_iter_end __P ((void)); +extern _IO_ITER _IO_iter_next __P ((_IO_ITER)); +extern _IO_FILE *_IO_iter_file __P ((_IO_ITER)); +extern void _IO_list_lock __P ((void)); +extern void _IO_list_unlock __P ((void)); +extern void _IO_list_resetlock __P ((void)); + /* Default jumptable functions. */ extern int _IO_default_underflow __P ((_IO_FILE *)); |