Skip to content

Commit df6fba6

Browse files
committed
added on lfqueue feature
1 parent dd17590 commit df6fba6

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

lfqueue.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,20 @@ lfqueue_deq(lfqueue_t *lfqueue) {
303303
__LFQ_FETCH_AND_ADD(&lfqueue->size, -1);
304304
return v;
305305
}
306-
// Rest the thread for other thread, to avoid keep looping force
307-
lfqueue_sleep(1);
308306
return NULL;
309307
}
310308

309+
void*
310+
lfqueue_deq_must(lfqueue_t *lfqueue) {
311+
void *v;
312+
while ( !(v = _dequeue(lfqueue)) ) {
313+
// Rest the thread for other thread, to avoid keep looping force
314+
lfqueue_sleep(1);
315+
}
316+
__LFQ_FETCH_AND_ADD(&lfqueue->size, -1);
317+
return v;
318+
}
319+
311320
/**This is only applicable when only single thread consume only**/
312321
void*
313322
lfqueue_single_deq(lfqueue_t *lfqueue) {
@@ -319,17 +328,27 @@ lfqueue_single_deq(lfqueue_t *lfqueue) {
319328
__LFQ_FETCH_AND_ADD(&lfqueue->size, -1);
320329
return v;
321330
}
322-
// Rest the thread for other thread, to avoid keep looping force
323-
lfqueue_sleep(1);
324331
return NULL;
325332
}
326333

334+
/**This is only applicable when only single thread consume only**/
335+
void*
336+
lfqueue_single_deq_must(lfqueue_t *lfqueue) {
337+
void *v;
338+
while ( !(v = _single_dequeue(lfqueue)) ) {
339+
// Rest the thread for other thread, to avoid keep looping force
340+
lfqueue_sleep(1);
341+
}
342+
__LFQ_FETCH_AND_ADD(&lfqueue->size, -1);
343+
return v;
344+
}
345+
327346
size_t
328347
lfqueue_size(lfqueue_t *lfqueue) {
329348
return __LFQ_ADD_AND_FETCH(&lfqueue->size, 0);
330349
}
331350

332-
void
351+
void
333352
lfqueue_sleep(unsigned int milisec) {
334353
#if defined __GNUC__ || defined __CYGWIN__ || defined __MINGW32__ || defined __APPLE__
335354
#pragma GCC diagnostic push

lfqueue.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ extern int lfqueue_init(lfqueue_t *lfqueue);
6060
extern int lfqueue_enq(lfqueue_t *lfqueue, void *value);
6161
extern void* lfqueue_deq(lfqueue_t *lfqueue);
6262
extern void* lfqueue_single_deq(lfqueue_t *lfqueue);
63+
64+
/** loop until value been dequeue, it sleeps 1ms if not found to reduce cpu high usage **/
65+
extern void* lfqueue_deq_must(lfqueue_t *lfqueue);
66+
extern void* lfqueue_single_deq_must(lfqueue_t *lfqueue);
67+
6368
extern void lfqueue_destroy(lfqueue_t *lfqueue);
6469
extern size_t lfqueue_size(lfqueue_t *lfqueue);
6570
extern void lfqueue_sleep(unsigned int milisec);

0 commit comments

Comments
 (0)