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