1e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/*
2e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Copyright (C) 2016 The Android Open Source Project
3e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
4e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Licensed under the Apache License, Version 2.0 (the "License");
5e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * you may not use this file except in compliance with the License.
6e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * You may obtain a copy of the License at
7e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
8e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *      http://www.apache.org/licenses/LICENSE-2.0
9e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
10e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Unless required by applicable law or agreed to in writing, software
11e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * distributed under the License is distributed on an "AS IS" BASIS,
12e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * See the License for the specific language governing permissions and
14e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * limitations under the License.
15e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */
16e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
17e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#ifndef CHRE_CORE_EVENT_H_
18e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#define CHRE_CORE_EVENT_H_
19e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
20e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre_api/chre/event.h"
21b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol#include "chre/platform/assert.h"
22e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/util/non_copyable.h"
23e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
24e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include <cstdint>
25e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
26e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddienamespace chre {
27e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
28161e2e84682b0b70467f96d572565149c292592eBrian Duddie//! Instance ID used for events sent by the system
29e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieconstexpr uint32_t kSystemInstanceId = 0;
30161e2e84682b0b70467f96d572565149c292592eBrian Duddie
31161e2e84682b0b70467f96d572565149c292592eBrian Duddie//! Target instance ID used to deliver a message to all nanoapps registered for
32161e2e84682b0b70467f96d572565149c292592eBrian Duddie//! the event
33e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieconstexpr uint32_t kBroadcastInstanceId = UINT32_MAX;
34e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
35161e2e84682b0b70467f96d572565149c292592eBrian Duddie//! This value can be used in a nanoapp's own instance ID to indicate that the
36161e2e84682b0b70467f96d572565149c292592eBrian Duddie//! ID is invalid/not assigned yet
37e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieconstexpr uint32_t kInvalidInstanceId = kBroadcastInstanceId;
38e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
39e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieclass Event : public NonCopyable {
40e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie public:
41161e2e84682b0b70467f96d572565149c292592eBrian Duddie  Event(uint16_t eventType, void *eventData,
42161e2e84682b0b70467f96d572565149c292592eBrian Duddie        chreEventCompleteFunction *freeCallback,
43161e2e84682b0b70467f96d572565149c292592eBrian Duddie        uint32_t senderInstanceId = kSystemInstanceId,
44161e2e84682b0b70467f96d572565149c292592eBrian Duddie        uint32_t targetInstanceId = kBroadcastInstanceId);
45161e2e84682b0b70467f96d572565149c292592eBrian Duddie
46b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol  void incrementRefCount() {
47b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol    mRefCount++;
48b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol    CHRE_ASSERT(mRefCount != 0);
49b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol  }
50b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol
51b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol  void decrementRefCount() {
52b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol    CHRE_ASSERT(mRefCount > 0);
53b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol    mRefCount--;
54b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol  }
55b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol
56b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol  bool isUnreferenced() const {
57b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol    return (mRefCount == 0);
58b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol  }
59e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
60e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  const uint16_t eventType;
61e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  void * const eventData;
62926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol  chreEventCompleteFunction * const freeCallback;
63e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  const uint32_t senderInstanceId;
64e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  const uint32_t targetInstanceId;
65e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
66e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie private:
67e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  size_t mRefCount = 0;
68e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie};
69e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
70e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie}
71e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
72e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#endif  // CHRE_CORE_EVENT_H_
73