1 // Copyright 2016 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "mojo/edk/system/watcher.h" 6 7 #include "mojo/edk/system/handle_signals_state.h" 8 #include "mojo/edk/system/request_context.h" 9 10 namespace mojo { 11 namespace edk { 12 13 Watcher::Watcher(MojoHandleSignals signals, const WatchCallback& callback) 14 : signals_(signals), callback_(callback) { 15 } 16 17 void Watcher::MaybeInvokeCallback(MojoResult result, 18 const HandleSignalsState& state, 19 MojoWatchNotificationFlags flags) { 20 base::AutoLock lock(lock_); 21 if (is_cancelled_) 22 return; 23 24 callback_.Run(result, state, flags); 25 } 26 27 void Watcher::NotifyForStateChange(const HandleSignalsState& signals_state) { 28 RequestContext* request_context = RequestContext::current(); 29 if (signals_state.satisfies(signals_)) { 30 request_context->AddWatchNotifyFinalizer( 31 make_scoped_refptr(this), MOJO_RESULT_OK, signals_state); 32 } else if (!signals_state.can_satisfy(signals_)) { 33 request_context->AddWatchNotifyFinalizer( 34 make_scoped_refptr(this), MOJO_RESULT_FAILED_PRECONDITION, 35 signals_state); 36 } 37 } 38 39 void Watcher::NotifyClosed() { 40 static const HandleSignalsState closed_state = {0, 0}; 41 RequestContext::current()->AddWatchNotifyFinalizer( 42 make_scoped_refptr(this), MOJO_RESULT_CANCELLED, closed_state); 43 } 44 45 void Watcher::Cancel() { 46 base::AutoLock lock(lock_); 47 is_cancelled_ = true; 48 } 49 50 Watcher::~Watcher() {} 51 52 } // namespace edk 53 } // namespace mojo 54