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