2025-08-10 01:34:16 +02:00

118 lines
2.8 KiB
C

#ifndef ACKSTOREMAP_H_
#define ACKSTOREMAP_H_
#include <common/toolkit/tree/PointerRBTree.h>
#include <common/toolkit/tree/PointerRBTreeIter.h>
#include "WaitAckMap.h"
struct AckStoreEntry;
typedef struct AckStoreEntry AckStoreEntry;
struct AckStoreMapElem;
typedef struct AckStoreMapElem AckStoreMapElem;
struct AckStoreMap;
typedef struct AckStoreMap AckStoreMap;
struct AckStoreMapIter; // forward declaration of the iterator
static inline void AckStoreEntry_init(AckStoreEntry* this, char* ackID,
WaitAckMap* waitMap, WaitAckMap* receivedMap, WaitAckNotification* notifier);
static inline AckStoreEntry* AckStoreEntry_construct(char* ackID,
WaitAckMap* waitMap, WaitAckMap* receivedMap, WaitAckNotification* notifier);
static inline void AckStoreEntry_destruct(AckStoreEntry* this);
static inline void AckStoreMap_init(AckStoreMap* this);
static inline void AckStoreMap_uninit(AckStoreMap* this);
static inline bool AckStoreMap_insert(AckStoreMap* this, char* newKey,
AckStoreEntry* newValue);
static inline bool AckStoreMap_erase(AckStoreMap* this, const char* eraseKey);
extern struct AckStoreMapIter AckStoreMap_find(AckStoreMap* this, const char* searchKey);
extern int compareAckStoreMapElems(const void* key1, const void* key2);
struct AckStoreEntry
{
char* ackID;
WaitAckMap* waitMap; // ack will be removed from this map if it is received
WaitAckMap* receivedMap; // ack will be added to this map if it is received
WaitAckNotification* notifier;
};
struct AckStoreMapElem
{
RBTreeElem rbTreeElem;
};
struct AckStoreMap
{
RBTree rbTree;
};
void AckStoreEntry_init(AckStoreEntry* this, char* ackID,
WaitAckMap* waitMap, WaitAckMap* receivedMap, WaitAckNotification* notifier)
{
this->ackID = ackID;
this->waitMap = waitMap;
this->receivedMap = receivedMap;
this->notifier = notifier;
}
AckStoreEntry* AckStoreEntry_construct(char* ackID,
WaitAckMap* waitMap, WaitAckMap* receivedMap, WaitAckNotification* notifier)
{
AckStoreEntry* this = (AckStoreEntry*)os_kmalloc(sizeof(*this) );
AckStoreEntry_init(this, ackID, waitMap, receivedMap, notifier);
return this;
}
void AckStoreEntry_destruct(AckStoreEntry* this)
{
kfree(this);
}
void AckStoreMap_init(AckStoreMap* this)
{
PointerRBTree_init( (RBTree*)this, compareAckStoreMapElems);
}
void AckStoreMap_uninit(AckStoreMap* this)
{
PointerRBTree_uninit( (RBTree*)this);
}
bool AckStoreMap_insert(AckStoreMap* this, char* newKey, AckStoreEntry* newValue)
{
bool insRes;
insRes = PointerRBTree_insert( (RBTree*)this, newKey, newValue);
if(!insRes)
{
// not inserted because the key already existed
}
return insRes;
}
bool AckStoreMap_erase(AckStoreMap* this, const char* eraseKey)
{
return PointerRBTree_erase( (RBTree*)this, eraseKey);
}
#endif /* ACKSTOREMAP_H_ */