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: 33014 $
14  *---------------------------------------------------------------------------*/
15 
16 /*! @file
17     @brief      BlockingQueue に関する API の宣言
18 
19     :include nn/os.h
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 /*!
38     :private
39 
40     @brief     ブロッキングキューの基底クラスです。
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: これらの関数の扱いを決める
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     // テスト用内部メンバアクセサ
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 /*!
103     @brief ブロッキングキューを扱う為のクラスです。
104 
105     ブロッキングキューは安全にスレッド間の同期をとることの出来るメッセージ機構です。
106 
107     キューにおくことのできる要素の数は初期化時に与えるバッファのサイズによって制限されます。
108     これを超える数の要素がキューにある際にさらにキューに追加しようとすると、スレッドがブロックします。
109     同様に、キューの要素が空のときにキューから要素を取り出そうとすると、スレッドがブロックします。
110 
111     今までメッセージキューと呼ばれていた機能と同等の機能を有しています。
112 
113     内部でのスレッド同期に、@ref CriticalSection を用いているため、
114     優先度逆転を起こすような状況では、デッドロックする可能性があります。
115     そのような可能性がある場合には、@ref SafeBlockingQueue を使うようにしてください。
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     /*!
125       @brief        コンストラクタです。
126 
127                     ブロッキングキューを構築します。
128 
129                     初期化処理を行わないコンストラクタと、初期化処理を行うコンストラクタがあります。
130 
131                     コンストラクタで初期化しない場合、使用する前には別途 @ref Initialize を呼んで初期化する必要があります。
132     */
BlockingQueue()133     BlockingQueue() {}
134 
135     /*!
136       @brief        コンストラクタです。
137 
138                     ブロッキングキューを構築し、初期化します。
139 
140       @param[in]    buffer  キューに使用するバッファ。uptr 型の配列を指定します。
141       @param[in]    size    バッファのサイズ。配列の要素数を指定します。
142     */
BlockingQueue(uptr buffer[],size_t size)143     BlockingQueue(uptr buffer[], size_t size) : Base(buffer, size) {}
144 
145     /*!
146       @brief        デストラクタです。
147 
148                     内部で @ref Finalize を呼びます。
149     */
~BlockingQueue()150     ~BlockingQueue() { Finalize(); }
151 
152     /*!
153       @brief        ブロッキングキューを指定したバッファとサイズで初期化します。
154 
155       @param[in]    buffer  キューに使用するバッファ。uptr 型の配列を指定します。
156       @param[in]    size    バッファのサイズ。配列の要素数を指定します。
157 
158       @return       無し。
159     */
Initialize(uptr buffer[],size_t size)160     void Initialize(uptr buffer[], size_t size) { Base::Initialize(buffer, size); }
161 
162     /*!
163       @brief        ブロッキングキューを指定したバッファとサイズで初期化します。
164 
165                     初期化に失敗した際は、失敗に応じた Result 値を返します。
166 
167       @param[in]    buffer  キューに使用するバッファ。uptr 型の配列を指定します。
168       @param[in]    size    バッファのサイズ。配列の要素数を指定します。
169 
170       @return       関数の実行結果を返します。
171     */
TryInitialize(uptr buffer[],size_t size)172     nn::Result TryInitialize(uptr buffer[], size_t size) { return Base::TryInitialize(buffer, size); }
173 
174     /*!
175       @brief        ブロッキングキューを破棄します。
176 
177                     デストラクタから自動的に呼び出されますが、明示的に呼ぶこともできます。
178 
179       @return       無し。
180     */
Finalize()181     void Finalize() { Base::Finalize(); }
182 
183     /*!
184       @brief        キューの末尾に要素を挿入します。
185 
186                     キューの末尾にデータを挿入しますが、
187                     キューが一杯 (full) であれば、この関数を呼び出したスレッドはブロックされます。
188                     受信スレッドが動作して、キューからデータを取り出すとすぐに再開されます。
189 
190                     @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
191                     これらのスレッドが起こされます。
192 
193       @param[in]    data    挿入する要素
194 
195       @return       無し。
196     */
Enqueue(uptr data)197     void Enqueue(uptr data) { Base::Enqueue(data); }
198 
199     /*!
200       @brief        キューの末尾への要素の挿入を試行します。
201 
202                     キューに空きがあれば、末尾に要素を挿入し、true を返します。
203                     キューに空きが無いとき、何もせず、false を返します。
204 
205                     要素の挿入がされたときに @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
206                     これらのスレッドが起こされます。
207 
208       @param[in]    data    挿入する要素
209 
210       @return       挿入されたとき true を返し、挿入されなかったとき false を返します。
211     */
TryEnqueue(uptr data)212     bool TryEnqueue(uptr data) { return Base::TryEnqueue(data); }
213 
214     /*!
215       @brief        キューの先頭に要素を挿入します。
216 
217                     キューの先頭にデータを挿入しますが、
218                     キューが一杯 (full) であれば、この関数を呼び出したスレッドはブロックされます。
219                     受信スレッドが動作して、キューからデータを取り出すとすぐに再開されます。
220 
221                     @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
222                     これらのスレッドが起こされます。
223 
224       @param[in]    data    挿入する要素
225 
226       @return       無し。
227     */
Jam(uptr data)228     void Jam(uptr data) { Base::Jam(data); }
229 
230     /*!
231       @brief        キューの先頭への要素の挿入を試行します。
232 
233                     キューに空きがあれば、先頭に要素を挿入し、true を返します。
234                     キューに空きが無いとき、何もせず、false を返します。
235 
236                     要素の挿入がされたときに @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
237                     これらのスレッドが起こされます。
238 
239       @param[in]    data    挿入する要素
240 
241       @return       挿入されたとき true を返し、挿入されなかったとき false を返します。
242     */
TryJam(uptr data)243     bool TryJam(uptr data) { return Base::TryJam(data); }
244 
245     /*!
246       @brief        キューの先頭から要素を取り出します。
247 
248                     キューが空であるとき、キューが空でなくなるまでスレッドをブロックします。
249                     キューが空でなければ、キューの先頭から要素を取り出しすぐに処理を返します。
250 
251                     @ref Enqueue や @ref Jam で待っているスレッドがあった場合、
252                     これらのスレッドが起こされます。
253 
254       @return       キューから取り出した要素
255     */
Dequeue()256     uptr Dequeue() { return Base::Dequeue(); }
257 
258     /*!
259       @brief        キューの先頭から要素を取り出します。
260 
261                     キューが空でなれば、キューの先頭から要素を取り出し、true を返します。
262                     キューが空のとき、何もせず、false を返します。
263 
264                     要素の挿入がされたときに @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
265                     これらのスレッドが起こされます。
266 
267       @param[out]   pOut    取り出した要素を書き込むバッファ
268 
269       @return       要素を取り出したとき true を返し、取り出さなかったとき false を返します。
270     */
TryDequeue(uptr * pOut)271     bool TryDequeue(uptr* pOut) { return Base::TryDequeue(pOut); }
272 
273     /*!
274       @brief        キューの先頭から要素を取得します。
275 
276                     キューが空であるとき、キューが空でなくなるまでスレッドをブロックします。
277                     キューが空でなければ、キューの先頭の要素を取得します。キューの状態は変化しません。
278 
279       @return       キューの先頭の要素
280     */
GetFront()281     uptr GetFront() const { return Base::GetFront(); }
282 
283     /*!
284       @brief        キューの先頭から要素を取得します。
285 
286                     キューが空であるとき、何もせず false を返します。
287                     キューが空でなければ、キューの先頭の要素を *pOut に書き込み、true を返します。キューの状態は変化しません。
288 
289       @param[out]   pOut        取り出す値の格納先
290 
291       @return       要素を取得できたとき true を返し、取得できなかったとき false を返します。
292     */
TryGetFront(uptr * pOut)293     bool TryGetFront(uptr* pOut) const { return Base::TryGetFront(pOut); }
294 
295     // TODO: テスト用
296     using Base::GetSize;
297     using Base::GetUsedCount;
298     using Base::GetFirstIndex;
299 
300 };
301 
302 
303 /*!
304     @brief ブロッキングキューを扱う為のクラスです。
305 
306            基本的に @ref BlockingQueue と同じですが、スレッド同期に @ref Mutex を使っているため、優先度逆転を起こすことがありません。
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     /*!
316       @brief        コンストラクタです。
317 
318                     ブロッキングキューを構築します。初期化はしません。使用する前には別途 @ref Initialize を呼んで初期化する必要があります。
319     */
SafeBlockingQueue()320     SafeBlockingQueue() {}
321 
322     /*!
323       @brief        コンストラクタです。
324 
325                     ブロッキングキューを構築し、初期化します。
326 
327       @param[in]    buffer  キューに使用するバッファ。uptr 型の配列を指定します。
328       @param[in]    size    バッファのサイズ。配列の要素数を指定します。
329     */
SafeBlockingQueue(uptr buffer[],size_t size)330     SafeBlockingQueue(uptr buffer[], size_t size) : Base(buffer, size) {}
331 
332     /*!
333       @brief        デストラクタです。
334 
335                     内部で @ref Finalize を呼びます。
336     */
~SafeBlockingQueue()337     ~SafeBlockingQueue() {}
338 
339     /*!
340       @brief        ブロッキングキューを指定したバッファとサイズで初期化します。
341 
342       @param[in]    buffer  キューに使用するバッファ。uptr 型の配列を指定します。
343       @param[in]    size    バッファのサイズ。配列の要素数を指定します。
344 
345       @return       無し。
346     */
Initialize(uptr buffer[],size_t size)347     void Initialize(uptr buffer[], size_t size) { Base::Initialize(buffer, size); }
348 
349     /*!
350       @brief        ブロッキングキューを指定したバッファとサイズで初期化します。
351 
352                     初期化に失敗した際は、失敗に応じた Result 値を返します。
353 
354       @param[in]    buffer  キューに使用するバッファ。uptr 型の配列を指定します。
355       @param[in]    size    バッファのサイズ。配列の要素数を指定します。
356 
357       @return       関数の実行結果を返します。
358     */
TryInitialize(uptr buffer[],size_t size)359     nn::Result TryInitialize(uptr buffer[], size_t size) { return Base::TryInitialize(buffer, size); }
360 
361     /*!
362       @brief        ブロッキングキューを破棄します。
363 
364                     デストラクタから自動的に呼び出されますが、明示的に呼ぶこともできます。
365 
366       @return       無し。
367     */
Finalize()368     void Finalize() { Base::Finalize(); }
369 
370     /*!
371       @brief        キューの末尾に要素を挿入します。
372 
373                     キューの末尾にデータを挿入しますが、
374                     キューが一杯 (full) であれば、この関数を呼び出したスレッドはブロックされます。
375                     受信スレッドが動作して、キューからデータを取り出すとすぐに再開されます。
376 
377                     @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
378                     これらのスレッドが起こされます。
379 
380       @param[in]    data    挿入する要素
381 
382       @return       無し。
383     */
Enqueue(uptr data)384     void Enqueue(uptr data) { Base::Enqueue(data); }
385 
386     /*!
387       @brief        キューの末尾への要素の挿入を試行します。
388 
389                     キューに空きがあれば、末尾に要素を挿入し、true を返します。
390                     キューに空きが無いとき、何もせず、false を返します。
391 
392                     要素の挿入がされたときに @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
393                     これらのスレッドが起こされます。
394 
395       @param[in]    data    挿入する要素
396 
397       @return       挿入されたとき true を返し、挿入されなかったとき false を返します。
398     */
TryEnqueue(uptr data)399     bool TryEnqueue(uptr data) { return Base::TryEnqueue(data); }
400 
401     /*!
402       @brief        キューの先頭に要素を挿入します。
403 
404                     キューの先頭にデータを挿入しますが、
405                     キューが一杯 (full) であれば、この関数を呼び出したスレッドはブロックされます。
406                     受信スレッドが動作して、キューからデータを取り出すとすぐに再開されます。
407 
408                     @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
409                     これらのスレッドが起こされます。
410 
411       @param[in]    data    挿入する要素
412 
413       @return       無し。
414     */
Jam(uptr data)415     void Jam(uptr data) { Base::Jam(data); }
416 
417     /*!
418       @brief        キューの先頭への要素の挿入を試行します。
419 
420                     キューに空きがあれば、先頭に要素を挿入し、true を返します。
421                     キューに空きが無いとき、何もせず、false を返します。
422 
423                     要素の挿入がされたときに @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
424                     これらのスレッドが起こされます。
425 
426       @param[in]    data    挿入する要素
427 
428       @return       挿入されたとき true を返し、挿入されなかったとき false を返します。
429     */
TryJam(uptr data)430     bool TryJam(uptr data) { return Base::TryJam(data); }
431 
432     /*!
433       @brief        キューの先頭から要素を取り出します。
434 
435                     キューが空であるとき、キューが空でなくなるまでスレッドをブロックします。
436                     キューが空でなければ、キューの先頭から要素を取り出しすぐに処理を返します。
437 
438                     @ref Enqueue や @ref Jam で待っているスレッドがあった場合、
439                     これらのスレッドが起こされます。
440 
441       @return       キューから取り出した要素
442     */
Dequeue()443     uptr Dequeue() { return Base::Dequeue(); }
444 
445     /*!
446       @brief        キューの先頭から要素を取り出します。
447 
448                     キューが空でなれば、キューの先頭から要素を取り出し、true を返します。
449                     キューが空のとき、何もせず、false を返します。
450 
451                     要素の挿入がされたときに @ref Dequeue や @ref GetFront で待っているスレッドがあった場合、
452                     これらのスレッドが起こされます。
453 
454       @param[out]   pOut    取り出した要素を書き込むバッファ
455 
456       @return       要素を取り出したとき true を返し、取り出さなかったとき false を返します。
457     */
TryDequeue(uptr * pOut)458     bool TryDequeue(uptr* pOut) { return Base::TryDequeue(pOut); }
459 
460     /*!
461       @brief        キューの先頭から要素を取得します。
462 
463                     キューが空であるとき、キューが空でなくなるまでスレッドをブロックします。
464                     キューが空でなければ、キューの先頭の要素を取得します。キューの状態は変化しません。
465 
466       @return       キューの先頭の要素
467     */
GetFront()468     uptr GetFront() const { return Base::GetFront(); }
469 
470     /*!
471       @brief        キューの先頭から要素を取得します。
472 
473                     キューが空であるとき、何もせず false を返します。
474                     キューが空でなければ、キューの先頭の要素を *pOut に書き込み、true を返します。キューの状態は変化しません。
475 
476       @param[out]   pOut        取り出す値の格納先
477 
478       @return       要素を取得できたとき true を返し、取得できなかったとき false を返します。
479     */
TryGetFront(uptr * pOut)480     bool TryGetFront(uptr* pOut) const { return Base::TryGetFront(pOut); }
481 
482     // TODO: テスト用
483     using Base::GetSize;
484     using Base::GetUsedCount;
485     using Base::GetFirstIndex;
486 
487 };
488 
489 }}
490 
491 #endif
492 
493 // 以下、C 用宣言
494 
495 #include <nn/util/detail/util_CLibImpl.h>
496 
497 /*!
498   @addtogroup   nn_os                   os
499   @{
500 
501   @defgroup     nn_os_BlockingQueue_c   BlockingQueue (C)
502 
503   @brief        @ref nn::os::BlockingQueue の C インタフェースモジュールです。
504 
505   @{
506 */
507 
508 
509 /*!
510   @struct       nnosBlockingQueue
511   @brief        ブロッキングキューを表す C の構造体です。
512 
513   @brief 対応するクラス @ref nn::os::BlockingQueue を参照してください。
514 */
515 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosBlockingQueue, nn::os::BlockingQueue, 40 + NN_OS_CRITICALSECTION_SIZE, u32);
516 
517 /*!
518   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::Initialize
519 */
520 NN_EXTERN_C void nnosBlockingQueueInitialize(nnosBlockingQueue* this_, uptr buffer[], size_t size);
521 
522 /*!
523   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::TryInitialize
524 */
525 NN_EXTERN_C bool nnosBlockingQueueTryInitialize(nnosBlockingQueue* this_, uptr buffer[], size_t size);
526 
527 /*!
528   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::Finalize
529 */
530 NN_EXTERN_C void nnosBlockingQueueFinalize(nnosBlockingQueue* this_);
531 
532 /*!
533   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::TryEnqueue
534 */
535 NN_EXTERN_C bool nnosBlockingQueueTryEnqueue(nnosBlockingQueue* this_, uptr data);
536 
537 /*!
538   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::Enqueue
539 */
540 NN_EXTERN_C void nnosBlockingQueueEnqueue(nnosBlockingQueue* this_, uptr data);
541 
542 /*!
543   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::TryJam
544 */
545 NN_EXTERN_C bool nnosBlockingQueueTryJam(nnosBlockingQueue* this_, uptr data);
546 
547 /*!
548   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::Jam
549 */
550 NN_EXTERN_C void nnosBlockingQueueJam(nnosBlockingQueue* this_, uptr data);
551 
552 /*!
553   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::TryDequeue
554 */
555 NN_EXTERN_C bool nnosBlockingQueueTryDequeue(nnosBlockingQueue* this_, uptr* pOut);
556 
557 /*!
558   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::Dequeue
559 */
560 NN_EXTERN_C uptr nnosBlockingQueueDequeue(nnosBlockingQueue* this_);
561 
562 /*!
563   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::TryGetFront
564 */
565 NN_EXTERN_C bool nnosBlockingQueueTryGetFront(nnosBlockingQueue* this_, uptr* pOut);
566 
567 /*!
568   @brief 対応する C++ 関数を参照してください。@ref nn::os::BlockingQueue::GetFront
569 */
570 NN_EXTERN_C uptr nnosBlockingQueueGetFront(nnosBlockingQueue* this_);
571 
572 /*!
573   @}
574 
575   @}
576 */
577 
578 
579 /*!
580   @addtogroup   nn_os                   os
581   @{
582 
583   @defgroup     nn_os_SafeBlockingQueue_c   SafeBlockingQueue (C)
584 
585   @brief        @ref nn::os::SafeBlockingQueue の C インタフェースモジュールです。
586 
587   @{
588 */
589 
590 /*!
591   @struct       nnosSafeBlockingQueue
592   @brief        セーフブロッキングキューを表す C の構造体です。
593 
594   @brief 対応するクラス @ref nn::os::SafeBlockingQueue を参照してください。
595 */
596 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosSafeBlockingQueue, nn::os::SafeBlockingQueue, 44, u32);
597 
598 /*!
599   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::Initialize
600 */
601 NN_EXTERN_C void nnosSafeBlockingQueueInitialize(nnosSafeBlockingQueue* this_, uptr buffer[], size_t size);
602 
603 /*!
604   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::TryInitialize
605 */
606 NN_EXTERN_C bool nnosSafeBlockingQueueTryInitialize(nnosSafeBlockingQueue* this_, uptr buffer[], size_t size);
607 
608 /*!
609   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::Finalize
610 */
611 NN_EXTERN_C void nnosSafeBlockingQueueFinalize(nnosSafeBlockingQueue* this_);
612 
613 /*!
614   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::TryEnqueue
615 */
616 NN_EXTERN_C bool nnosSafeBlockingQueueTryEnqueue(nnosSafeBlockingQueue* this_, uptr data);
617 
618 /*!
619   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::Enqueue
620 
621 */
622 NN_EXTERN_C void nnosSafeBlockingQueueEnqueue(nnosSafeBlockingQueue* this_, uptr data);
623 
624 /*!
625   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::TryJam
626 
627 */
628 NN_EXTERN_C bool nnosSafeBlockingQueueTryJam(nnosSafeBlockingQueue* this_, uptr data);
629 
630 /*!
631   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::Jam
632 
633 */
634 NN_EXTERN_C void nnosSafeBlockingQueueJam(nnosSafeBlockingQueue* this_, uptr data);
635 
636 /*!
637   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::TryDequeue
638 
639 */
640 NN_EXTERN_C bool nnosSafeBlockingQueueTryDequeue(nnosSafeBlockingQueue* this_, uptr* pOut);
641 
642 /*!
643   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::Dequeue
644 
645 */
646 NN_EXTERN_C uptr nnosSafeBlockingQueueDequeue(nnosSafeBlockingQueue* this_);
647 
648 /*!
649   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::TryGetFront
650 
651 */
652 NN_EXTERN_C bool nnosSafeBlockingQueueTryGetFront(nnosSafeBlockingQueue* this_, uptr* pOut);
653 
654 /*!
655   @brief 対応する C++ 関数を参照してください。@ref nn::os::SafeBlockingQueue::GetFront
656 
657 */
658 NN_EXTERN_C uptr nnosSafeBlockingQueueGetFront(nnosSafeBlockingQueue* this_);
659 
660 
661 /*!
662   @}
663 
664   @}
665 */
666 
667 #endif
668