Added generic asynchronous operations code.
[people/xl0/gpxe.git] / src / include / gpxe / async.h
1 #ifndef _GPXE_ASYNC_H
2 #define _GPXE_ASYNC_H
3
4 /** @file
5  *
6  * Asynchronous operations
7  *
8  */
9
10 #include <errno.h>
11 #include <assert.h>
12
13 /** An asynchronous operation */
14 struct async_operation {
15         /** Operation status
16          *
17          * This is an error code as defined in errno.h, plus an offset
18          * of EINPROGRESS.  This means that a status value of 0
19          * corresponds to a return status code of -EINPROGRESS,
20          * i.e. that the default state of an asynchronous operation is
21          * "not yet completed".
22          */
23         int status;
24 };
25
26 /**
27  * Set asynchronous operation status
28  *
29  * @v aop       Asynchronous operation
30  * @v rc        Return status code
31  */
32 static inline __attribute__ (( always_inline )) void
33 async_set_status ( struct async_operation *aop, int rc ) {
34         aop->status = ( rc + EINPROGRESS );
35 }
36
37 /**
38  * Get asynchronous operation status
39  *
40  * @v aop       Asynchronous operation
41  * @ret rc      Return status code
42  */
43 static inline __attribute__ (( always_inline )) int
44 async_status ( struct async_operation *aop ) {
45         return ( aop->status - EINPROGRESS );
46 }
47
48 /**
49  * Flag asynchronous operation as complete
50  *
51  * @v aop       Asynchronous operation
52  * @v rc        Return status code
53  */
54 static inline __attribute__ (( always_inline )) void
55 async_done ( struct async_operation *aop, int rc ) {
56         assert ( rc != -EINPROGRESS );
57         async_set_status ( aop, rc );
58 }
59
60 extern int async_wait ( struct async_operation *aop );
61
62 #endif /* _GPXE_ASYNC_H */