1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     os_BlockingQueue.h
4 
5   Copyright (C)2009 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: 33107 $
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 how to handle 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 test purposes
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 class BlockingQueue : private os::detail::BlockingQueueBase<nn::os::CriticalSection>
119 {
120 private:
121     typedef os::detail::BlockingQueueBase<nn::os::CriticalSection> Base;
122 public:
123 
124     /* Please see man pages for details
125 
126 
127 
128 
129 
130 
131 
132     */
BlockingQueue()133     BlockingQueue() {}
134 
135     /* Please see man pages for details
136 
137 
138 
139 
140 
141 
142     */
BlockingQueue(uptr buffer[],size_t size)143     BlockingQueue(uptr buffer[], size_t size) : Base(buffer, size) {}
144 
145     /* Please see man pages for details
146 
147 
148 
149     */
~BlockingQueue()150     ~BlockingQueue() { Finalize(); }
151 
152     /* Please see man pages for details
153 
154 
155 
156 
157 
158 
159     */
Initialize(uptr buffer[],size_t size)160     void Initialize(uptr buffer[], size_t size) { Base::Initialize(buffer, size); }
161 
162     /* Please see man pages for details
163 
164 
165 
166 
167 
168 
169 
170 
171     */
TryInitialize(uptr buffer[],size_t size)172     nn::Result TryInitialize(uptr buffer[], size_t size) { return Base::TryInitialize(buffer, size); }
173 
174     /* Please see man pages for details
175 
176 
177 
178 
179 
180     */
Finalize()181     void Finalize() { Base::Finalize(); }
182 
183     /* Please see man pages for details
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196     */
Enqueue(uptr data)197     void Enqueue(uptr data) { Base::Enqueue(data); }
198 
199     /* Please see man pages for details
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 
210 
211     */
TryEnqueue(uptr data)212     bool TryEnqueue(uptr data) { return Base::TryEnqueue(data); }
213 
214     /* Please see man pages for details
215 
216 
217 
218 
219 
220 
221 
222 
223 
224 
225 
226 
227     */
Jam(uptr data)228     void Jam(uptr data) { Base::Jam(data); }
229 
230     /* Please see man pages for details
231 
232 
233 
234 
235 
236 
237 
238 
239 
240 
241 
242     */
TryJam(uptr data)243     bool TryJam(uptr data) { return Base::TryJam(data); }
244 
245     /* Please see man pages for details
246 
247 
248 
249 
250 
251 
252 
253 
254 
255     */
Dequeue()256     uptr Dequeue() { return Base::Dequeue(); }
257 
258     /* Please see man pages for details
259 
260 
261 
262 
263 
264 
265 
266 
267 
268 
269 
270     */
TryDequeue(uptr * pOut)271     bool TryDequeue(uptr* pOut) { return Base::TryDequeue(pOut); }
272 
273     /* Please see man pages for details
274 
275 
276 
277 
278 
279 
280     */
GetFront()281     uptr GetFront() const { return Base::GetFront(); }
282 
283     /* Please see man pages for details
284 
285 
286 
287 
288 
289 
290 
291 
292     */
TryGetFront(uptr * pOut)293     bool TryGetFront(uptr* pOut) const { return Base::TryGetFront(pOut); }
294 
295     // TODO: For testing
296     using Base::GetSize;
297     using Base::GetUsedCount;
298     using Base::GetFirstIndex;
299 
300 };
301 
302 
303 /* Please see man pages for details
304 
305 
306 
307 
308 */
309 class SafeBlockingQueue : private os::detail::BlockingQueueBase<nn::os::Mutex>
310 {
311 private:
312     typedef os::detail::BlockingQueueBase<nn::os::Mutex> Base;
313 public:
314 
315     /* Please see man pages for details
316 
317 
318 
319     */
SafeBlockingQueue()320     SafeBlockingQueue() {}
321 
322     /* Please see man pages for details
323 
324 
325 
326 
327 
328 
329     */
SafeBlockingQueue(uptr buffer[],size_t size)330     SafeBlockingQueue(uptr buffer[], size_t size) : Base(buffer, size) {}
331 
332     /* Please see man pages for details
333 
334 
335 
336     */
~SafeBlockingQueue()337     ~SafeBlockingQueue() {}
338 
339     /* Please see man pages for details
340 
341 
342 
343 
344 
345 
346     */
Initialize(uptr buffer[],size_t size)347     void Initialize(uptr buffer[], size_t size) { Base::Initialize(buffer, size); }
348 
349     /* Please see man pages for details
350 
351 
352 
353 
354 
355 
356 
357 
358     */
TryInitialize(uptr buffer[],size_t size)359     nn::Result TryInitialize(uptr buffer[], size_t size) { return Base::TryInitialize(buffer, size); }
360 
361     /* Please see man pages for details
362 
363 
364 
365 
366 
367     */
Finalize()368     void Finalize() { Base::Finalize(); }
369 
370     /* Please see man pages for details
371 
372 
373 
374 
375 
376 
377 
378 
379 
380 
381 
382 
383     */
Enqueue(uptr data)384     void Enqueue(uptr data) { Base::Enqueue(data); }
385 
386     /* Please see man pages for details
387 
388 
389 
390 
391 
392 
393 
394 
395 
396 
397 
398     */
TryEnqueue(uptr data)399     bool TryEnqueue(uptr data) { return Base::TryEnqueue(data); }
400 
401     /* Please see man pages for details
402 
403 
404 
405 
406 
407 
408 
409 
410 
411 
412 
413 
414     */
Jam(uptr data)415     void Jam(uptr data) { Base::Jam(data); }
416 
417     /* Please see man pages for details
418 
419 
420 
421 
422 
423 
424 
425 
426 
427 
428 
429     */
TryJam(uptr data)430     bool TryJam(uptr data) { return Base::TryJam(data); }
431 
432     /* Please see man pages for details
433 
434 
435 
436 
437 
438 
439 
440 
441 
442     */
Dequeue()443     uptr Dequeue() { return Base::Dequeue(); }
444 
445     /* Please see man pages for details
446 
447 
448 
449 
450 
451 
452 
453 
454 
455 
456 
457     */
TryDequeue(uptr * pOut)458     bool TryDequeue(uptr* pOut) { return Base::TryDequeue(pOut); }
459 
460     /* Please see man pages for details
461 
462 
463 
464 
465 
466 
467     */
GetFront()468     uptr GetFront() const { return Base::GetFront(); }
469 
470     /* Please see man pages for details
471 
472 
473 
474 
475 
476 
477 
478 
479     */
TryGetFront(uptr * pOut)480     bool TryGetFront(uptr* pOut) const { return Base::TryGetFront(pOut); }
481 
482     // TODO: For testing
483     using Base::GetSize;
484     using Base::GetUsedCount;
485     using Base::GetFirstIndex;
486 
487 };
488 
489 }}
490 
491 #endif
492 
493 // C declarations follow
494 
495 #include <nn/util/detail/util_CLibImpl.h>
496 
497 /* Please see man pages for details
498 
499 
500 
501 
502 
503 
504 
505 
506 */
507 
508 
509 /* Please see man pages for details
510 
511 
512 
513 
514 */
515 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosBlockingQueue, nn::os::BlockingQueue, 40 + NN_OS_CRITICALSECTION_SIZE, u32);
516 
517 /* Please see man pages for details
518 
519 */
520 NN_EXTERN_C void nnosBlockingQueueInitialize(nnosBlockingQueue* this_, uptr buffer[], size_t size);
521 
522 /* Please see man pages for details
523 
524 */
525 NN_EXTERN_C bool nnosBlockingQueueTryInitialize(nnosBlockingQueue* this_, uptr buffer[], size_t size);
526 
527 /* Please see man pages for details
528 
529 */
530 NN_EXTERN_C void nnosBlockingQueueFinalize(nnosBlockingQueue* this_);
531 
532 /* Please see man pages for details
533 
534 */
535 NN_EXTERN_C bool nnosBlockingQueueTryEnqueue(nnosBlockingQueue* this_, uptr data);
536 
537 /* Please see man pages for details
538 
539 */
540 NN_EXTERN_C void nnosBlockingQueueEnqueue(nnosBlockingQueue* this_, uptr data);
541 
542 /* Please see man pages for details
543 
544 */
545 NN_EXTERN_C bool nnosBlockingQueueTryJam(nnosBlockingQueue* this_, uptr data);
546 
547 /* Please see man pages for details
548 
549 */
550 NN_EXTERN_C void nnosBlockingQueueJam(nnosBlockingQueue* this_, uptr data);
551 
552 /* Please see man pages for details
553 
554 */
555 NN_EXTERN_C bool nnosBlockingQueueTryDequeue(nnosBlockingQueue* this_, uptr* pOut);
556 
557 /* Please see man pages for details
558 
559 */
560 NN_EXTERN_C uptr nnosBlockingQueueDequeue(nnosBlockingQueue* this_);
561 
562 /* Please see man pages for details
563 
564 */
565 NN_EXTERN_C bool nnosBlockingQueueTryGetFront(nnosBlockingQueue* this_, uptr* pOut);
566 
567 /* Please see man pages for details
568 
569 */
570 NN_EXTERN_C uptr nnosBlockingQueueGetFront(nnosBlockingQueue* this_);
571 
572 /*
573 
574 
575 
576 */
577 
578 
579 /* Please see man pages for details
580 
581 
582 
583 
584 
585 
586 
587 
588 */
589 
590 /* Please see man pages for details
591 
592 
593 
594 
595 */
596 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosSafeBlockingQueue, nn::os::SafeBlockingQueue, 44, u32);
597 
598 /* Please see man pages for details
599 
600 */
601 NN_EXTERN_C void nnosSafeBlockingQueueInitialize(nnosSafeBlockingQueue* this_, uptr buffer[], size_t size);
602 
603 /* Please see man pages for details
604 
605 */
606 NN_EXTERN_C bool nnosSafeBlockingQueueTryInitialize(nnosSafeBlockingQueue* this_, uptr buffer[], size_t size);
607 
608 /* Please see man pages for details
609 
610 */
611 NN_EXTERN_C void nnosSafeBlockingQueueFinalize(nnosSafeBlockingQueue* this_);
612 
613 /* Please see man pages for details
614 
615 */
616 NN_EXTERN_C bool nnosSafeBlockingQueueTryEnqueue(nnosSafeBlockingQueue* this_, uptr data);
617 
618 /* Please see man pages for details
619 
620 
621 */
622 NN_EXTERN_C void nnosSafeBlockingQueueEnqueue(nnosSafeBlockingQueue* this_, uptr data);
623 
624 /* Please see man pages for details
625 
626 
627 */
628 NN_EXTERN_C bool nnosSafeBlockingQueueTryJam(nnosSafeBlockingQueue* this_, uptr data);
629 
630 /* Please see man pages for details
631 
632 
633 */
634 NN_EXTERN_C void nnosSafeBlockingQueueJam(nnosSafeBlockingQueue* this_, uptr data);
635 
636 /* Please see man pages for details
637 
638 
639 */
640 NN_EXTERN_C bool nnosSafeBlockingQueueTryDequeue(nnosSafeBlockingQueue* this_, uptr* pOut);
641 
642 /* Please see man pages for details
643 
644 
645 */
646 NN_EXTERN_C uptr nnosSafeBlockingQueueDequeue(nnosSafeBlockingQueue* this_);
647 
648 /* Please see man pages for details
649 
650 
651 */
652 NN_EXTERN_C bool nnosSafeBlockingQueueTryGetFront(nnosSafeBlockingQueue* this_, uptr* pOut);
653 
654 /* Please see man pages for details
655 
656 
657 */
658 NN_EXTERN_C uptr nnosSafeBlockingQueueGetFront(nnosSafeBlockingQueue* this_);
659 
660 
661 /*
662 
663 
664 
665 */
666 
667 #endif
668