Index: mojo/edk/system/core.cc |
diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc |
index 69c918c0be8b50df111abb11646daac1a610a3b9..a72addabbd3af35ddbd23819b293f482fe10db34 100644 |
--- a/mojo/edk/system/core.cc |
+++ b/mojo/edk/system/core.cc |
@@ -47,6 +47,13 @@ const uint32_t kMaxHandlesPerMessage = 1024 * 1024; |
// too; for now we just use a constant. This only affects bootstrap pipes. |
const uint64_t kUnknownPipeIdForDebug = 0x7f7f7f7f7f7f7f7fUL; |
+void CallWatchCallback(MojoWatchCallback callback, |
+ uintptr_t context, |
+ MojoResult result, |
+ MojoHandleSignalsState signals_state) { |
+ callback(context, result, signals_state); |
+} |
+ |
} // namespace |
Core::Core() {} |
@@ -105,8 +112,9 @@ bool Core::AddDispatchersFromTransit( |
failed = true; |
} |
if (failed) { |
+ Dispatcher::RequestContext request_context; |
for (auto d : dispatchers) |
- d.dispatcher->Close(); |
+ d.dispatcher->Close(&request_context); |
return false; |
} |
return true; |
@@ -134,7 +142,10 @@ MojoResult Core::PassWrappedPlatformHandle( |
PlatformHandleDispatcher* phd = |
static_cast<PlatformHandleDispatcher*>(d.get()); |
*platform_handle = phd->PassPlatformHandle(); |
- phd->Close(); |
+ |
+ Dispatcher::RequestContext request_context; |
+ phd->Close(&request_context); |
+ |
return MOJO_RESULT_OK; |
} |
@@ -201,7 +212,9 @@ MojoResult Core::PassSharedMemoryHandle( |
*read_only = false; |
*shared_memory_handle = platform_shared_buffer->DuplicateSharedMemoryHandle(); |
- shm_dispatcher->Close(); |
+ Dispatcher::RequestContext request_context; |
+ shm_dispatcher->Close(&request_context); |
+ |
return result; |
} |
@@ -275,7 +288,9 @@ MojoResult Core::Close(MojoHandle handle) { |
if (rv != MOJO_RESULT_OK) |
return rv; |
} |
- dispatcher->Close(); |
+ |
+ Dispatcher::RequestContext request_context; |
+ dispatcher->Close(&request_context); |
return MOJO_RESULT_OK; |
} |
@@ -319,6 +334,27 @@ MojoResult Core::WaitMany(const MojoHandle* handles, |
return rv; |
} |
+MojoResult Core::Watch(MojoHandle handle, |
+ MojoHandleSignals signals, |
+ MojoWatchCallback callback, |
+ uintptr_t context) { |
+ scoped_refptr<Dispatcher> dispatcher = GetDispatcher(handle); |
+ if (!dispatcher) |
+ return MOJO_RESULT_INVALID_ARGUMENT; |
+ |
+ Dispatcher::RequestContext request_context; |
+ return dispatcher->Watch( |
+ signals, base::Bind(&CallWatchCallback, callback, context), context, |
+ &request_context); |
+} |
+ |
+MojoResult Core::CancelWatch(MojoHandle handle, uintptr_t context) { |
+ scoped_refptr<Dispatcher> dispatcher = GetDispatcher(handle); |
+ if (!dispatcher) |
+ return MOJO_RESULT_INVALID_ARGUMENT; |
+ return dispatcher->CancelWatch(context); |
+} |
+ |
MojoResult Core::CreateWaitSet(MojoHandle* wait_set_handle) { |
if (!wait_set_handle) |
return MOJO_RESULT_INVALID_ARGUMENT; |
@@ -327,7 +363,8 @@ MojoResult Core::CreateWaitSet(MojoHandle* wait_set_handle) { |
MojoHandle h = AddDispatcher(dispatcher); |
if (h == MOJO_HANDLE_INVALID) { |
LOG(ERROR) << "Handle table full"; |
- dispatcher->Close(); |
+ Dispatcher::RequestContext request_context; |
+ dispatcher->Close(&request_context); |
return MOJO_RESULT_RESOURCE_EXHAUSTED; |
} |
@@ -412,8 +449,9 @@ MojoResult Core::CreateMessagePipe( |
*message_pipe_handle1 = AddDispatcher( |
new MessagePipeDispatcher(GetNodeController(), port1, pipe_id, 1)); |
if (*message_pipe_handle1 == MOJO_HANDLE_INVALID) { |
+ Dispatcher::RequestContext request_context; |
scoped_refptr<Dispatcher> unused; |
- unused->Close(); |
+ unused->Close(&request_context); |
handles_.GetAndRemoveDispatcher(*message_pipe_handle0, &unused); |
return MOJO_RESULT_RESOURCE_EXHAUSTED; |
} |
@@ -431,8 +469,12 @@ MojoResult Core::WriteMessage(MojoHandle message_pipe_handle, |
if (!dispatcher) |
return MOJO_RESULT_INVALID_ARGUMENT; |
- if (num_handles == 0) // Fast path: no handles. |
- return dispatcher->WriteMessage(bytes, num_bytes, nullptr, 0, flags); |
+ Dispatcher::RequestContext request_context; |
+ if (num_handles == 0) { |
+ // Fast path: no handles. |
+ return dispatcher->WriteMessage( |
+ bytes, num_bytes, nullptr, 0, flags, &request_context); |
+ } |
CHECK(handles); |
@@ -447,23 +489,25 @@ MojoResult Core::WriteMessage(MojoHandle message_pipe_handle, |
std::vector<Dispatcher::DispatcherInTransit> dispatchers; |
{ |
base::AutoLock lock(handles_lock_); |
- MojoResult rv = handles_.BeginTransit(handles, num_handles, &dispatchers); |
+ MojoResult rv = handles_.BeginTransit( |
+ handles, num_handles, &dispatchers, &request_context); |
if (rv != MOJO_RESULT_OK) { |
- handles_.CancelTransit(dispatchers); |
+ handles_.CancelTransit(dispatchers, &request_context); |
return rv; |
} |
} |
DCHECK_EQ(num_handles, dispatchers.size()); |
MojoResult rv = dispatcher->WriteMessage( |
- bytes, num_bytes, dispatchers.data(), num_handles, flags); |
+ bytes, num_bytes, dispatchers.data(), num_handles, flags, |
+ &request_context); |
{ |
base::AutoLock lock(handles_lock_); |
if (rv == MOJO_RESULT_OK) { |
- handles_.CompleteTransitAndClose(dispatchers); |
+ handles_.CompleteTransitAndClose(dispatchers, &request_context); |
} else { |
- handles_.CancelTransit(dispatchers); |
+ handles_.CancelTransit(dispatchers, &request_context); |
} |
} |
@@ -481,7 +525,9 @@ MojoResult Core::ReadMessage(MojoHandle message_pipe_handle, |
auto dispatcher = GetDispatcher(message_pipe_handle); |
if (!dispatcher) |
return MOJO_RESULT_INVALID_ARGUMENT; |
- return dispatcher->ReadMessage(bytes, num_bytes, handles, num_handles, flags); |
+ Dispatcher::RequestContext request_context; |
+ return dispatcher->ReadMessage( |
+ bytes, num_bytes, handles, num_handles, flags, &request_context); |
} |
MojoResult Core::CreateDataPipe( |
@@ -530,8 +576,10 @@ MojoResult Core::CreateDataPipe( |
scoped_refptr<Dispatcher> unused; |
handles_.GetAndRemoveDispatcher(*data_pipe_producer_handle, &unused); |
} |
- producer->Close(); |
- consumer->Close(); |
+ |
+ Dispatcher::RequestContext request_context; |
+ producer->Close(&request_context); |
+ consumer->Close(&request_context); |
return MOJO_RESULT_RESOURCE_EXHAUSTED; |
} |
@@ -627,7 +675,8 @@ MojoResult Core::CreateSharedBuffer( |
*shared_buffer_handle = AddDispatcher(dispatcher); |
if (*shared_buffer_handle == MOJO_HANDLE_INVALID) { |
LOG(ERROR) << "Handle table full"; |
- dispatcher->Close(); |
+ Dispatcher::RequestContext request_context; |
+ dispatcher->Close(&request_context); |
return MOJO_RESULT_RESOURCE_EXHAUSTED; |
} |
@@ -652,7 +701,8 @@ MojoResult Core::DuplicateBufferHandle( |
*new_buffer_handle = AddDispatcher(new_dispatcher); |
if (*new_buffer_handle == MOJO_HANDLE_INVALID) { |
LOG(ERROR) << "Handle table full"; |
- dispatcher->Close(); |
+ Dispatcher::RequestContext request_context; |
+ dispatcher->Close(&request_context); |
return MOJO_RESULT_RESOURCE_EXHAUSTED; |
} |