diff options
author | Volker Lendecke <vl@samba.org> | 2009-01-03 19:10:57 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2009-01-04 16:42:40 +0100 |
commit | ebacce2efe6dbb27a9e7962597da8ef783473f6a (patch) | |
tree | 3bc4cea4f00e43097dfd3cf0f2dc29bd48ed4799 | |
parent | e058e51d63d4a476a1b49941cd8a8611d9164eba (diff) | |
download | samba-ebacce2efe6dbb27a9e7962597da8ef783473f6a.tar.gz samba-ebacce2efe6dbb27a9e7962597da8ef783473f6a.tar.bz2 samba-ebacce2efe6dbb27a9e7962597da8ef783473f6a.zip |
Add async timeout helpers
-rw-r--r-- | source3/include/async_req.h | 10 | ||||
-rw-r--r-- | source3/lib/async_req.c | 42 |
2 files changed, 52 insertions, 0 deletions
diff --git a/source3/include/async_req.h b/source3/include/async_req.h index 2633027e37..bbe52da723 100644 --- a/source3/include/async_req.h +++ b/source3/include/async_req.h @@ -132,4 +132,14 @@ bool async_req_is_error(struct async_req *req, NTSTATUS *status); NTSTATUS async_req_simple_recv(struct async_req *req); +bool async_req_set_timeout(struct async_req *req, struct event_context *ev, + struct timeval to); + +struct async_req *async_wait_send(TALLOC_CTX *mem_ctx, + struct event_context *ev, + struct timeval to); + +NTSTATUS async_wait_recv(struct async_req *req); + + #endif diff --git a/source3/lib/async_req.c b/source3/lib/async_req.c index 8c9b2e6b47..0653ff62a7 100644 --- a/source3/lib/async_req.c +++ b/source3/lib/async_req.c @@ -194,3 +194,45 @@ NTSTATUS async_req_simple_recv(struct async_req *req) } return NT_STATUS_OK; } + +static void async_req_timedout(struct event_context *ev, + struct timed_event *te, + const struct timeval *now, + void *priv) +{ + struct async_req *req = talloc_get_type_abort( + priv, struct async_req); + TALLOC_FREE(te); + async_req_error(req, NT_STATUS_IO_TIMEOUT); +} + +bool async_req_set_timeout(struct async_req *req, struct event_context *ev, + struct timeval to) +{ + return (event_add_timed(ev, req, + timeval_current_ofs(to.tv_sec, to.tv_usec), + "async_req_timedout", async_req_timedout, req) + != NULL); +} + +struct async_req *async_wait_send(TALLOC_CTX *mem_ctx, + struct event_context *ev, + struct timeval to) +{ + struct async_req *result; + + result = async_req_new(mem_ctx); + if (result == NULL) { + return result; + } + if (!async_req_set_timeout(result, ev, to)) { + TALLOC_FREE(result); + return NULL; + } + return result; +} + +NTSTATUS async_wait_recv(struct async_req *req) +{ + return NT_STATUS_OK; +} |