From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel Thibault Subject: [PATCH] fs-back: terminate thread when domain gets destroyed Date: Tue, 11 Mar 2008 13:49:50 +0000 Message-ID: <20080311134950.GC5831@implementation.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org fs-back: terminate thread when domain gets destroyed by periodically checking that the frontend xenstore nodes still exist Signed-off-by: Samuel Thibault diff -r 86e64b684fb2 tools/fs-back/fs-backend.c --- a/tools/fs-back/fs-backend.c Wed Mar 05 11:10:29 2008 +0000 +++ b/tools/fs-back/fs-backend.c Tue Mar 11 13:47:40 2008 +0000 @@ -49,6 +49,7 @@ static void handle_aio_events(struct mou struct aiocb evtchn_cb; const struct aiocb * cb_list[mount->nr_entries]; int request_ids[mount->nr_entries]; + struct timespec timeout = { .tv_sec = 1, .tv_nsec = 0 }; /* Prepare the AIO control block for evtchn */ fd = xc_evtchn_fd(mount->evth); @@ -76,9 +77,11 @@ wait_again: /* Block till an AIO requset finishes, or we get an event */ while(1) { - int ret = aio_suspend(cb_list, count, NULL); + int ret = aio_suspend(cb_list, count, &timeout); if (!ret) break; + if (errno == EAGAIN) + return; assert(errno == EINTR); } for(i=0; ifrontend); printf("Starting a thread for mount: %d\n", mount->mount_id); allocate_request_array(mount); @@ -172,14 +178,21 @@ moretodo: nr_consumed++; } - printf("Backend consumed: %d requests\n", nr_consumed); + if (nr_consumed) + printf("Backend consumed: %d requests\n", nr_consumed); RING_FINAL_CHECK_FOR_REQUESTS(&mount->ring, more); if(more) goto moretodo; RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&mount->ring, notify); - printf("Pushed responces and notify=%d\n", notify); + //printf("Pushed responces and notify=%d\n", notify); if(notify) xc_evtchn_notify(mount->evth, mount->local_evtchn); + + state = xs_read(xsh, XBT_NULL, node, NULL); + if (!state) + /* domain destroyed */ + break; + free(state); } printf("Destroying thread for mount: %d\n", mount->mount_id);