
On Tue, Nov 03, 2009 at 02:49:57PM -0500, Daniel P. Berrange wrote:
* src/util/threads.h, src/util/threads-pthread.c, src/libvirt_private.syms: Add virCondWaitUntil() --- src/libvirt_private.syms | 1 + src/util/threads-pthread.c | 15 +++++++++++++++ src/util/threads.h | 1 + 3 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 1e4a3dd..600dfee 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -443,6 +443,7 @@ virMutexUnlock; virCondInit; virCondDestroy; virCondWait; +virCondWaitUntil; virCondSignal; virCondBroadcast;
diff --git a/src/util/threads-pthread.c b/src/util/threads-pthread.c index b3ec06e..ad42483 100644 --- a/src/util/threads-pthread.c +++ b/src/util/threads-pthread.c @@ -88,6 +88,21 @@ int virCondWait(virCondPtr c, virMutexPtr m) return 0; }
+int virCondWaitUntil(virCondPtr c, virMutexPtr m, unsigned long long whenms) +{ + int ret; + struct timespec ts; + + ts.tv_sec = whenms / 1000; + ts.tv_nsec = (whenms % 1000) * 1000; + + if ((ret = pthread_cond_timedwait(&c->cond, &m->lock, &ts)) != 0) { + errno = ret; + return -1; + } + return 0; +} + void virCondSignal(virCondPtr c) { pthread_cond_signal(&c->cond); diff --git a/src/util/threads.h b/src/util/threads.h index 62239b7..d97463d 100644 --- a/src/util/threads.h +++ b/src/util/threads.h @@ -49,6 +49,7 @@ int virCondInit(virCondPtr c) ATTRIBUTE_RETURN_CHECK; int virCondDestroy(virCondPtr c) ATTRIBUTE_RETURN_CHECK;
int virCondWait(virCondPtr c, virMutexPtr m) ATTRIBUTE_RETURN_CHECK; +int virCondWaitUntil(virCondPtr c, virMutexPtr m, unsigned long long whenms) ATTRIBUTE_RETURN_CHECK; void virCondSignal(virCondPtr c); void virCondBroadcast(virCondPtr c);
Haha, now I understand the slight change and why it's the thread waiting which gets to timeout, simpler, and probably as practical ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/