Annotation of OSKit-Mach/oskit/ds_request.h, revision 1.1.1.1

1.1       root        1: #ifndef        _DS_REQUEST_H_
                      2: #define        _DS_REQUEST_H_
                      3: 
                      4: #include "ds_oskit.h"
                      5: #include <kern/zalloc.h>
                      6: #include <kern/queue.h>
                      7: #include <kern/lock.h>
                      8: 
                      9: /* This structure describes a pending asynchronous device request.
                     10: 
                     11:    That is, an i/o that is in progress but with no thread waiting for it.
                     12:    We store here all the information we need to complete the i/o and send
                     13:    the reply message to complete the device RPC.
                     14: 
                     15:    This is currently only used for oskit asyncio devices, but can be
                     16:    extended for other types e.g. when the oskit gives us a way not to
                     17:    block the device request thread doing disk i/o.
                     18: 
                     19:    These structures are queued on the device's read_queue or write_queue.
                     20:    Notifications from the device put the device itself onto the
                     21:    device_ready_queue and wake the io_done_thread.  The io_done_thread
                     22:    takes devices off the ready queue, polls them for i/o availability
                     23:    and then dequeues requests from their read_queue and/or write_queue
                     24:    as long as there is i/o available.
                     25: 
                     26:    All of these queues are accessed at splio and locked by
                     27:    device_ready_queue_lock.  */
                     28: 
                     29: struct pending_request {
                     30:   queue_chain_t chain;         /* on device's read_queue or write_queue */
                     31: 
                     32:   void (*completer) (device_t, struct pending_request *);
                     33: 
                     34:   struct ipc_port *reply_port;
                     35:   mach_msg_type_name_t reply_port_type;
                     36: 
                     37:   oskit_size_t count, offset;
                     38: 
                     39:   union device_data {
                     40:     vm_map_copy_t outofband;
                     41:     char *inband;              /* from io_inband_zone */
                     42:     vm_offset_t inbando;       /* rather than casting */
                     43: #define IO_SMALL_MAX   (sizeof (vm_map_copy_t))
                     44:     char small[IO_SMALL_MAX];
                     45:   } data;
                     46: };
                     47: 
                     48: extern zone_t io_req_zone;
                     49: #define request_allocate()     ((void *) zalloc (io_req_zone))
                     50: #define request_free(req)      (zfree (io_req_zone, (vm_offset_t) (req)))
                     51: 
                     52: 
                     53: extern queue_head_t device_ready_queue;
                     54: decl_simple_lock_data(extern, device_ready_queue_lock)
                     55: 
                     56: extern void ds_request_init (void);
                     57: extern void ds_device_ready (device_t);
                     58: extern void ds_asyncio_ready (device_t);
                     59: 
                     60: 
                     61: 
                     62: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.