/* the following functions are stubs to satisfy the nal definition
without doing anything particularily useful*/
-static int nal_write(nal_cb_t *nal,
- void *private,
- user_ptr dst_addr,
- void *src_addr,
- size_t len)
+static ptl_err_t nal_write(nal_cb_t *nal,
+ void *private,
+ user_ptr dst_addr,
+ void *src_addr,
+ size_t len)
{
memcpy(dst_addr, src_addr, len);
- return 0;
+ return PTL_OK;
}
-static int nal_read(nal_cb_t * nal,
- void *private,
- void *dst_addr,
- user_ptr src_addr,
- size_t len)
+static ptl_err_t nal_read(nal_cb_t * nal,
+ void *private,
+ void *dst_addr,
+ user_ptr src_addr,
+ size_t len)
{
memcpy(dst_addr, src_addr, len);
- return 0;
+ return PTL_OK;
}
static void *nal_malloc(nal_cb_t *nal,
bridge b = (bridge) nal->nal_data;
procbridge p = (procbridge) b->local;
- pthread_mutex_lock(&p->nal_cb_lock);
+ pthread_mutex_lock(&p->mutex);
}
bridge b = (bridge)nal->nal_data;
procbridge p = (procbridge) b->local;
- pthread_mutex_unlock(&p->nal_cb_lock);
+ pthread_mutex_unlock(&p->mutex);
}
+static void nal_callback(nal_cb_t *nal, void *private,
+ lib_eq_t *eq, ptl_event_t *ev)
+{
+ bridge b = (bridge)nal->nal_data;
+ procbridge p = (procbridge) b->local;
+
+ /* holding p->mutex */
+ if (eq->event_callback != NULL)
+ eq->event_callback(ev);
+
+ pthread_cond_broadcast(&p->cond);
+}
static int nal_dist(nal_cb_t *nal,
ptl_nid_t nid,
return 0;
}
-static void wakeup_topside(void *z)
+static void check_stopping(void *z)
{
bridge b = z;
procbridge p = b->local;
- int stop;
+ if ((p->nal_flags & NAL_FLAG_STOPPING) == 0)
+ return;
+
pthread_mutex_lock(&p->mutex);
- stop = p->nal_flags & NAL_FLAG_STOPPING;
- if (stop)
- p->nal_flags |= NAL_FLAG_STOPPED;
+ p->nal_flags |= NAL_FLAG_STOPPED;
pthread_cond_broadcast(&p->cond);
pthread_mutex_unlock(&p->mutex);
- if (stop)
- pthread_exit(0);
+ pthread_exit(0);
}
b->nal_cb->cb_printf=nal_printf;
b->nal_cb->cb_cli=nal_cli;
b->nal_cb->cb_sti=nal_sti;
+ b->nal_cb->cb_callback=nal_callback;
b->nal_cb->cb_dist=nal_dist;
pid_request = args->nia_requested_pid;
performs an operation and returns to blocking mode. we
overload this function to inform the api side that
it may be interested in looking at the event queue */
- register_thunk(wakeup_topside,b);
+ register_thunk(check_stopping,b);
timer_loop();
}
return(0);