1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     os_BlockingQueue.h
4 
5   Copyright (C)2009-2012 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 47236 $
14  *---------------------------------------------------------------------------*/
15 
16 /* Please see man pages for details
17 
18 
19 
20 */
21 
22 #ifndef NN_OS_OS_BLOCKINGQUEUE_H_
23 #define NN_OS_OS_BLOCKINGQUEUE_H_
24 
25 #include <nn/os/os_LightSemaphore.h>
26 #include <nn/os/os_Mutex.h>
27 #include <nn/os/os_CriticalSection.h>
28 #include <nn/fnd/fnd_Interlocked.h>
29 #include <nn/util/util_NonCopyable.h>
30 
31 #ifdef __cplusplus
32 
33 namespace nn { namespace os {
34 
35 namespace detail {
36 
37 /* Please see man pages for details
38 
39 
40 
41 */
42 template <class Locker>
43 class BlockingQueueBase : private nn::util::NonCopyable<BlockingQueueBase<Locker> >
44 {
45 protected:
BlockingQueueBase()46     BlockingQueueBase() {}
BlockingQueueBase(uptr buffer[],size_t size)47     BlockingQueueBase(uptr buffer[], size_t size) { Initialize(buffer, size); }
48     ~BlockingQueueBase();
49     void Initialize(uptr buffer[], size_t size);
50     nn::Result TryInitialize(uptr buffer[], size_t size);
51     void Finalize();
52     void Enqueue(uptr data);
53     bool TryEnqueue(uptr data);
54     bool ForceEnqueue(uptr data, uptr* pOut);
55     void Jam(uptr data);
56     bool TryJam(uptr data);
57     uptr Dequeue();
58     bool TryDequeue(uptr* pOut);
59     uptr GetFront() const;
60     bool TryGetFront(uptr* pOut) const;
61 
62     // TODO: Decide on handling for these functions
63 
GetWaitingEnqueueCount(void)64     s32 GetWaitingEnqueueCount(void) const
65         { return m_WaitingEnqueueCount; }
66 
GetWaitingDequeueCount(void)67     s32 GetWaitingDequeueCount(void) const
68         { return m_WaitingDequeueCount; }
69 
70     // Internal member accessor for testing
GetSize()71     s32 GetSize() const
72         { return m_size; }
73 
GetUsedCount()74     s32 GetUsedCount() const
75         { return m_usedCount; }
76 
GetFirstIndex()77     s32 GetFirstIndex() const
78         { return m_firstIndex; }
79 
80 private:
81     typedef typename Locker::ScopedLock ScopedLock;
82 
83     uptr*                   m_ppBuffer;			//
84     mutable LightSemaphore  m_EnqueueSemaphore; //
85     mutable LightSemaphore  m_DequeueSemaphore; //
86     mutable Locker          m_cs;				//
87     size_t                  m_size;             //
88     s32                     m_firstIndex;       //
89     s32                     m_usedCount;        //
90     mutable nn::fnd::InterlockedVariable<s32> m_WaitingEnqueueCount; //
91     mutable nn::fnd::InterlockedVariable<s32> m_WaitingDequeueCount; //
92 
93 	//
94     void NotifyEnqueue() const;
95 
96 	//
97     void NotifyDequeue() const;
98 };
99 
100 }
101 
102 /* Please see man pages for details
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 */
120 class BlockingQueue : private os::detail::BlockingQueueBase<nn::os::CriticalSection>
121 {
122 private:
123     typedef os::detail::BlockingQueueBase<nn::os::CriticalSection> Base;
124 public:
125 
126     /* Please see man pages for details
127 
128 
129 
130 
131 
132 
133 
134     */
BlockingQueue()135     BlockingQueue() {}
136 
137     /* Please see man pages for details
138 
139 
140 
141 
142 
143 
144     */
BlockingQueue(uptr buffer[],size_t size)145     BlockingQueue(uptr buffer[], size_t size) : Base(buffer, size) {}
146 
147     /* Please see man pages for details
148 
149 
150 
151     */
~BlockingQueue()152     ~BlockingQueue() { Finalize(); }
153 
154     /* Please see man pages for details
155 
156 
157 
158 
159 
160 
161     */
Initialize(uptr buffer[],size_t size)162     void Initialize(uptr buffer[], size_t size) { Base::Initialize(buffer, size); }
163 
164     /* Please see man pages for details
165 
166 
167 
168 
169 
170 
171 
172 
173     */
TryInitialize(uptr buffer[],size_t size)174     nn::Result TryInitialize(uptr buffer[], size_t size) { return Base::TryInitialize(buffer, size); }
175 
176     /* Please see man pages for details
177 
178 
179 
180 
181 
182     */
Finalize()183     void Finalize() { Base::Finalize(); }
184 
185     /* Please see man pages for details
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
197 
198     */
Enqueue(uptr data)199     void Enqueue(uptr data) { Base::Enqueue(data); }
200 
201     /* Please see man pages for details
202 
203 
204 
205 
206 
207 
208 
209 
210 
211 
212 
213     */
TryEnqueue(uptr data)214     bool TryEnqueue(uptr data) { return Base::TryEnqueue(data); }
215 
216     /* Please see man pages for details
217 
218 
219 
220 
221 
222 
223 
224 
225 
226 
227 
228 
229     */
Jam(uptr data)230     void Jam(uptr data) { Base::Jam(data); }
231 
232     /* Please see man pages for details
233 
234 
235 
236 
237 
238 
239 
240 
241 
242 
243 
244     */
TryJam(uptr data)245     bool TryJam(uptr data) { return Base::TryJam(data); }
246 
247     /* Please see man pages for details
248 
249 
250 
251 
252 
253 
254 
255 
256 
257     */
Dequeue()258     uptr Dequeue() { return Base::Dequeue(); }
259 
260     /* Please see man pages for details
261 
262 
263 
264 
265 
266 
267 
268 
269 
270 
271 
272     */
TryDequeue(uptr * pOut)273     bool TryDequeue(uptr* pOut) { return Base::TryDequeue(pOut); }
274 
275     /* Please see man pages for details
276 
277 
278 
279 
280 
281 
282     */
GetFront()283     uptr GetFront() const { return Base::GetFront(); }
284 
285     /* Please see man pages for details
286 
287 
288 
289 
290 
291 
292 
293 
294     */
TryGetFront(uptr * pOut)295     bool TryGetFront(uptr* pOut) const { return Base::TryGetFront(pOut); }
296 
297     // TODO: For testing
298     using Base::GetSize;
299     using Base::GetUsedCount;
300     using Base::GetFirstIndex;
301 
302 };
303 
304 
305 /* Please see man pages for details
306 
307 
308 
309 
310 
311 
312 */
313 class SafeBlockingQueue : private os::detail::BlockingQueueBase<nn::os::Mutex>
314 {
315 private:
316     typedef os::detail::BlockingQueueBase<nn::os::Mutex> Base;
317 public:
318 
319     /* Please see man pages for details
320 
321 
322 
323     */
SafeBlockingQueue()324     SafeBlockingQueue() {}
325 
326     /* Please see man pages for details
327 
328 
329 
330 
331 
332 
333     */
SafeBlockingQueue(uptr buffer[],size_t size)334     SafeBlockingQueue(uptr buffer[], size_t size) : Base(buffer, size) {}
335 
336     /* Please see man pages for details
337 
338 
339 
340     */
~SafeBlockingQueue()341     ~SafeBlockingQueue() {}
342 
343     /* Please see man pages for details
344 
345 
346 
347 
348 
349 
350     */
Initialize(uptr buffer[],size_t size)351     void Initialize(uptr buffer[], size_t size) { Base::Initialize(buffer, size); }
352 
353     /* Please see man pages for details
354 
355 
356 
357 
358 
359 
360 
361 
362     */
TryInitialize(uptr buffer[],size_t size)363     nn::Result TryInitialize(uptr buffer[], size_t size) { return Base::TryInitialize(buffer, size); }
364 
365     /* Please see man pages for details
366 
367 
368 
369 
370 
371     */
Finalize()372     void Finalize() { Base::Finalize(); }
373 
374     /* Please see man pages for details
375 
376 
377 
378 
379 
380 
381 
382 
383 
384 
385 
386 
387     */
Enqueue(uptr data)388     void Enqueue(uptr data) { Base::Enqueue(data); }
389 
390     /* Please see man pages for details
391 
392 
393 
394 
395 
396 
397 
398 
399 
400 
401 
402     */
TryEnqueue(uptr data)403     bool TryEnqueue(uptr data) { return Base::TryEnqueue(data); }
404 
405     /* Please see man pages for details
406 
407 
408 
409 
410 
411 
412 
413 
414 
415 
416 
417 
418     */
Jam(uptr data)419     void Jam(uptr data) { Base::Jam(data); }
420 
421     /* Please see man pages for details
422 
423 
424 
425 
426 
427 
428 
429 
430 
431 
432 
433     */
TryJam(uptr data)434     bool TryJam(uptr data) { return Base::TryJam(data); }
435 
436     /* Please see man pages for details
437 
438 
439 
440 
441 
442 
443 
444 
445 
446     */
Dequeue()447     uptr Dequeue() { return Base::Dequeue(); }
448 
449     /* Please see man pages for details
450 
451 
452 
453 
454 
455 
456 
457 
458 
459 
460 
461     */
TryDequeue(uptr * pOut)462     bool TryDequeue(uptr* pOut) { return Base::TryDequeue(pOut); }
463 
464     /* Please see man pages for details
465 
466 
467 
468 
469 
470 
471     */
GetFront()472     uptr GetFront() const { return Base::GetFront(); }
473 
474     /* Please see man pages for details
475 
476 
477 
478 
479 
480 
481 
482 
483     */
TryGetFront(uptr * pOut)484     bool TryGetFront(uptr* pOut) const { return Base::TryGetFront(pOut); }
485 
486     // TODO: For testing
487     using Base::GetSize;
488     using Base::GetUsedCount;
489     using Base::GetFirstIndex;
490 
491 };
492 
493 }}
494 
495 #endif
496 
497 // Below is the C declaration
498 
499 #include <nn/util/detail/util_CLibImpl.h>
500 
501 /* Please see man pages for details
502 
503 
504 
505 
506 
507 
508 
509 
510 */
511 
512 
513 /* Please see man pages for details
514 
515 
516 
517 
518 */
519 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosBlockingQueue, nn::os::BlockingQueue, 40 + NN_OS_CRITICALSECTION_SIZE, u32);
520 
521 /* Please see man pages for details
522 
523 */
524 NN_EXTERN_C void nnosBlockingQueueInitialize(nnosBlockingQueue* this_, uptr buffer[], size_t size);
525 
526 /* Please see man pages for details
527 
528 */
529 NN_EXTERN_C bool nnosBlockingQueueTryInitialize(nnosBlockingQueue* this_, uptr buffer[], size_t size);
530 
531 /* Please see man pages for details
532 
533 */
534 NN_EXTERN_C void nnosBlockingQueueFinalize(nnosBlockingQueue* this_);
535 
536 /* Please see man pages for details
537 
538 */
539 NN_EXTERN_C bool nnosBlockingQueueTryEnqueue(nnosBlockingQueue* this_, uptr data);
540 
541 /* Please see man pages for details
542 
543 */
544 NN_EXTERN_C void nnosBlockingQueueEnqueue(nnosBlockingQueue* this_, uptr data);
545 
546 /* Please see man pages for details
547 
548 */
549 NN_EXTERN_C bool nnosBlockingQueueTryJam(nnosBlockingQueue* this_, uptr data);
550 
551 /* Please see man pages for details
552 
553 */
554 NN_EXTERN_C void nnosBlockingQueueJam(nnosBlockingQueue* this_, uptr data);
555 
556 /* Please see man pages for details
557 
558 */
559 NN_EXTERN_C bool nnosBlockingQueueTryDequeue(nnosBlockingQueue* this_, uptr* pOut);
560 
561 /* Please see man pages for details
562 
563 */
564 NN_EXTERN_C uptr nnosBlockingQueueDequeue(nnosBlockingQueue* this_);
565 
566 /* Please see man pages for details
567 
568 */
569 NN_EXTERN_C bool nnosBlockingQueueTryGetFront(nnosBlockingQueue* this_, uptr* pOut);
570 
571 /* Please see man pages for details
572 
573 */
574 NN_EXTERN_C uptr nnosBlockingQueueGetFront(nnosBlockingQueue* this_);
575 
576 /*
577 
578 
579 
580 */
581 
582 
583 /* Please see man pages for details
584 
585 
586 
587 
588 
589 
590 
591 
592 */
593 
594 /* Please see man pages for details
595 
596 
597 
598 
599 */
600 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosSafeBlockingQueue, nn::os::SafeBlockingQueue, 44, u32);
601 
602 /* Please see man pages for details
603 
604 */
605 NN_EXTERN_C void nnosSafeBlockingQueueInitialize(nnosSafeBlockingQueue* this_, uptr buffer[], size_t size);
606 
607 /* Please see man pages for details
608 
609 */
610 NN_EXTERN_C bool nnosSafeBlockingQueueTryInitialize(nnosSafeBlockingQueue* this_, uptr buffer[], size_t size);
611 
612 /* Please see man pages for details
613 
614 */
615 NN_EXTERN_C void nnosSafeBlockingQueueFinalize(nnosSafeBlockingQueue* this_);
616 
617 /* Please see man pages for details
618 
619 */
620 NN_EXTERN_C bool nnosSafeBlockingQueueTryEnqueue(nnosSafeBlockingQueue* this_, uptr data);
621 
622 /* Please see man pages for details
623 
624 
625 */
626 NN_EXTERN_C void nnosSafeBlockingQueueEnqueue(nnosSafeBlockingQueue* this_, uptr data);
627 
628 /* Please see man pages for details
629 
630 
631 */
632 NN_EXTERN_C bool nnosSafeBlockingQueueTryJam(nnosSafeBlockingQueue* this_, uptr data);
633 
634 /* Please see man pages for details
635 
636 
637 */
638 NN_EXTERN_C void nnosSafeBlockingQueueJam(nnosSafeBlockingQueue* this_, uptr data);
639 
640 /* Please see man pages for details
641 
642 
643 */
644 NN_EXTERN_C bool nnosSafeBlockingQueueTryDequeue(nnosSafeBlockingQueue* this_, uptr* pOut);
645 
646 /* Please see man pages for details
647 
648 
649 */
650 NN_EXTERN_C uptr nnosSafeBlockingQueueDequeue(nnosSafeBlockingQueue* this_);
651 
652 /* Please see man pages for details
653 
654 
655 */
656 NN_EXTERN_C bool nnosSafeBlockingQueueTryGetFront(nnosSafeBlockingQueue* this_, uptr* pOut);
657 
658 /* Please see man pages for details
659 
660 
661 */
662 NN_EXTERN_C uptr nnosSafeBlockingQueueGetFront(nnosSafeBlockingQueue* this_);
663 
664 
665 /*
666 
667 
668 
669 */
670 
671 #endif
672