X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lnet%2Fulnds%2Fproclib.c;h=1cfb233e97ff2af09b444925e0b45960c4fcd0b7;hp=2627253d51c76f5fd61f11a3afc7952b18009078;hb=090c677210ee2946d99c71412e4ff762bb300f4f;hpb=c5050e412572b00cbe93d8517d2d1f767bebfa92 diff --git a/lnet/ulnds/proclib.c b/lnet/ulnds/proclib.c index 2627253..1cfb233 100644 --- a/lnet/ulnds/proclib.c +++ b/lnet/ulnds/proclib.c @@ -43,24 +43,24 @@ /* 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, @@ -95,7 +95,7 @@ static void nal_cli(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); } @@ -105,9 +105,21 @@ static void nal_sti(nal_cb_t *nal, 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, @@ -116,21 +128,20 @@ static int nal_dist(nal_cb_t *nal, 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); } @@ -175,6 +186,7 @@ void *nal_thread(void *z) 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; @@ -216,7 +228,7 @@ void *nal_thread(void *z) 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);