/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include /* Assume we have no more than 128 TAs running at the same time */ #define MAX_NUM_APPS 128 /** * struct srv_state - global state of the coverage server * @hset: handle set * @coverage_record_list: list of coverage records * @mailbox: mailbox used to broadcast events */ struct srv_state { struct tipc_hset* hset; /* * TODO: A hash map would be nice. But we only have a list implementation * that's readily available. It should be good enough though, since the list * is short (<100) and lookups/insertions are very infrequent. */ struct list_node coverage_record_list; struct cov_shm mailbox; }; static inline void set_srv_state(struct tipc_port* port, struct srv_state* state) { port->priv = state; } static inline struct srv_state* get_srv_state(const struct tipc_port* port) { return (struct srv_state*)(port->priv); } /** * struct coverage_record - code coverage record about a given TA * @node: list node * @uuid: UUID of target TA * @idx: unique index assigned to this record and corresponding TA * @data: shared memory region holding the coverage record * @record_len: length of coverage record within @data */ struct coverage_record { struct list_node node; struct uuid uuid; size_t ta_idx; struct cov_shm data; size_t record_len; }; static struct coverage_record* find_coverage_record( struct list_node* head, const struct uuid* uuid) { struct coverage_record* record; list_for_every_entry(head, record, struct coverage_record, node) { if (!memcmp(&record->uuid, uuid, sizeof(struct uuid))) { return record; } } return NULL; } /** * coverage_aggregator_init() - initialize coverage aggregator service * @state: pointer to global &struct srv_state * * Return: 0 on success, negative error code on error */ int coverage_aggregator_init(struct srv_state* state); /** * coverage_client_init() - initialize coverage client service * @state: pointer to global &struct srv_state * * Return: 0 on success, negative error code on error */ int coverage_client_init(struct srv_state* state);