mirror of git://sourceware.org/git/glibc.git
Correct and improve fread_unlocked and fwrite_unlocked optimizations.
This commit is contained in:
parent
2dc9c8cd69
commit
7f2a1e3cf8
|
|
@ -127,32 +127,47 @@ ferror_unlocked (FILE *__stream) __THROW
|
||||||
#if defined __USE_MISC && defined __GNUC__ && defined __OPTIMIZE__
|
#if defined __USE_MISC && defined __GNUC__ && defined __OPTIMIZE__
|
||||||
/* Perform some simple optimizations. */
|
/* Perform some simple optimizations. */
|
||||||
# define fread_unlocked(ptr, size, n, stream) \
|
# define fread_unlocked(ptr, size, n, stream) \
|
||||||
(__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n) \
|
(__extension__ ((((__builtin_constant_p (size) \
|
||||||
|
&& ((size) == 0 || __builtin_constant_p (n))) \
|
||||||
|
|| (__builtin_constant_p (n) && (n) == 0)) \
|
||||||
&& (size_t) ((size) * (n)) <= 8) \
|
&& (size_t) ((size) * (n)) <= 8) \
|
||||||
? ({ char *__ptr = (char *) (ptr); \
|
? ({ char *__ptr = (char *) (ptr); \
|
||||||
FILE *__stream = (stream); \
|
FILE *__stream = (stream); \
|
||||||
int __c; \
|
size_t __size = (size); \
|
||||||
size_t __cnt = (size) * (n); \
|
size_t __n = (n); \
|
||||||
while (__cnt-- > 0) \
|
size_t __readres = __n; \
|
||||||
|
size_t __cnt = __size * __n + 1; \
|
||||||
|
while (--__cnt > 0) \
|
||||||
{ \
|
{ \
|
||||||
__c = _IO_getc_unlocked (__stream); \
|
int __c = _IO_getc_unlocked (__stream); \
|
||||||
if (__c == EOF) \
|
if (__c == EOF) \
|
||||||
break; \
|
{ \
|
||||||
|
__readres = (__size * __n - __cnt) / __size; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
*__ptr++ = __c; \
|
*__ptr++ = __c; \
|
||||||
} \
|
} \
|
||||||
((size_t) ((size) * (n)) - __cnt) / (size); }) \
|
__readres; }) \
|
||||||
: fread_unlocked (ptr, size, n, stream)))
|
: fread_unlocked (ptr, size, n, stream)))
|
||||||
|
|
||||||
# define fwrite_unlocked(ptr, size, n, stream) \
|
# define fwrite_unlocked(ptr, size, n, stream) \
|
||||||
(__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n) \
|
(__extension__ ((((__builtin_constant_p (size) \
|
||||||
|
&& ((size) == 0 || __builtin_constant_p (n))) \
|
||||||
|
|| (__builtin_constant_p (n) && (n) == 0)) \
|
||||||
&& (size_t) ((size) * (n)) <= 8) \
|
&& (size_t) ((size) * (n)) <= 8) \
|
||||||
? ({ const char *__ptr = (const char *) (ptr); \
|
? ({ const char *__ptr = (const char *) (ptr); \
|
||||||
FILE *__stream = (stream); \
|
FILE *__stream = (stream); \
|
||||||
size_t __cnt = (size) * (n); \
|
size_t __size = (size); \
|
||||||
while (__cnt-- > 0) \
|
size_t __n = (n); \
|
||||||
|
size_t __writeres = __n; \
|
||||||
|
size_t __cnt = __size * __n + 1; \
|
||||||
|
while (--__cnt > 0) \
|
||||||
if (_IO_putc_unlocked (*__ptr++, __stream) == EOF) \
|
if (_IO_putc_unlocked (*__ptr++, __stream) == EOF) \
|
||||||
break; \
|
{ \
|
||||||
((size_t) ((size) * (n)) - __cnt) / (size); }) \
|
__writeres = (__size * __n - __cnt) / __size; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
__writeres; }) \
|
||||||
: fwrite_unlocked (ptr, size, n, stream)))
|
: fwrite_unlocked (ptr, size, n, stream)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue