inital commit
[c11concurrency-benchmarks.git] / mabain / src / util / mb_lsq.h
1 /**
2  * Copyright (C) 2017 Cisco Inc.
3  *
4  * This program is free software: you can redistribute it and/or  modify
5  * it under the terms of the GNU General Public License, version 2,
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  */
16
17 // @author Changxue Deng <chadeng@cisco.com>
18
19 #ifndef __MBLSQ_H__
20 #define __MBLSQ_H__
21
22 #include <stdint.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25
26 namespace mabain {
27
28 typedef union _LSQ_Data
29 {
30     void *data_ptr;
31     int64_t value;
32 } LSQ_Data;
33 typedef struct _LSQ_Node
34 {
35     LSQ_Data data;
36     struct _LSQ_Node *next;
37 } LSQ_Node;
38
39 // mabain list/stack/queue class
40 class MBlsq
41 {
42 public:
43     MBlsq(void (*free_fn)(void *));
44     ~MBlsq();
45
46     int      AddToHead(void *ptr); // Stack
47     int      AddToTail(void *ptr); // Queue
48     void    *RemoveFromHead();
49     int      AddIntToHead(int64_t value);
50     int      AddIntToTail(int64_t value);
51     int64_t  RemoveIntFromHead();
52     void     Clear();
53     uint64_t Count() const;
54
55 private:
56     LSQ_Node *head;
57     LSQ_Node *tail;
58     uint64_t count;
59     void (*FreeFunc)(void *);
60 };
61
62 }
63
64 #endif