Skip to content

Commit

Permalink
Consolidate non cancellable write call
Browse files Browse the repository at this point in the history
This patch consolidates all the non cancellable write calls to use
the __write_nocancel identifier.  For non cancellable targets it will
be just a macro to call the default respective symbol while on Linux
will be a internal one.

Checked on x86_64-linux-gnu, x86_64-linux-gnu-x32, and i686-linux-gnu.

	* sysdeps/generic/not-cancel.h (write_not_cancel): Remove macro.
	(__write_nocancel): New macro.
	* sysdeps/unix/sysv/linux/not-cancel.h (__write_nocancel):
	Rewrite as a function prototype.
	(write_not_cancel): Remove macro.
	* sysdeps/unix/sysv/linux/write.c (__write_nocancel): New function.
	* gmon/gmon.c (ERR): Replace write_not_cancel with __write_nocancel.
	(write_gmon): Likewise.
	* libio/fileops.c (_IO_new_file_write): Likewise.
	* login/utmp_file.c (pututline_file): Likewise.
	(updwtmp_file): Likewise.
	* stdio-common/psiginfo.c (psiginfo): Likewise.
	* sysdeps/posix/spawni.c (__spawni_child): Likewise.
	* sysdeps/unix/sysv/linux/gethostid.c (sethostid): Likewise.
	* sysdeps/unix/sysv/linux/libc_fatal.c (backtrace_and_maps):
	Likewise.
	* sysdeps/unix/sysv/linux/pthread_setname.c (pthread_setname_np):
	Likewise.
  • Loading branch information
zatrazz committed Aug 18, 2017
1 parent a748eb3 commit c647fb8
Show file tree
Hide file tree
Showing 12 changed files with 45 additions and 18 deletions.
19 changes: 19 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
2017-08-18 Adhemerval Zanella <adhemerval.zanella@linaro.org>

* sysdeps/generic/not-cancel.h (write_not_cancel): Remove macro.
(__write_nocancel): New macro.
* sysdeps/unix/sysv/linux/not-cancel.h (__write_nocancel):
Rewrite as a function prototype.
(write_not_cancel): Remove macro.
* sysdeps/unix/sysv/linux/write.c (__write_nocancel): New function.
* gmon/gmon.c (ERR): Replace write_not_cancel with __write_nocancel.
(write_gmon): Likewise.
* libio/fileops.c (_IO_new_file_write): Likewise.
* login/utmp_file.c (pututline_file): Likewise.
(updwtmp_file): Likewise.
* stdio-common/psiginfo.c (psiginfo): Likewise.
* sysdeps/posix/spawni.c (__spawni_child): Likewise.
* sysdeps/unix/sysv/linux/gethostid.c (sethostid): Likewise.
* sysdeps/unix/sysv/linux/libc_fatal.c (backtrace_and_maps):
Likewise.
* sysdeps/unix/sysv/linux/pthread_setname.c (pthread_setname_np):
Likewise.

* sysdeps/generic/not-cancel.h (read_not_cancel): Remove macro.
(__read_nocancel): New macro.
* sysdeps/unix/sysv/linux/Versions (libc) [GLIBC_PRIVATE]: Add
Expand Down
4 changes: 2 additions & 2 deletions gmon/gmon.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ struct gmonparam _gmonparam attribute_hidden = { GMON_PROF_OFF };
static int s_scale;
#define SCALE_1_TO_1 0x10000L

#define ERR(s) write_not_cancel (STDERR_FILENO, s, sizeof (s) - 1)
#define ERR(s) __write_nocancel (STDERR_FILENO, s, sizeof (s) - 1)

void moncontrol (int mode);
void __moncontrol (int mode);
Expand Down Expand Up @@ -375,7 +375,7 @@ write_gmon (void)
memcpy (&ghdr.cookie[0], GMON_MAGIC, sizeof (ghdr.cookie));
ghdr.version = GMON_VERSION;
memset (ghdr.spare, '\0', sizeof (ghdr.spare));
write_not_cancel (fd, &ghdr, sizeof (struct gmon_hdr));
__write_nocancel (fd, &ghdr, sizeof (struct gmon_hdr));

