aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nu/win-x86/LockFreeLIFO.h
blob: 90ba9d3357d9a575f6b61dac9466665c581fcc0e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#pragma once
#include "foundation/types.h"
#include "nu/queue_node.h"
#include "foundation/align.h"
/* lock free stack object 
multiple threads can push and pop without locking
note that order is not guaranteed.  that is, if Thread 1 calls Insert before Thread 2, Thread 2's item might still make it in before.
*/
#ifdef __cplusplus
extern "C" {
#endif

	typedef NALIGN(8) struct lifo_struct_t
	{
		volatile queue_node_t *head;
		uint32_t aba;
	} lifo_t;

	/* use this to allocate an object that will go into this */
	queue_node_t *lifo_malloc(size_t bytes); 
	void lifo_free(queue_node_t *ptr);

	void lifo_init(lifo_t *lifo);
	void lifo_push(lifo_t *lifo, queue_node_t *cl);
	queue_node_t *lifo_pop(lifo_t *lifo);

	

#ifdef __cplusplus
}
#endif