.. _program_listing_file_include_cmb_resourcepool.h: Program Listing for File cmb_resourcepool.h =========================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include/cmb_resourcepool.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: c /* * Copyright (c) Asbjørn M. Bonvik 2025-26. * * 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. */ #ifndef CIMBA_CMB_RESOURCEPOOL_H #define CIMBA_CMB_RESOURCEPOOL_H #include #include "cmb_resourceguard.h" #include "cmb_timeseries.h" #include "cmi_holdable.h" struct cmb_resourcepool { struct cmi_holdable core; struct cmb_resourceguard guard; struct cmi_hashheap holders; uint64_t capacity; uint64_t in_use; bool is_recording; struct cmb_timeseries history; }; extern struct cmb_resourcepool *cmb_resourcepool_create(void); extern void cmb_resourcepool_initialize(struct cmb_resourcepool *rpp, const char *name, uint64_t capacity); extern void cmb_resourcepool_terminate(struct cmb_resourcepool *rpp); extern void cmb_resourcepool_destroy(struct cmb_resourcepool *rpp); extern uint64_t cmb_resourcepool_held_by_process(struct cmb_resourcepool *rpp, const struct cmb_process *pp); extern int64_t cmb_resourcepool_acquire(struct cmb_resourcepool *rpp, uint64_t req_amount); extern int64_t cmb_resourcepool_preempt(struct cmb_resourcepool *rpp, uint64_t req_amount); extern void cmb_resourcepool_release(struct cmb_resourcepool *rpp, uint64_t rel_amount); [[maybe_unused]] static inline const char *cmb_resourcepool_get_name(struct cmb_resourcepool *rsp) { cmb_assert_debug(rsp != NULL); const struct cmi_resourcebase *rbp = (struct cmi_resourcebase *)rsp; cmb_assert_release(rbp->cookie == CMI_INITIALIZED); return rbp->name; } [[maybe_unused]] static inline uint64_t cmb_resourcepool_in_use(struct cmb_resourcepool *rsp) { cmb_assert_release(rsp != NULL); cmb_assert_release(((struct cmi_resourcebase *)rsp)->cookie == CMI_INITIALIZED); cmb_assert_debug(rsp->in_use <= rsp->capacity); return rsp->in_use; } [[maybe_unused]] static inline uint64_t cmb_resourcepool_available(struct cmb_resourcepool *rsp) { cmb_assert_release(rsp != NULL); cmb_assert_release(((struct cmi_resourcebase *)rsp)->cookie == CMI_INITIALIZED); cmb_assert_debug(rsp->in_use <= rsp->capacity); return (rsp->capacity - rsp->in_use); } extern void cmb_resourcepool_start_recording(struct cmb_resourcepool *rsp); extern void cmb_resourcepool_stop_recording(struct cmb_resourcepool *rsp); extern struct cmb_timeseries *cmb_resourcepool_get_history(struct cmb_resourcepool *rsp); extern void cmb_resourcepool_print_report(struct cmb_resourcepool *rsp, FILE *fp); #endif /* CIMBA_CMB_RESOURCEPOOL_H */