/* write PC histogram: */
write_hist (fd);
Expand Down
2 changes: 1 addition & 1 deletion libio/fileops.c
Original file line number Diff line number Diff line change
Expand Up @@ -1251,7 +1251,7 @@ _IO_new_file_write (_IO_FILE *f, const void *data, _IO_ssize_t n)
{
_IO_ssize_t count = (__builtin_expect (f->_flags2
& _IO_FLAGS2_NOTCANCEL, 0)
? write_not_cancel (f->_fileno, data, to_do)
? __write_nocancel (f->_fileno, data, to_do)
: write (f->_fileno, data, to_do));
if (count < 0)
{
Expand Down
4 changes: 2 additions & 2 deletions login/utmp_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ pututline_file (const struct utmp *data)
}

/* Write the new data. */
if (write_not_cancel (file_fd, data, sizeof (struct utmp))
if (__write_nocancel (file_fd, data, sizeof (struct utmp))
!= sizeof (struct utmp))
{
/* If we appended a new record this is only partially written.
Expand Down Expand Up @@ -505,7 +505,7 @@ updwtmp_file (const char *file, const struct utmp *utmp)
/* Write the entry. If we can't write all the bytes, reset the file
size back to the original size. That way, no partial entries
will remain. */
if (write_not_cancel (fd, utmp, sizeof (struct utmp))
if (__write_nocancel (fd, utmp, sizeof (struct utmp))
!= sizeof (struct utmp))
{
__ftruncate64 (fd, offset);
Expand Down
2 changes: 1 addition & 1 deletion stdio-common/psiginfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,5 +199,5 @@ Signal generated by the completion of an I/O request");

fclose (fp);

write_not_cancel (STDERR_FILENO, buf, strlen (buf));
__write_nocancel (STDERR_FILENO, buf, strlen (buf));
}
2 changes: 1 addition & 1 deletion sysdeps/generic/not-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
(void) __close (fd)
#define __read_nocancel(fd, buf, n) \
__read (fd, buf, n)
#define write_not_cancel(fd, buf, n) \
#define __write_nocancel(fd, buf, n) \
__write (fd, buf, n)
#define writev_not_cancel_no_status(fd, iov, n) \
(void) __writev (fd, iov, n)
Expand Down
2 changes: 1 addition & 1 deletion sysdeps/posix/spawni.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ __spawni_child (void *arguments)
ret = errno ? : ECHILD;
if (ret)
/* Since sizeof errno < PIPE_BUF, the write is atomic. */
while (write_not_cancel (args->pipe[1], &ret, sizeof (ret)) < 0);
while (__write_nocancel (args->pipe[1], &ret, sizeof (ret)) < 0);

_exit (SPAWN_ERROR);
}
Expand Down
2 changes: 1 addition & 1 deletion sysdeps/unix/sysv/linux/gethostid.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ sethostid (long int id)
if (fd < 0)
return -1;

written = write_not_cancel (fd, &id32, sizeof (id32));
written = __write_nocancel (fd, &id32, sizeof (id32));

close_not_cancel_no_status (fd);

Expand Down
4 changes: 2 additions & 2 deletions sysdeps/unix/sysv/linux/libc_fatal.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ backtrace_and_maps (int do_abort, bool written, int fd)
if (n > 2)
{
#define strnsize(str) str, strlen (str)
#define writestr(str) write_not_cancel (fd, str)
#define writestr(str) __write_nocancel (fd, str)
writestr (strnsize ("======= Backtrace: =========\n"));
__backtrace_symbols_fd (addrs + 1, n - 1, fd);

Expand All @@ -57,7 +57,7 @@ backtrace_and_maps (int do_abort, bool written, int fd)
char buf[1024];
ssize_t n2;
while ((n2 = __read_nocancel (fd2, buf, sizeof (buf))) > 0)
if (write_not_cancel (fd, buf, n2) != n2)
if (__write_nocancel (fd, buf, n2) != n2)
break;
close_not_cancel_no_status (fd2);
}
Expand Down
8 changes: 2 additions & 6 deletions sysdeps/unix/sysv/linux/not-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ __typeof (__read) __read_nocancel;
libc_hidden_proto (__read_nocancel)

/* Uncancelable write. */
#define __write_nocancel(fd, buf, len) \
INLINE_SYSCALL (write, 3, fd, buf, len)
__typeof (__write) __write_nocancel;
libc_hidden_proto (__write_nocancel)

/* Uncancelable openat. */
#define openat_not_cancel(fd, fname, oflag, mode) \
Expand All @@ -61,10 +61,6 @@ libc_hidden_proto (__read_nocancel)
(void) ({ INTERNAL_SYSCALL_DECL (err); \
INTERNAL_SYSCALL (close, err, 1, (fd)); })

/* Uncancelable write. */
#define write_not_cancel(fd, buf, n) \
__write_nocancel (fd, buf, n)

/* Uncancelable writev. */
#define writev_not_cancel_no_status(fd, iov, n) \
(void) ({ INTERNAL_SYSCALL_DECL (err); \
Expand Down
2 changes: 1 addition & 1 deletion sysdeps/unix/sysv/linux/pthread_setname.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ pthread_setname_np (pthread_t th, const char *name)
return errno;

int res = 0;
ssize_t n = TEMP_FAILURE_RETRY (write_not_cancel (fd, name, name_len));
ssize_t n = TEMP_FAILURE_RETRY (__write_nocancel (fd, name, name_len));
if (n < 0)
res = errno;
else if (n != name_len)
Expand Down
12 changes: 12 additions & 0 deletions sysdeps/unix/sysv/linux/write.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#include <unistd.h>
#include <sysdep-cancel.h>
#include <not-cancel.h>

/* Write NBYTES of BUF to FD. Return the number written, or -1. */
ssize_t
Expand All @@ -31,3 +32,14 @@ weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)
libc_hidden_weak (write)

#if !IS_IN (rtld)
ssize_t
__write_nocancel (int fd, const void *buf, size_t nbytes)
{
return INLINE_SYSCALL_CALL (write, fd, buf, nbytes);
}
#else
strong_alias (__libc_write, __write_nocancel)
#endif
libc_hidden_def (__write_nocancel)

0 comments on commit c647fb8

Please sign in to comment.