Async error handling
[akaros.git] / lib / asynccall.c
1 #include <inc/lib.h>
2 #include <inc/syscall.h>
3 #include <inc/queue.h>
4
5 async_desc_t* get_async_desc(void)
6 {
7         async_desc_t* desc = POOL_GET(&async_desc_pool);
8         if (desc)
9                 // Clear out any data that was in the old desc
10                 memset(desc, 0, sizeof(*desc));
11         return desc;
12 }
13
14 error_t waiton_async_call(async_desc_t* desc, async_rsp_t* rsp)
15 {
16         syscall_rsp_t syscall_rsp;
17         syscall_desc_t* d;
18         error_t err = 0;
19         if (!desc)
20                 return -E_INVAL;
21         while (!(LIST_EMPTY(&desc->syslist))) {
22                 d = LIST_FIRST(&desc->syslist);
23                 err = MIN(waiton_syscall(d, &syscall_rsp), err);
24                 // TODO: processing the retval out of rsp here.  might be specific to
25                 // the async call.  do we want to accumulate?  return any negative
26                 // values?  depends what we want from the return value, so we might
27                 // have to pass in a function that is used to do the processing and
28                 // pass the answer back out in rsp.
29                 //rsp->retval += syscall_rsp.retval; // For example
30                 rsp->retval = MIN(rsp->retval, syscall_rsp.retval);
31                 // remove from the list and free the syscall desc
32                 LIST_REMOVE(d, next);
33                 POOL_PUT(&syscall_desc_pool, d);
34         }
35         // run a cleanup function for this desc, if available
36         if (desc->cleanup)
37                 desc->cleanup(desc->data);
38         // free the asynccall desc
39         POOL_PUT(&async_desc_pool, desc);
40         return err;
41 }
42
43 syscall_desc_t* get_sys_desc(async_desc_t* desc)
44 {
45         syscall_desc_t* d = POOL_GET(&syscall_desc_pool);
46         if (d) {
47                 // Clear out any data that was in the old desc
48                 memset(d, 0, sizeof(*d));
49         LIST_INSERT_TAIL(&desc->syslist, d, next);
50         }
51         return d;
52 }