diff options
author | Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> | 2015-08-27 11:26:18 +0000 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2015-10-30 10:57:54 +0300 |
commit | ba593b457a5ab400654c6144d1b52e43784780b2 (patch) | |
tree | 8088f913f4b2d92c1fca7c66778060302878036f | |
parent | 9a0a94c4f27fd7930406ad804dfc845456e6c6dd (diff) | |
download | bdwgc-ba593b457a5ab400654c6144d1b52e43784780b2.tar.gz |
Avoid unstructured procfs on Solaris
(Cherry-picked commit f9711f5 from 'gcc_boehmgc' branch.)
* os_dep.c [PROC_VDB] (GC_dirty_init): Use /proc/<pid>/pagedata
instead of PIOCOPENPD; remove fd local variable; increase buf[] size.
-rw-r--r-- | os_dep.c | 11 |
1 files changed, 4 insertions, 7 deletions
@@ -3511,8 +3511,7 @@ GC_INNER GC_bool GC_page_was_dirty(struct hblk *h) GC_INNER void GC_dirty_init(void) { - int fd; - char buf[30]; + char buf[40]; if (GC_bytes_allocd != 0 || GC_bytes_allocd_before_gc != 0) { memset(GC_written_pages, 0xff, sizeof(page_hash_table)); @@ -3521,14 +3520,12 @@ GC_INNER void GC_dirty_init(void) (unsigned long)(GC_bytes_allocd + GC_bytes_allocd_before_gc)); } - (void)snprintf(buf, sizeof(buf), "/proc/%ld", (long)getpid()); + (void)snprintf(buf, sizeof(buf), "/proc/%ld/pagedata", (long)getpid()); buf[sizeof(buf) - 1] = '\0'; - fd = open(buf, O_RDONLY); - if (fd < 0) { + GC_proc_fd = open(buf, O_RDONLY); + if (GC_proc_fd < 0) { ABORT("/proc open failed"); } - GC_proc_fd = syscall(SYS_ioctl, fd, PIOCOPENPD, 0); - close(fd); syscall(SYS_fcntl, GC_proc_fd, F_SETFD, FD_CLOEXEC); if (GC_proc_fd < 0) { WARN("/proc ioctl(PIOCOPENPD) failed", 0); |