+ now = cfs_time_current();
+ cfs_waitq_timedwait(&wl, CFS_TASK_INTERRUPTIBLE,
+ cfs_time_seconds(timeout_ms)/1000);
+ cfs_duration_usec(cfs_time_sub(cfs_time_current(), now),
+ &tv);
+ timeout_ms -= tv.tv_sec * 1000 + tv.tv_usec / 1000;
+ if (timeout_ms < 0)
+ timeout_ms = 0;
+ }
+
+ LNET_LOCK();
+ cfs_waitq_del(&the_lnet.ln_waitq, &wl);
+#else
+ if (eqwaitni != NULL) {
+ /* I have a single NI that I have to call into, to get
+ * events queued, or to block. */
+ lnet_ni_addref_locked(eqwaitni);
+ LNET_UNLOCK();
+
+ if (timeout_ms <= 0) {
+ (eqwaitni->ni_lnd->lnd_wait)(eqwaitni, timeout_ms);
+ } else {
+ gettimeofday(&then, NULL);
+
+ (eqwaitni->ni_lnd->lnd_wait)(eqwaitni, timeout_ms);
+
+ gettimeofday(&now, NULL);
+ timeout_ms -= (now.tv_sec - then.tv_sec) * 1000 +
+ (now.tv_usec - then.tv_usec) / 1000;
+ if (timeout_ms < 0)
+ timeout_ms = 0;
+ }
+
+ LNET_LOCK();
+ lnet_ni_decref_locked(eqwaitni);
+
+ /* don't call into eqwaitni again if timeout has
+ * expired */
+ if (timeout_ms == 0)
+ eqwaitni = NULL;
+
+ continue; /* go back and check for events */
+ }
+
+ if (timeout_ms == 0) {
+ LNET_UNLOCK();
+ RETURN (0);
+ }
+
+# ifndef HAVE_LIBPTHREAD
+ /* If I'm single-threaded, LNET fails at startup if it can't
+ * set the_lnet.ln_eqwaitni correctly. */
+ LBUG();
+# else
+ if (timeout_ms < 0) {
+ pthread_cond_wait(&the_lnet.ln_cond,
+ &the_lnet.ln_lock);
+ } else {
+ gettimeofday(&then, NULL);
+
+ ts.tv_sec = then.tv_sec + timeout_ms/1000;
+ ts.tv_nsec = then.tv_usec * 1000 +
+ (timeout_ms%1000) * 1000000;
+ if (ts.tv_nsec >= 1000000000) {
+ ts.tv_sec++;
+ ts.tv_nsec -= 1000000000;
+ }
+
+ pthread_cond_timedwait(&the_lnet.ln_cond,
+ &the_lnet.ln_lock, &ts);
+
+ gettimeofday(&now, NULL);
+ timeout_ms -= (now.tv_sec - then.tv_sec) * 1000 +
+ (now.tv_usec - then.tv_usec) / 1000;
+
+ if (timeout_ms < 0)
+ timeout_ms = 0;
+ }
+# endif
+#endif
+ }