4#include <cx/thread/atomic.h>
5#include <cx/thread/aspin.h>
60#if DEBUG_LEVEL >= 2 && _64BIT
65typedef enum PrqGrowthEnum
75typedef struct PrqSegment PrqSegment;
78typedef struct PrqPerfStats {
80 atomic(uint64) grow_collision;
81 atomic(uint64) shrink;
82 atomic(uint64) shrink_collision;
83 atomic(uint64) head_contention;
84 atomic(uint64) reserved_contention;
86 atomic(uint64) push_optimal;
87 atomic(uint64) push_fast;
88 atomic(uint64) push_slow;
89 atomic(uint64) push_appeared_full;
90 atomic(uint64) push_actually_full;
91 atomic(uint64) push_collision;
92 atomic(uint64) push_retry;
93 atomic(uint64) push_full_retry;
94 atomic(uint64) push_noreserve_retiring;
96 atomic(uint64) pop_optimal;
97 atomic(uint64) pop_fast;
98 atomic(uint64) pop_slow;
99 atomic(uint64) pop_nonobvious_empty;
100 atomic(uint64) pop_assist;
101 atomic(uint64) pop_assist_fail;
102 atomic(uint64) pop_segtraverse;
103 atomic(uint64) pop_collision;
104 atomic(uint64) gc_run;
105 atomic(uint64) seg_retired;
106 atomic(uint64) seg_dealloc;
107 atomic(uint64) seg_dealloc_failinuse;
111typedef struct PrQueue
146 atomic(int32) access;
150 atomic(uint32) chgtime;
170typedef struct PrqSegment
181 PrqSegment *nextretired;
195 atomic(uint32) count;
205 atomic(uint32) reserved;
208 atomic(ptr) buffer[];
212void prqInitFixed(_Out_ PrQueue *prq, uint32 sz);
220void prqInitDynamic(_Out_ PrQueue *prq, uint32 minsz, uint32 targetsz, uint32 maxsz,
221 PrqGrowth growth, PrqGrowth shrink);
228bool prqDestroy(_Pre_valid_ _Post_invalid_ PrQueue *prq);
234bool prqPush(_Inout_ PrQueue *prq, _Pre_notnull_ _Post_invalid_
void *ptr);
238_Must_inspect_result_ _Ret_maybenull_
239void *prqPop(_Inout_ PrQueue *prq);
243bool prqCollect(_Inout_ PrQueue *prq);
247uint32 prqCount(_In_ PrQueue *prq);
259void *prqPeek(_In_ PrQueue *prq, uint32 n);
Mutex synchronization primitive.