summaryrefslogtreecommitdiffstats
path: root/cddl
diff options
context:
space:
mode:
authorjb <jb@FreeBSD.org>2008-04-26 04:16:17 +0000
committerjb <jb@FreeBSD.org>2008-04-26 04:16:17 +0000
commit105579b1e61ea9ef331da56233092c96f78ea94d (patch)
tree7a7d854df0ed0dd7374991fdd79830b3530880c8 /cddl
parent71dafcd8444bd3a4d6c1f2a0df10fc4277257b19 (diff)
downloadFreeBSD-src-105579b1e61ea9ef331da56233092c96f78ea94d.zip
FreeBSD-src-105579b1e61ea9ef331da56233092c96f78ea94d.tar.gz
* Use a portable POSIX timed wait.
* Handle the different ioctl format.
Diffstat (limited to 'cddl')
-rw-r--r--cddl/contrib/opensolaris/lib/libdtrace/common/dt_work.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_work.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_work.c
index 97a7f62..68e64bb 100644
--- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_work.c
+++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_work.c
@@ -82,6 +82,7 @@ dtrace_sleep(dtrace_hdl_t *dtp)
return; /* sleep duration has already past */
}
+#if defined(sun)
tv.tv_sec = (earliest - now) / NANOSEC;
tv.tv_nsec = (earliest - now) % NANOSEC;
@@ -91,6 +92,23 @@ dtrace_sleep(dtrace_hdl_t *dtp)
* awaken, iterate over any pending notifications and process them.
*/
(void) pthread_cond_reltimedwait_np(&dph->dph_cv, &dph->dph_lock, &tv);
+#else
+ earliest -= now;
+ clock_gettime(CLOCK_REALTIME,&tv);
+ tv.tv_sec += earliest / NANOSEC;
+ tv.tv_nsec += earliest % NANOSEC;
+ while (tv.tv_nsec > NANOSEC) {
+ tv.tv_sec += 1;
+ tv.tv_nsec -= NANOSEC;
+ }
+
+ /*
+ * Wait for either 'tv' nanoseconds to pass or to receive notification
+ * that a process is in an interesting state. Regardless of why we
+ * awaken, iterate over any pending notifications and process them.
+ */
+ (void) pthread_cond_timedwait(&dph->dph_cv, &dph->dph_lock, &tv);
+#endif
while ((dprn = dph->dph_notify) != NULL) {
if (dtp->dt_prochdlr != NULL) {
@@ -164,6 +182,7 @@ dtrace_status(dtrace_hdl_t *dtp)
int
dtrace_go(dtrace_hdl_t *dtp)
{
+ dtrace_enable_io_t args;
void *dof;
int err;
@@ -185,7 +204,9 @@ dtrace_go(dtrace_hdl_t *dtp)
if ((dof = dtrace_getopt_dof(dtp)) == NULL)
return (-1); /* dt_errno has been set for us */
- err = dt_ioctl(dtp, DTRACEIOC_ENABLE, dof);
+ args.dof = dof;
+ args.n_matched = 0;
+ err = dt_ioctl(dtp, DTRACEIOC_ENABLE, &args);
dtrace_dof_destroy(dtp, dof);
if (err == -1 && (errno != ENOTTY || dtp->dt_vector == NULL))
OpenPOWER on IntegriCloud