2017-05-24 11:04:19 +00:00
|
|
|
#ifndef MM_MSG_CACHE_H
|
|
|
|
#define MM_MSG_CACHE_H
|
2017-05-24 09:54:24 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* machinarium.
|
|
|
|
*
|
|
|
|
* cooperative multitasking engine.
|
|
|
|
*/
|
|
|
|
|
2017-05-24 11:04:19 +00:00
|
|
|
typedef struct mm_msgcache mm_msgcache_t;
|
2017-05-24 09:54:24 +00:00
|
|
|
|
2017-05-24 11:04:19 +00:00
|
|
|
struct mm_msgcache
|
|
|
|
{
|
2017-05-24 09:54:24 +00:00
|
|
|
pthread_spinlock_t lock;
|
|
|
|
mm_list_t list;
|
|
|
|
int count;
|
|
|
|
};
|
|
|
|
|
|
|
|
void mm_msgcache_init(mm_msgcache_t*);
|
|
|
|
void mm_msgcache_free(mm_msgcache_t*);
|
|
|
|
|
|
|
|
mm_msg_t*
|
|
|
|
mm_msgcache_pop(mm_msgcache_t*);
|
|
|
|
|
|
|
|
void mm_msgcache_push(mm_msgcache_t*, mm_msg_t*);
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
mm_msg_ref(mm_msg_t *msg)
|
|
|
|
{
|
|
|
|
msg->refs++;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
2017-05-24 10:38:00 +00:00
|
|
|
mm_msg_unref(mm_msgcache_t *cache, mm_msg_t *msg)
|
2017-05-24 09:54:24 +00:00
|
|
|
{
|
|
|
|
if (msg->refs > 0) {
|
|
|
|
msg->refs--;
|
|
|
|
return;
|
|
|
|
}
|
2017-05-24 10:38:00 +00:00
|
|
|
mm_msgcache_push(cache, msg);
|
2017-05-24 09:54:24 +00:00
|
|
|
}
|
|
|
|
|
2017-05-24 11:04:19 +00:00
|
|
|
#endif /* MM_MSG_CACHE_H */
|