blob: 172ab3ade4374736280331e697138e4d59981903 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <object/dispatcher.h>
//#include <arch/ops.h>
#if WITH_LIB_KTRACE
#include <lib/ktrace.h>
#endif
#include <fbl/atomic.h>
#include <object/state_tracker.h>
namespace {
// The first 1K koids are reserved.
fbl::atomic<zx_koid_t> global_koid(1024ULL);
zx_koid_t GenerateKernelObjectId() {
return global_koid.fetch_add(1ULL);
}
} // namespace
Dispatcher::Dispatcher()
: koid_(GenerateKernelObjectId()),
handle_count_(0u) {
}
Dispatcher::~Dispatcher() {
#if WITH_LIB_KTRACE
ktrace(TAG_OBJECT_DELETE, (uint32_t)koid_, 0, 0, 0);
#endif
}
zx_status_t Dispatcher::add_observer(StateObserver* observer) {
auto state_tracker = get_state_tracker();
if (!state_tracker)
return ZX_ERR_NOT_SUPPORTED;
state_tracker->AddObserver(observer, nullptr);
return ZX_OK;
}
zx_status_t Dispatcher::user_signal(uint32_t clear_mask, uint32_t set_mask, bool peer) {
if (peer)
return ZX_ERR_NOT_SUPPORTED;
auto state_tracker = get_state_tracker();
if (!state_tracker)
return ZX_ERR_NOT_SUPPORTED;
// Generic objects can set all USER_SIGNALs. Particular object
// types (events and eventpairs) may be able to set more.
if ((set_mask & ~ZX_USER_SIGNAL_ALL) || (clear_mask & ~ZX_USER_SIGNAL_ALL))
return ZX_ERR_INVALID_ARGS;
state_tracker->UpdateState(clear_mask, set_mask);
return ZX_OK;
}