xs: fixes to watch thread creation
PATCH v3 1/1 xs: fixes to watch thread creation
A pair of patches to the xenstore library that:
1) blocks signal delivery before creating the watch wakeup thread
2) reduces the stack size of the watch wakeup thread.
PATCH v3 1/1 xs: block signals in watch wakeup thread
The thread created to wakeup watchers is not intended to handle signals (and a later patch will reduce it's stack size which makes it unsuitable for doing so).
tools/xenstore/xs.c +7 -0
@@ -705,11 +705,18 @@ bool xs_watch(struct xs_handle *h, const/* We dynamically create a reader thread on demand. */ mutex_lock (&h->request_mutex);if (!h->read_thr_exists) { +sigset_t set, old_set; + +sigfillset (&set); +pthread_sigmask (SIG_SETMASK , &set, &old_set); +if (pthread_create (&h->read_thr,NULL , read_thread, h) !=0 ) { +pthread_sigmask (SIG_SETMASK , &old_set,NULL );mutex_unlock (&h->request_mutex);return false; } h->read_thr_exists =1 ; +pthread_sigmask (SIG_SETMASK , &old_set,NULL ); }mutex_unlock (&h->request_mutex);#endif
PATCH v3 1/1 xs: set read_thread stacksize
In reply to Simon Rowexs_watch() creates a thread to wake watchers using default attributes. The stacksize can be quite large (8 MB on Linux), applications that link against xenstore end up having a larger memory footprint than necessary.
---
Changed since v1:
* remove test for _POSIX_THREAD_ATTR_STACKSIZE
* use define for constant
tools/xenstore/xs.c +16 -1
@@ -702,21 +702,36 @@ bool xs_watch(struct xs_handle *h, conststruct iovec iov[2 ];#ifdef USE_PTHREAD +#define READ_THREAD_STACKSIZE (16 * 1024) +/* We dynamically create a reader thread on demand. */ mutex_lock (&h->request_mutex);if (!h->read_thr_exists) {sigset_t set, old_set; +pthread_attr_t attr; + +if (pthread_attr_init (&attr) !=0 ) { +mutex_unlock (&h->request_mutex); +return false; + } +if (pthread_attr_setstacksize (&attr,READ_THREAD_STACKSIZE ) !=0 ) { +pthread_attr_destroy (&attr); +mutex_unlock (&h->request_mutex); +return false; + }sigfillset (&set);pthread_sigmask (SIG_SETMASK , &set, &old_set); -if (pthread_create (&h->read_thr,NULL , read_thread, h) !=0 ) { +if (pthread_create (&h->read_thr, &attr, read_thread, h) !=0 ) {pthread_sigmask (SIG_SETMASK , &old_set,NULL ); +pthread_attr_destroy (&attr);mutex_unlock (&h->request_mutex);return false; } h->read_thr_exists =1 ;pthread_sigmask (SIG_SETMASK , &old_set,NULL ); +pthread_attr_destroy (&attr); }mutex_unlock (&h->request_mutex);#endif
Simon Rowe writes ("[Xen-devel] [PATCH 0 of 2 V3] xs: fixes to watch thread creation"):
Quoted 5 lines
A pair of patches to the xenstore library that:
1) blocks signal delivery before creating the watch wakeup thread
2) reduces the stack size of the watch wakeup thread.
Thanks, both:
Ian.