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