00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CUFLOW_WORKQ_H
00019 #define CUFLOW_WORKQ_H
00020
00021 #include <cuflow/fwd.h>
00022 #include <cu/clos.h>
00023
00024 CU_BEGIN_DECLARATIONS
00025
00026
00027
00028
00029
00030
00031
00032
00033 typedef cu_clop0(cuflow_workq_fn_t, void);
00034
00035 typedef struct cuflowP_workqseg *cuflowP_workqseg_t;
00036
00037 struct cuflow_workq
00038 {
00039 cuflowP_workqseg_t head_seg;
00040 cuflow_workq_fn_t *head_cur;
00041 cuflow_workq_fn_t *head_end;
00042 cuflowP_workqseg_t tail_seg;
00043 cuflow_workq_fn_t *tail_cur;
00044 cuflow_workq_fn_t *tail_end;
00045 cuflowP_workqseg_t last_seg;
00046 size_t free_seg_cnt;
00047 };
00048
00049 cuflow_workq_fn_t cuflowP_workq_pop_front(cuflow_workq_t wq);
00050 void cuflowP_workq_advance_tail(cuflow_workq_t wq);
00051
00052
00053 void cuflow_workq_init(cuflow_workq_t wq);
00054
00055
00056 CU_SINLINE void
00057 cuflow_workq_append(cuflow_workq_t wq, cuflow_workq_fn_t fn)
00058 {
00059 if (wq->tail_cur == wq->tail_end)
00060 cuflowP_workq_advance_tail(wq);
00061 *wq->tail_cur++ = fn;
00062 }
00063
00064
00065 CU_SINLINE cuflow_workq_fn_t
00066 cuflow_workq_pop_front(cuflow_workq_t wq)
00067 {
00068 if (wq->head_cur == wq->head_end)
00069 return cuflowP_workq_pop_front(wq);
00070 else
00071 return *wq->head_cur++;
00072 }
00073
00074
00075
00076 size_t cuflow_workq_size(cuflow_workq_t wq);
00077
00078
00079 CU_END_DECLARATIONS
00080
00081 #endif