Hi I am trying to implement a LRU cache in postgres extension. Please find
the markdown file for more details. Looking forward to hearing from you.
I am trying to write an LRU cache which can hold any type of data item in c for a postgresql extension. Everything is fine except that I am relying on postgresql hashmap which itself allocates  memory for entry and also maintains the same memory in a free list when removed.

The struct I defined:
```c
typedef void *(*KeyConstructFunction)(void *data);
typedef void *(*EntryConstructFunction)(void *data);
typedef void (*DestoryEntryFunction)(void *data);

struct LRU_Cache
{
	dlist_head *cacheList;
	HTAB *cacheHashmap;

	KeyConstructFunction keyConstructFunction;
	EntryConstructFunction valueConstructFunction;
	// will be called when I remove an entry from cache
	DestoryEntryFunction elemDestroyFunction;
};
```

So the problem is since I need to maintain the data order I am using dlist_node in entry which will  be given to dlist related functions to add into cacheList. since I won't the type of data passed I can't use the dlist functions as I don't know to which type I need to type cast. Consider the below function.
```c
dlist_container(ENTRY_TYPE, node, dlist_head_node(&LRU_Cache->cacheList));
```
This can be solved by giving called may be another function pointer but I would have to then do it for some other dlist functions to so I thought that won't be a good approach and avoided that approach. since I don't know the entry type I am unable to do this operation which gives me the entire data item. I though using a standard struct like below
```c
typedef struct Cache_Entry
{
	void *key;
	void *value;
	dlist_node node;
} Cache_Entry;
```
But the problem is if I give key size and entry size then it will be like 8 bytes and 32 bytes respectively due to this I can only hold 32 bytes in free list and have to specify called to never free key, value he/she passes. 

Seems like I got into some kind of dead lock. Is there a way to solve this design issue without compromising the generic thing.

Reply via email to