extern struct fres_vreses fres_vreses;
+/** Registry of all threads in an application that are bound to a VRES. */
+struct fres_threads_vres {
+ fosa_mutex_t mutex; /**< Mutex for manipulation with vreses tree. If all allocators are executed from one executor, locking can be avoided. */
+ gavl_cust_root_field_t threads; /**< Container of all virtual resources */
+};
+
+GAVL_CUST_NODE_INT_DEC(fres_threads_vres_nolock /* cust_prefix */,
+ struct fres_threads_vres /* cust_root_t */,
+ struct fres_thread_vres /* cust_item_t */,
+ fosa_thread_id_t /* cust_key_t */,
+ threads /* cust_root_node */,
+ node /* cust_item_node */,
+ id /* cust_item_key */,
+ fres_thread_vres_cmp /* cust_cmp_fnc */)
+
+extern struct fres_threads_vres fres_threads_vres;
+
+
/**
* Structure describing FRES allocator. It is used as a parameter to
* fra_register(), which registeres this allocator with contract
* fres_vres::new.
*
* @param vres VRES to create.
- * @param priv
+ * @param priv User supplied pointer registered by fra_register()
*
* @return Zero in case of success, nonzero error code on error.
*/
* the return of this function.
*
* @param vres VRES to change.
- * @param priv
+ * @param priv User supplied pointer registered by fra_register()
*
* @return Zero in case of success, nonzero error code on error.
*/
int (*change_vres)(fres_vres_t *vres, void *priv);
+ /**
+ * Cancel the CRES
+ *
+ * @param cancel_vres VRES to cancel
+ *
+ * @return Zero on succaess, non-zero error code on error.
+ */
+ int (*cancel_vres)(fres_vres_t *vres, void *priv);
/*@}*/
+
/** @name Full interface
- * The allocator can influence the order of applying changes. */
+ *
+ * Full interface provides a way for the allocator to
+ * influence the order of applying changes.
+ */
/*@{*/
/**
* A more general (and more compilcated) allocator
* fres_vres::perceived to @a fres_vres::new at some point in
* time (depending on the kind of the change) as the
* fres_vres::allocated parameters will be freed after the
- * return of this function.
+ * return of this function. When the fres_vres::new contains
+ * no blocks, the VRES should be canceled.
*
* @param vreses Array of pointers to VRESes.
* @param length The number of elements in @a vreses.
int (*apply_vres_changes)(fres_vres_t *vreses[], unsigned length, void *priv);
/*@}*/
- /**
- *
- *
- * @param cancel_vres
- *
- * @return
- */
- int (*cancel_vres)(fres_vres_t *vres, void *priv);
void *priv; /**< Pointer to allocator's private data */
/**
fres_vres_t *fra_get_vres(fres_contract_id_t *id);
+int fra_insert_thread_vres(const fosa_thread_id_t *id, fres_vres_t *vres);
+int fra_delete_thread_vres(const fosa_thread_id_t *id);
+fres_thread_vres_t *fra_get_thread_vres(const fosa_thread_id_t *id);
+fres_vres_t *fra_get_vres_thread_vres(const fosa_thread_id_t *id);
+
#endif