1 #include "memory_incremental.h" 2 #include "pipe_opener_resource.h" 3 #include "pipe_opener_server.h" 4 #include "pipe_pager.h" 5 #include "resource_server.h" 6 7 8 9 /* Support for providing access to pipes. */ 10 11 PipeOpenerResource::PipeOpenerResource(Memory *memory) 12 : _memory(memory) 13 { 14 } 15 16 int PipeOpenerResource::expected_items() 17 { 18 return PipeOpener_expected_items; 19 } 20 21 ipc_server_handler_type PipeOpenerResource::handler() 22 { 23 return (ipc_server_handler_type) handle_PipeOpener; 24 } 25 26 27 28 /* Pipe opener interface methods. */ 29 30 long PipeOpenerResource::pipe(offset_t size, l4_cap_idx_t *reader, l4_cap_idx_t *writer) 31 { 32 /* Both endpoints will employ a common paging coordinator. */ 33 34 PipePaging *paging = new PipePaging(_memory, size); 35 36 /* Each endpoint will have its own pager. */ 37 38 /* NOTE: Failure to open an endpoint should invalidate both, plus the 39 paging object. Also, any active server thread would need to be 40 cancelled. */ 41 42 return open_endpoint(paging, false, reader) || open_endpoint(paging, true, writer); 43 } 44 45 long PipeOpenerResource::open_endpoint(PipePaging *paging, bool writing, l4_cap_idx_t *endpoint) 46 { 47 PipePager *pager = new PipePager(paging, writing); 48 49 /* Start the endpoint server in a new thread. 50 If the thread does not start, the resource should be finalised. */ 51 52 ResourceServer server(pager); 53 long err = server.start_thread(); 54 55 /* Return the server capability to the caller. */ 56 57 if (!err) 58 *endpoint = server.config()->server; 59 60 return err; 61 } 62 63 // vim: tabstop=4 expandtab shiftwidth=4