1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: nos_horizon.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: 19672 $
14 *---------------------------------------------------------------------------*/
15
16 #include <nn/Handle.h>
17 #include <nn/os.h>
18 #include <nn/os/os_Thread.h>
19 #include <nn/os/os_CriticalSection.h>
20 #include <nn/os/os_Tick.h>
21 #include <nn/net/osl/osl_EventFlag.h>
22 #include <nn/net/osl/osl_Mbuf.h>
23 #include <nn/net/compatible/nlib.h>
24 #include <nn/net/compatible/ndebug.h>
25
26 #ifndef NN_NET_OSL_OSL_COMPATIBLE_H_
27 #define NN_NET_OSL_OSL_COMPATIBLE_H_
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 /*
34 * システム依存パラメータ
35 *
36 * システムのアロケータを呼び出す際、各モジュールは
37 * アラインサイズとして以下のいずれかを指定します。
38 * 適切な値を定義してください。
39 */
40 #define NOS_MEM_ALIGN_STRUCT_SAFE 8 /**< 構造体として使用する領域のメモリ確保で指定するアライン */
41 #define NOS_MEM_ALIGN_4 4 /**< 4byte長以下のアラインで良い領域のメモリ確保で指定するアライン */
42 #define NOS_MEM_ALIGN_STACK 8 /**< スレッドのスタックとして使用する領域のメモリ確保で指定するアライン */
43
44 #define NN_INLINE extern __inline
45 #define BOOL s32
46 #define TRUE 1
47 #define FALSE 0
48
49 typedef void (*nnosThreadFunc)(uptr param);
50
51 /* thread */
52
53 /**
54 * スレッド構造体。
55 */
56 typedef nnosThread NOSThread;
57
58 /**
59 * NOS_CreateThread()で返されるID。
60 *
61 * 以後、スレッドに対する操作は、NOSThreadにではなく、
62 * NOSThreadIdに対して行ってください。
63 */
64 typedef nnosThread *NOSThreadId;
65
66 /**
67 * スレッドキュー構造体。
68 */
69 typedef nnosEvent NOSThreadQueue;
70
71 /**
72 * スレッドの作成と起動
73 *
74 * スレッドを作成し、起動します。
75 *
76 * thread は作成するスレッド構造体へのポインタです。スレッドは func から実行されます。
77 * arg に入れられた値は func の第一引数として扱われます。
78 * スタック領域は stack と stackSize で指定します。stack はスタックポインタの開始アドレスで、
79 * スタック領域の最上位アドレス(+1)となります。
80 *
81 * (例)
82 * id = NOS_CreateAndStartThread( &thread, proc, NULL, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
83 *
84 *
85 * @param thread 初期化するスレッド構造体へのポインタ
86 * @param func 実行を開始する関数へのポインタ
87 * @param arg 実行を開始する関数へ渡す引数
88 * @param stack スタックポインタの開始アドレス。スタックは下位方向に積まれていくので、
89 * スタックの最上位の位置を指定しなければならない点に注意してください。
90 * アドレスは4バイトアラインメントされたものである必要があります。
91 * @param stackSize スタックのサイズ。単位はバイトです。4の倍数である必要があります。
92 * @param prio スレッドの優先度です。
93 *
94 * @return NULL 生成失敗。
95 * @return それ以外 スレッドID。以後このスレッドに対する操作を行う場合、このIDを渡してください。
96 *
97 * @see NOS_DestroyThread
98 * @see NOS_WakeupThread
99 * @see NOS_WakeupThreadDirect
100 * @see NOS_ExitThread
101 * @see NOS_DestroyThread
102 */
NOS_CreateAndStartThread(NOSThread * thread,void (* func)(void *),void * arg,void * stack,u32 stackSize,u32 prio)103 NN_INLINE NOSThreadId NOS_CreateAndStartThread(
104 NOSThread* thread,
105 void (*func)(void*),
106 void* arg,
107 void* stack,
108 u32 stackSize,
109 u32 prio )
110 {
111 NN_UNUSED_VAR(stackSize);
112 bool result = nnosThreadTryInitializeAndStart(thread, (nnosThreadFunc)func, (uptr)arg, (uptr)stack, prio, NN_OS_CORE_NO_USE_PROCESS_VALUE);
113 if (!result)
114 {
115 return 0;
116 }
117 return (NOSThreadId)thread;
118 }
119
120 /**
121 * スレッドの結合と終了
122 *
123 * 指定のスレッドを結合し終了します。その後、他の実行可能なスレッドに切り替わります。
124 *
125 * スレッド thread が mutex をロックしている場合は、それらロックしている全ての mutex をアンロックします。
126 *
127 * @param threadId 終了させるスレッドのスレッドID
128 *
129 * @return なし
130 *
131 * @see NOS_CreateThread
132 * @see NOS_ExitThread
133 */
NOS_JoinAndDestroyThread(NOSThreadId threadId)134 NN_INLINE void NOS_JoinAndDestroyThread(NOSThreadId threadId)
135 {
136 nnosThreadJoin(threadId);
137 nnosThreadFinalize(threadId);
138 }
139
140 /**
141 * スレッドの作成
142 *
143 * スレッドを作成します。
144 *
145 * thread は作成するスレッド構造体へのポインタです。スレッドは func から実行されます。
146 * arg に入れられた値は func の第一引数として扱われます。
147 * スタック領域は stack と stackSize で指定します。stack はスタックポインタの開始アドレスで、
148 * スタック領域の最上位アドレス(+1)となります。
149 *
150 * (例)
151 * id = NOS_CreateThread( &thread, proc, NULL, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
152 *
153 * NOS_CreateThread() で作成された直後のスレッドは休止状態になっていますので、
154 * NOS_WakeupThreadDirect() で明示的に動作状態にしてやる必要があります。
155 *
156 * @param thread 初期化するスレッド構造体へのポインタ
157 * @param func 実行を開始する関数へのポインタ
158 * @param arg 実行を開始する関数へ渡す引数
159 * @param stack スタックポインタの開始アドレス。スタックは下位方向に積まれていくので、
160 * スタックの最上位の位置を指定しなければならない点に注意してください。
161 * アドレスは4バイトアラインメントされたものである必要があります。
162 * @param stackSize スタックのサイズ。単位はバイトです。4の倍数である必要があります。
163 * @param prio スレッドの優先度です。
164 *
165 * @return NULL 生成失敗。
166 * @return それ以外 スレッドID。以後このスレッドに対する操作を行う場合、このIDを渡してください。
167 *
168 * @see NOS_DestroyThread
169 * @see NOS_WakeupThread
170 * @see NOS_WakeupThreadDirect
171 * @see NOS_ExitThread
172 * @see NOS_DestroyThread
173 */
NOS_CreateThread(NOSThread * thread,void (* func)(void *),void * arg,void * stack,u32 stackSize,u32 prio)174 NN_INLINE NOSThreadId NOS_CreateThread(
175 NOSThread* thread,
176 void (*func)(void*),
177 void* arg,
178 void* stack,
179 u32 stackSize,
180 u32 prio )
181 {
182 NN_UNUSED_VAR(stackSize);
183 bool result = nnosThreadTryInitializeAndStart(thread, (nnosThreadFunc)func, (uptr)arg, (uptr)stack, prio, NN_OS_CORE_NO_USE_PROCESS_VALUE);
184 if (!result)
185 {
186 return 0;
187 }
188 return (NOSThreadId)thread;
189 }
190
191 /**
192 * スレッドの終了
193 *
194 * 指定のスレッドを終了します。その後、他の実行可能なスレッドに切り替わります。
195 *
196 * スレッド thread が mutex をロックしている場合は、それらロックしている全ての mutex をアンロックします。
197 *
198 * @param threadId 終了させるスレッドのスレッドID
199 *
200 * @return なし
201 *
202 * @see NOS_CreateThread
203 * @see NOS_ExitThread
204 */
NOS_DestroyThread(NOSThreadId threadId)205 NN_INLINE void NOS_DestroyThread(NOSThreadId threadId)
206 {
207 // 終了していないスレッドを破棄してはいけない
208 nnosThreadJoin(threadId);
209 nnosThreadFinalize(threadId);
210 }
211
212 /**
213 * カレントスレッドIDの取得
214 *
215 * カレントスレッドのスレッドIDを取得します。
216 *
217 * @param なし
218 *
219 * @return カレントスレッドのスレッドID
220 *
221 * @see NOS_CreateThread
222 */
NOS_GetCurrentThread(void)223 NN_INLINE NOSThreadId NOS_GetCurrentThread(void)
224 {
225 return (NOSThreadId)nnosThreadGetCurrentId();
226 }
227
228 /**
229 * スレッドの起床
230 *
231 * カレントスレッドのスレッドIDを取得します。
232 * 指定されたスレッドを一時停止状態から復帰させます。
233 * この関数を呼ぶことでスレッドの再スケジューリングが発生します。
234 * 復帰したスレッドが実行可能なスレッドの中で最も優先度が高ければ実行権が移ります。
235 *
236 * @param threadId 起床させるスレッドのスレッドID
237 *
238 * @return なし
239 *
240 * @see NOS_CreateThread
241 * @see NOS_SleepThread
242 * @see NOS_WakeupThread
243 */
NOS_WakeupThreadDirect(NOSThreadId threadId)244 NN_INLINE void NOS_WakeupThreadDirect(NOSThreadId threadId)
245 {
246 NN_UNUSED_VAR(threadId);
247 return;
248 }
249
250 /**
251 * スレッドキューの初期化
252 *
253 * NOS_SleepThread() と NOS_WakeupThread() を含む、他のスレッド関数で
254 * 使われるスレッドキューを初期化します。
255 *
256 * queue には複数のスレッドを登録することができ、これにより NOS_WakeupThread() で
257 * 複数のスレッドを一度に起動状態にすることができます。
258 *
259 * @param queue 初期化するスレッドキューへのポインタ
260 *
261 * @return なし
262 *
263 * @see NOS_CreateThread
264 * @see NOS_WakeupThread
265 */
NOS_InitThreadQueue(NOSThreadQueue * queue)266 NN_INLINE void NOS_InitThreadQueue(NOSThreadQueue* queue)
267 {
268 nnosEventInitialize(queue, TRUE);
269 }
270
271 /**
272 * スレッドキューの起床
273 *
274 * 指定されたスレッドキュー中のスレッドを全て復帰します。
275 * スレッドキュー queue が指定された NOS_SleepThread() で一時停止状態になっている
276 * スレッドをまとめて実行可能状態にします。
277 *
278 * @param queue 起床させるスレッドが登録されているのスレッドキューへのポインタ
279 *
280 * @return なし
281 *
282 * @see NOS_CreateThread
283 * @see NOS_SleepThread
284 * @see NOS_WakeupThreadDirect
285 */
NOS_WakeupThread(NOSThreadQueue * queue)286 NN_INLINE void NOS_WakeupThread(NOSThreadQueue* queue)
287 {
288 nnosEventSignal(queue);
289 }
290
291 /**
292 * カレントスレッドの停止とスレッドキューへの登録
293 *
294 * カレントスレッドを一時停止し、queue で指定したスレッドキューへ登録します。
295 * この queue を引数にしてNOS_WakeupThread() が呼ばれるまで、一時停止状態のままと
296 * なります。ただし、それまでにNOS_WakeupThreadDirect() でこのスレッドが指定されれば
297 * 一時停止状態から実行可能状態に遷移します。
298 *
299 * queue がNULLの場合はスレッドキューへの登録を行ないませんので、他スレッドからの
300 * NOS_WakeupThreadDirect() でのみ復帰することが出来ます。
301 *
302 * @param queue 現在のスレッドを登録するスレッドキューへのポインタ。
303 * NULL ならスレッドキューへの登録を行ないません。
304 *
305 * @return なし
306 *
307 * @see NOS_CreateThread
308 * @see NOS_WakeupThread
309 * @see NOS_WakeupThreadDirect
310 */
NOS_SleepThread(NOSThreadQueue * queue)311 NN_INLINE void NOS_SleepThread(NOSThreadQueue* queue)
312 {
313 // 同期オブジェクトを使用せずに自らスレッドを休眠させる事は許さない
314 NN_TASSERT_(queue != NULL);
315 nnosEventClearSignal(queue);
316 nnosEventWaitSignal(queue);
317 }
318
319 /**
320 * スレッドの結合
321 *
322 * スレッドを結合し、指定のスレッドが終了するまで待ちます。
323 * 既に指定のスレッドが終了しているときには何もしません。
324 *
325 * 複数のスレッドが、一つのスレッドに対し OS_JoinThread() しても構いません。
326 *
327 * @param threadId 結合するスレッドのスレッドID
328 *
329 * @return なし
330 */
NOS_JoinThread(NOSThreadId threadId)331 NN_INLINE void NOS_JoinThread(NOSThreadId threadId)
332 {
333 nnosThreadJoin(threadId);
334 }
335
336
337 /* sleep */
338
339 /**
340 * スレッドの休止
341 *
342 * スレッドを一定時間休止状態にします。
343 *
344 * @param msec 休止状態にする時間 (ミリ秒)
345 *
346 * @return なし
347 */
NOS_Sleep(u32 msec)348 NN_INLINE void NOS_Sleep(u32 msec)
349 {
350 nnosThreadSleep((s64)msec*1000000 + 1);
351 }
352
NOS_YieldThread(void)353 NN_INLINE void NOS_YieldThread(void)
354 {
355 nnosThreadYield();
356 }
357
358 /* mutex */
359
360 /**
361 * Mutex構造体。
362 */
363 typedef nnosCriticalSection NOSMutex;
364
365 /**
366 * Mutex ID。
367 *
368 * NOS_CreateMutex()で返されるID。
369 * 以後、Mutexに対する操作は、NOSMutexにではなく
370 * NOSMutexIdに対して行ってください。
371 */
372 typedef nnosCriticalSection *NOSMutexId;
373
374 /**
375 * Mutexの作成
376 *
377 * Mutexを作成します。
378 *
379 * @param m 作成するMutex構造体へのポインタ。
380 *
381 * @return NULL 作成失敗
382 * @return それ以外 Mutex ID。
383 *
384 * @see NOS_DestroyMutex
385 * @see NOS_LockMutex
386 * @see NOS_UnlockMutex
387 * @see NOS_TryLockMutex
388 */
NOS_CreateMutex(NOSMutex * m)389 NN_INLINE NOSMutexId NOS_CreateMutex(NOSMutex *m)
390 {
391 NN_ASSERT(m != NULL);
392 bool result = nnosCriticalSectionTryInitialize(m);
393 if (!result)
394 {
395 return 0;
396 }
397 return (NOSMutexId)m;
398 }
399
400 /**
401 * Mutexの削除
402 *
403 * 指定のMutexを削除します。
404 *
405 * @param mutexId Mutex ID。
406 *
407 * @return なし
408 *
409 * @see NOS_CreateMutex
410 */
NOS_DestroyMutex(NOSMutexId mutexId)411 NN_INLINE void NOS_DestroyMutex(NOSMutexId mutexId)
412 {
413 NN_ASSERT(mutexId != NULL);
414 nnosCriticalSectionFinalize(mutexId);
415 }
416
417 /**
418 * Mutexのロック
419 *
420 * 呼び出したスレッドは、mutexId で指定したミューテックスのロックを試みます。
421 *
422 * mutexId が、別のスレッドによって保持されている場合、mutexId が解放されるまで呼び出したスレッドは一時停止されます。
423 * mutexId が、現在のスレッドに既に保持されている場合はすぐに戻ります。
424 * 但し、OS_LockMutex() を呼び出した回数は記録されていて、同じ回数だけアンロックされなければ mutex は解放されません。
425 *
426 * mutex をロックしているスレッドが OS_ExitThread() によって終了したときは、そのmutex は自動的にアンロックされます。
427 *
428 * @param mutexId Mutex ID。
429 *
430 * @return なし
431 *
432 * @see NOS_UnlockMutex
433 * @see NOS_TryLockMutex
434 * @see NOS_ExitThread
435 */
NOS_LockMutex(NOSMutexId mutexId)436 NN_INLINE void NOS_LockMutex(NOSMutexId mutexId)
437 {
438 NN_ASSERT(mutexId != NULL);
439 nnosCriticalSectionEnter(mutexId);
440 }
441
442 /**
443 * Mutexの解除
444 *
445 *
446 * 呼び出したスレッドは mutexId を解放します。
447 * 呼び出したスレッドは、mutexId の所有者でなければなりません。
448 *
449 * ただし、呼び出したスレッドがこの mutexId を n 回ロックしていた場合、
450 * n 番目の OS_LockMutex() でのみ実際にmutex を解放します。
451 *
452 * mutex をロックしているスレッドが OS_ExitThread() によって終了したときは、そのmutex は自動的にアンロックされます。
453 *
454 * @param mutexId Mutex ID。
455 *
456 * @return なし
457 *
458 * @see NOS_LockMutex
459 * @see NOS_TryLockMutex
460 * @see NOS_ExitThread
461 */
NOS_UnlockMutex(NOSMutexId mutexId)462 NN_INLINE void NOS_UnlockMutex(NOSMutexId mutexId)
463 {
464 NN_ASSERT(mutexId != NULL);
465 nnosCriticalSectionLeave(mutexId);
466 }
467
468 /**
469 * Mutexのロックを試みる
470 *
471 * 呼び出したスレッドは、mutexId で指定したミューテックスのロックを試みます。
472 *
473 * ロックできない場合は FALSE を返します。ロックできる場合は、OS_LockMutex() の処理に準じます。
474 *
475 * @param mutexId Mutex ID。
476 *
477 * @return なし
478 *
479 * @see NOS_UnlockMutex
480 * @see NOS_LockMutex
481 * @see NOS_ExitThread
482 */
NOS_TryLockMutex(NOSMutexId mutexId)483 NN_INLINE BOOL NOS_TryLockMutex(NOSMutexId mutexId)
484 {
485 NN_ASSERT(mutexId != NULL);
486 return nnosCriticalSectionTryEnter(mutexId);
487 }
488
489 /* tick */
490
491 /**
492 * チック値
493 *
494 * NOSTickは必ずu64長で、u64全域で一周すカウンタとして
495 * 実装してください。
496 */
497 typedef u64 NOSTick;
498
499 /**
500 * チック値の取得
501 *
502 * OS_GetTick()がu64より小さい値域を返す場合は、
503 * なんらかの方法でu64全域の値となるような実装を
504 * 行ってください。
505 *
506 * @return チック値
507 */
NOS_GetTick(void)508 NN_INLINE NOSTick NOS_GetTick(void)
509 {
510 //TODO: 回り込み対策
511 return (NOSTick)nnosTickGetSystemCurrent();
512 }
513
514 /**
515 * NOSTickの大小比較
516 *
517 * aとbはNOSTickの半域以上離れていないとします。
518 *
519 * NOS_CmpTick(a, b) > 0 なら a > b。
520 * NOS_CmpTick(a, b) < 0 なら a < b。
521 * NOS_CmpTick(a, b) = 0 なら a = b。
522 *
523 * @param a チック値A。
524 * @param b チック値B。
525 *
526 * @return チックの差分。
527 */
NOS_CmpTick(NOSTick a,NOSTick b)528 NN_INLINE s64 NOS_CmpTick(NOSTick a, NOSTick b)
529 {
530 return (s64)(a - b);
531 }
532
533
NOS_TicksToSeconds(s64 tick)534 NN_INLINE s64 NOS_TicksToSeconds(s64 tick)
535 {
536 return nnosTickConvertToSeconds(tick);
537 }
NOS_TicksToMilliSeconds(s64 tick)538 NN_INLINE s64 NOS_TicksToMilliSeconds(s64 tick)
539 {
540 return nnosTickConvertToMilliSeconds(tick);
541 }
NOS_TicksToMicroSeconds(s64 tick)542 NN_INLINE s64 NOS_TicksToMicroSeconds(s64 tick)
543 {
544 return nnosTickConvertToMicroSeconds(tick);
545 }
NOS_TicksToNanoSeconds(s64 tick)546 NN_INLINE s64 NOS_TicksToNanoSeconds(s64 tick)
547 {
548 return nnosTickConvertToNanoSeconds(tick);
549 }
NOS_SecondsToTicks(s64 s)550 NN_INLINE NOSTick NOS_SecondsToTicks(s64 s)
551 {
552 return nnosTickConvertFromSeconds(s);
553 }
NOS_MilliSecondsToTicks(s64 ms)554 NN_INLINE NOSTick NOS_MilliSecondsToTicks(s64 ms)
555 {
556 return nnosTickConvertFromMilliSeconds(ms);
557 }
NOS_MicroSecondsToTicks(s64 ms)558 NN_INLINE NOSTick NOS_MicroSecondsToTicks(s64 ms)
559 {
560 return nnosTickConvertFromMicroSeconds(ms);
561 }
NOS_NanoSecondsToTicks(s64 ns)562 NN_INLINE NOSTick NOS_NanoSecondsToTicks(s64 ns)
563 {
564 return nnosTickConvertFromNanoSeconds(ns);
565 }
566
567 /* messagequeue */
568
569 #define NOS_MESSAGE_NOBLOCK 0
570 #define NOS_MESSAGE_BLOCK 1
571
572 /**
573 * メッセージキュー構造体
574 */
575 typedef nnosBlockingQueue NOSMessageQueue;
576
577 /**
578 * メッセージキューID
579 */
580 typedef nnosBlockingQueue *NOSMessageQueueId;
581
582 /**
583 * メッセージ
584 */
585 typedef uptr NOSMessage;
586
587 /**
588 * メッセージキューの作成
589 *
590 * メッセージキューを作成して、そのIDを返します。
591 *
592 * 引数 msgArray は、このキューついてメッセージを保持する配列へのポインタで、
593 * 引数 msgCount は、キューが保持できるメッセージ数 (すなわち、配列のサイズ) です。
594 *
595 * @param mq メッセージキュー構造体へのポインタ
596 * @param msgArray メッセージを保持する配列へのポインタ
597 * @param msgCount 配列が保持できるメッセージ数
598 *
599 * @return メッセージキューID。
600 *
601 * @see NOS_DestroyMessageQueue
602 * @see NOS_ReceiveMessage
603 * @see NOS_SendMessage
604 * @see NOS_ReadMessage
605 * @see NOS_JamMessage
606 */
NOS_CreateMessageQueue(NOSMessageQueue * mq,NOSMessage * msgArray,s32 msgCount)607 NN_INLINE NOSMessageQueueId NOS_CreateMessageQueue(NOSMessageQueue *mq, NOSMessage *msgArray, s32 msgCount)
608 {
609 bool result = nnosBlockingQueueTryInitialize(mq, msgArray, msgCount);
610 if (!result)
611 {
612 return 0;
613 }
614 return (NOSMessageQueueId)mq;
615 }
616
617 /**
618 * メッセージキューの削除
619 *
620 * メッセージキューを削除します。
621 *
622 * @param mqId メッセージキューID。
623 *
624 * @return なし
625 *
626 * @see NOS_CreateMessageQueue
627 */
NOS_DestroyMessageQueue(NOSMessageQueueId mqId)628 NN_INLINE void NOS_DestroyMessageQueue(NOSMessageQueueId mqId)
629 {
630 nnosBlockingQueueFinalize(mqId);
631 }
632
633 /**
634 * メッセージキューからメッセージの取り出し
635 *
636 * メッセージキューからメッセージを取り出します。
637 * また、このキューにメッセージを送るために待ち状態のスレッドをどれも実行可能状態にします。
638 * 送信スレッドは、優先順位の順に実行されます。
639 *
640 *
641 * flag にOS_MESSAGE_BLOCKを設定した場合、キューが空 (empty) であれば、
642 * この関数を呼び出したスレッドは一時停止されます。メッセージがキューに送られるとすぐに再開されます。
643 * より高い優先順位の受信スレッドが他にあった場合、これらのスレッドが最初に実行し、
644 * メッセージを取り出す点に注意してください。
645 * このスレッドが実行する時にメッセージキューが空であった場合、
646 * 他のメッセージがキューに送られるまで、このスレッドは再び一時停止します。
647 *
648 * flagにOS_MESSAGE_NOBLOCKを設定した場合、呼び出したスレッドにすぐに戻ります。
649 * キューが空でなければ、TRUEを返し、キューが空であればFALSEを返します。
650 *
651 * @param mqId メッセージキューID
652 * @param msg 受信するメッセージ
653 * @param flag OS_MESSAGE_BLOCKを設定した場合、OS_ReceiveMessage関数は、空のキューをブロックします。 <br>
654 * OS_MESSAGE_NOBLOCKを設定した場合、OS_ReceiveMessage関数は、キューが空であろうとなかろうと、 すぐに返ります。
655 *
656 * @return TRUE メッセージがうまく取り出せた場合
657 * @return FALSE OS_MESSAGE_NOBLOCK が指定され、キューが空であった場合
658 *
659 * @see NOS_SendMessage
660 * @see NOS_ReadMessage
661 * @see NOS_JamMessage
662 */
NOS_ReceiveMessage(NOSMessageQueueId mqId,NOSMessage * msg,s32 flag)663 NN_INLINE BOOL NOS_ReceiveMessage(NOSMessageQueueId mqId, NOSMessage *msg, s32 flag)
664 {
665 if (flag == NOS_MESSAGE_BLOCK)
666 {
667 *msg = nnosBlockingQueueDequeue(mqId);
668 return TRUE;
669 }
670 else
671 {
672 return nnosBlockingQueueTryDequeue(mqId, msg);
673 }
674 }
675
676 /**
677 * メッセージキューの末尾にメッセージを挿入
678 *
679 * 指定したメッセージキューの末尾にメッセージを挿入します。
680 * また、このメッセージキューで待ち状態のスレッドを実行可能状態にします。受信スレッドは、優先順位の順に実行されます。
681 *
682 * flag にOS_MESSAGE_BLOCKを設定した場合、キューが一杯 (full) であれば、
683 * この関数を呼び出したスレッドを一時停止します。受信スレッドが動作して、
684 * キューからメッセージを取り出すとすぐに再開されます。
685 * より高い優先順位の送信スレッドが他にあった場合、それらが最初に動作し、
686 * 再度メッセージキューが一杯になるかもしれない点に注意してください。
687 * これが起こった場合、受信スレッドがメッセージキューに空をつくるまで、このスレッドは、再び一時停止します。
688 *
689 * flag にOS_MESSAGE_NOBLOCKを設定した場合、呼び出したスレッドにすぐに返ります。
690 * キューが一杯でない場合、TRUEが返されます。キューが一杯であった場合、 FALSEが返されます。
691 *
692 * @param mqId メッセージキューID
693 * @param msg 送信するメッセージ
694 * @param flag OS_MESSAGE_BLOCKを設定した場合、OS_SendMessage関数は、キューが一杯の時ブロックします。 <br>
695 * OS_MESSAGE_NOBLOCKを設定した場合、OS_SendMessage関数は、キューが一杯であろうとなかろうと、 すぐに返ります。
696 *
697 * @return TRUE メッセージがうまく送られた場合
698 * @return FALSE OS_MESSAGE_NOBLOCK が指定され、キューが一杯であった場合
699 *
700 * @see NOS_ReceiveMessage
701 * @see NOS_ReadMessage
702 * @see NOS_JamMessage
703 */
NOS_SendMessage(NOSMessageQueueId mqId,NOSMessage msg,s32 flag)704 NN_INLINE BOOL NOS_SendMessage(NOSMessageQueueId mqId, NOSMessage msg, s32 flag)
705 {
706 if (flag == NOS_MESSAGE_BLOCK)
707 {
708 nnosBlockingQueueEnqueue(mqId, msg);
709 return TRUE;
710 }
711 else
712 {
713 return nnosBlockingQueueTryEnqueue(mqId, msg);
714 }
715 }
716
717 /**
718 * メッセージキューの先頭のメッセージのコピー
719 *
720 * メッセージキューの先頭のメッセージをコピーします。
721 * メッセージキューの状態は変化しません。また OS_ReceiveMessatge() と違って、
722 * このキューにメッセージを送るために待ち状態のスレッドを実行可能状態にすることもありません。
723 * いわば、OS_ReadMessage() は、メッセージキューの先頭のメッセージを覗くための関数です。
724 *
725 * flagsにOS_MESSAGE_BLOCKを設定した場合、キューが空 (empty) であれば、
726 * この関数を呼び出したスレッドは一時停止されます。メッセージがキューに送られるとすぐに再開されます。
727 * より高い優先順位の受信スレッドが他にあった場合、これらのスレッドが最初に実行し、
728 * メッセージを取り出す点に注意してください。
729 * このスレッドが実行する時にメッセージキューが空であった場合、他のメッセージがキューに送られるまで、
730 * このスレッドは再び一時停止します。
731 *
732 * flagsにOS_MESSAGE_NOBLOCKを設定した場合、呼び出したスレッドにすぐに戻ります。
733 * キューが空でなければ、TRUE を返し、キューが空であればFALSE を返します。
734 *
735 * @param mqId メッセージキューID
736 * @param msg 覗いたメッセージ
737 * @param flag OS_MESSAGE_BLOCKを設定した場合、OS_ReadMessage関数は、空のキューをブロックします。 <br>
738 * OS_MESSAGE_NOBLOCKを設定した場合、OS_ReadMessage関数は、キューが空であろうとなかろうと、 すぐに返ります。
739 *
740 * @return TRUE メッセージがうまく取り出せた場合
741 * @return FALSE OS_MESSAGE_NOBLOCK が指定され、キューが空であった場合
742 *
743 * @see NOS_ReceiveMessage
744 * @see NOS_SendMessage
745 * @see NOS_JamMessage
746 */
NOS_ReadMessage(NOSMessageQueueId mqId,NOSMessage * msg,s32 flag)747 NN_INLINE BOOL NOS_ReadMessage(NOSMessageQueueId mqId, NOSMessage *msg, s32 flag)
748 {
749 if (flag == NOS_MESSAGE_BLOCK)
750 {
751 *msg = nnosBlockingQueueGetFront(mqId);
752 return TRUE;
753 }
754 else
755 {
756 return nnosBlockingQueueTryGetFront(mqId, msg);
757 }
758 }
759
760 /**
761 * メッセージキューの先頭にメッセージを挿入
762 *
763 * 指定したメッセージキューの先頭にメッセージを挿入する事以外は、OS_SendMessage()関数と同じです。
764 * この呼び出しは、優先順位の高いメッセージを伝達するために使います。
765 *
766 * flag にOS_MESSAGE_BLOCKを設定した場合、キューが一杯 (full) であれば、
767 * この関数を呼び出したスレッドを一時停止します。受信スレッドが動作して、
768 * キューからメッセージを取り出すとすぐに再開されます。
769 * より高い優先順位の送信スレッドが他にあった場合、それらが最初に動作し、
770 * 再度メッセージキューが一杯になるかもしれない点に注意してください。
771 * これが起こった場合、受信スレッドがメッセージキューに空をつくるまで、このスレッドは、再び一時停止します。
772 *
773 * flag にOS_MESSAGE_NOBLOCKを設定した場合、呼び出したスレッドにすぐに返ります。
774 * キューが一杯でない場合、TRUEが返されます。キューが一杯であった場合、 FALSEが返されます。
775 *
776 * @param mqId メッセージキューID
777 * @param msg 送信するメッセージ
778 * @param flag OS_MESSAGE_BLOCKを設定した場合、OS_SendMessage関数は、キューが一杯の時ブロックします。 <br>
779 * OS_MESSAGE_NOBLOCKを設定した場合、OS_SendMessage関数は、キューが一杯であろうとなかろうと、 すぐに返ります。
780 *
781 * @return TRUE メッセージがうまく送られた場合
782 * @return FALSE OS_MESSAGE_NOBLOCK が指定され、キューが一杯であった場合
783 *
784 * @see NOS_ReceiveMessage
785 * @see NOS_ReadMessage
786 * @see NOS_JamMessage
787 */
NOS_JamMessage(NOSMessageQueueId mqId,NOSMessage msg,s32 flag)788 NN_INLINE BOOL NOS_JamMessage(NOSMessageQueueId mqId, NOSMessage msg, s32 flag)
789 {
790 if (flag == NOS_MESSAGE_BLOCK)
791 {
792 nnosBlockingQueueJam(mqId, msg);
793 return TRUE;
794 }
795 else
796 {
797 return nnosBlockingQueueTryJam(mqId, msg);
798 }
799 }
800
801 typedef void (*NOSAlarmHandler) (void *); /**< タイムアウト時に呼び出すユーザのコールバック関数 */
802
803 /**
804 * アラーム構造体
805 */
806 typedef struct NOSAlarm
807 {
808 nnosAlarm alarm;
809 NOSAlarmHandler handler;
810 void* arg;
811 } NOSAlarm;
812 /**
813 * アラームID
814 */
815 typedef NOSAlarm *NOSAlarmId;
816
817 /* NOS_alarm.c */
NOS_InitAlarm(void)818 NN_INLINE s32 NOS_InitAlarm(void){ return 0; }
819
820 NOSAlarmId NOS_CreateAlarm(NOSAlarm *pAlarm);
821 void NOSi_AlarmHandler(void* param, bool cancelled);
822 s32 NOS_SetAlarm(NOSAlarmId alarmId, NOSTick tick, NOSAlarmHandler callback, void *arg);
823 s32 NOS_CancelAlarm(NOSAlarmId alarmId);
824 void NOS_DestroyAlarm(NOSAlarmId alarmId);
825 s32 NOS_SetPeriodicAlarm(NOSAlarmId alarmId, NOSTick start, NOSTick period, NOSAlarmHandler callback, void *arg);
826
827
828 typedef struct
829 {
830 nnnetOslEventFlag eventFlag;
831 NLIBLink link;
832 s32 priority;
833 } NOSEvent;
834 typedef NOSEvent *NOSEventId;
835
836 #define NOS_TMO_FEVR 0xffffffffffffffff
837
838 typedef enum
839 {
840 NOS_EVENT_MODE_AND = NN_NET_OSL_WAITMODE_AND,
841 NOS_EVENT_MODE_OR = NN_NET_OSL_WAITMODE_OR
842 }
843 NOSEventMode;
844
NOS_CreateEvent(NOSEvent * pEvent)845 NN_INLINE NOSEventId NOS_CreateEvent(NOSEvent* pEvent)
846 {
847 bool result = nnnetOslEventFlagTryInitialize(&pEvent->eventFlag);
848 if (!result)
849 {
850 return 0;
851 }
852 return (NOSEventId)pEvent;
853 }
854
NOS_DestroyEvent(NOSEventId eventId)855 NN_INLINE void NOS_DestroyEvent(NOSEventId eventId)
856 {
857 NOSEvent* pEvent = (NOSEvent*)eventId;
858 nnnetOslEventFlagFinalize(&pEvent->eventFlag);
859 }
860
NOS_WaitEvent(NOSEventId eventId,u32 pattern,NOSEventMode mode)861 NN_INLINE u32 NOS_WaitEvent(NOSEventId eventId, u32 pattern, NOSEventMode mode)
862 {
863 NOSEvent* pEvent = (NOSEvent*)eventId;
864 return nnnetOslEventFlagWaitSignal(&pEvent->eventFlag, pattern, (nnnetOslWaitMode)mode, NN_OS_WAIT_INFINITE);
865 }
866
NOS_WaitEvent_And(NOSEventId eventId,u32 pattern)867 NN_INLINE u32 NOS_WaitEvent_And(NOSEventId eventId, u32 pattern)
868 {
869 NOSEvent* pEvent = (NOSEvent*)eventId;
870 return nnnetOslEventFlagWaitSignal(&pEvent->eventFlag, pattern, NN_NET_OSL_WAITMODE_AND, NN_OS_WAIT_INFINITE);
871 }
872
NOS_WaitEvent_Or(NOSEventId eventId,u32 pattern)873 NN_INLINE u32 NOS_WaitEvent_Or(NOSEventId eventId, u32 pattern)
874 {
875 NOSEvent* pEvent = (NOSEvent*)eventId;
876 return nnnetOslEventFlagWaitSignal(&pEvent->eventFlag, pattern, NN_NET_OSL_WAITMODE_OR, NN_OS_WAIT_INFINITE);
877 }
878
NOS_WaitEventEx(NOSEventId eventId,u32 pattern,NOSEventMode mode,u32 clearBit)879 NN_INLINE u32 NOS_WaitEventEx(NOSEventId eventId, u32 pattern, NOSEventMode mode, u32 clearBit)
880 {
881 NOSEvent* pEvent = (NOSEvent*)eventId;
882 return nnnetOslEventFlagWaitAndClear(&pEvent->eventFlag, pattern, (nnnetOslWaitMode)mode, clearBit, NN_OS_WAIT_INFINITE);
883 }
884
NOS_WaitEventEx_And(NOSEventId eventId,u32 pattern,u32 clearBit)885 NN_INLINE u32 NOS_WaitEventEx_And(NOSEventId eventId, u32 pattern, u32 clearBit)
886 {
887 NOSEvent* pEvent = (NOSEvent*)eventId;
888 return nnnetOslEventFlagWaitAndClear(&pEvent->eventFlag, pattern, NN_NET_OSL_WAITMODE_AND, clearBit, NN_OS_WAIT_INFINITE);
889 }
890
NOS_WaitEventEx_Or(NOSEventId eventId,u32 pattern,u32 clearBit)891 NN_INLINE u32 NOS_WaitEventEx_Or(NOSEventId eventId, u32 pattern, u32 clearBit)
892 {
893 NOSEvent* pEvent = (NOSEvent*)eventId;
894 return nnnetOslEventFlagWaitAndClear(&pEvent->eventFlag, pattern, NN_NET_OSL_WAITMODE_OR, clearBit, NN_OS_WAIT_INFINITE);
895 }
896
NOS_SignalEvent(NOSEventId eventId,u32 setPattern)897 NN_INLINE void NOS_SignalEvent(NOSEventId eventId, u32 setPattern)
898 {
899 NOSEvent* pEvent = (NOSEvent*)eventId;
900 nnnetOslEventFlagSignal(&pEvent->eventFlag, setPattern);
901 }
902
NOS_PollEvent(NOSEventId eventId,u32 pattern,NOSEventMode mode)903 NN_INLINE u32 NOS_PollEvent(NOSEventId eventId, u32 pattern, NOSEventMode mode)
904 {
905 NOSEvent* pEvent = (NOSEvent*)eventId;
906 return nnnetOslEventFlagWaitSignal(&pEvent->eventFlag, pattern, (nnnetOslWaitMode)mode, 0);
907 }
908
NOS_ClearEvent(NOSEventId eventId,u32 clearBit)909 NN_INLINE void NOS_ClearEvent(NOSEventId eventId, u32 clearBit)
910 {
911 NOSEvent* pEvent = (NOSEvent*)eventId;
912 nnnetOslEventFlagClearSignal(&pEvent->eventFlag, clearBit);
913 }
914
NOS_ClearAllEvent(NOSEventId eventId)915 NN_INLINE void NOS_ClearAllEvent(NOSEventId eventId)
916 {
917 NOSEvent* pEvent = (NOSEvent*)eventId;
918 nnnetOslEventFlagClearSignal(&pEvent->eventFlag, 0xffffffff);
919 }
920
NOS_TimeWaitEventEx(NOSEventId eventId,u32 pattern,NOSEventMode mode,u32 clearBit,NOSTick timeout)921 NN_INLINE u32 NOS_TimeWaitEventEx(NOSEventId eventId, u32 pattern, NOSEventMode mode, u32 clearBit, NOSTick timeout)
922 {
923 NOSEvent* pEvent = (NOSEvent*)eventId;
924 return nnnetOslEventFlagWaitAndClear(&pEvent->eventFlag, pattern, (nnnetOslWaitMode)mode, clearBit, NOS_TicksToNanoSeconds(timeout));
925 }
926
927 /* EventQueue */
928
929 typedef NLIBQueue NOSEventQueue;
930 typedef NOSEventQueue *NOSEventQueueId;
931
932 /**
933 * イベントキューの作成
934 *
935 * イベントキューを作成します。
936 *
937 * @param eq 作成するEventQueue構造体へのポインタ。
938 *
939 * @return NULL 作成失敗
940 * @return それ以外 EventQueueID。
941 *
942 * @see NOS_DestroyEventQueue
943 * @see NOS_EnqueueEventQueue
944 * @see NOS_DequeueEventQueue
945 * @see NOS_SignalEventQueue
946 */
NOS_CreateEventQueue(NOSEventQueue * eq)947 NN_INLINE NOSEventQueueId NOS_CreateEventQueue(NOSEventQueue *eq)
948 {
949 NLIB_Queue_Init((NLIBQueue *)eq);
950 return (NOSEventQueueId)eq;
951 }
952
953 /**
954 * イベントキューの削除
955 *
956 * 指定のイベントキューを削除します。
957 *
958 * @param eqId EventQueueID。
959 *
960 * @return なし
961 *
962 * @see NOS_CreateEventQueue
963 * @see NOS_EnqueueEventQueue
964 * @see NOS_DequeueEventQueue
965 * @see NOS_SignalEventQueue
966 */
NOS_DestroyEventQueue(NOSEventQueueId eqId)967 NN_INLINE void NOS_DestroyEventQueue(NOSEventQueueId eqId)
968 {
969 NN_UNUSED_VAR(eqId)
970 ;
971 }
972 extern void NOS_EnqueueEventQueue(NOSEventQueueId queueId, NOSEventId eventId);
973 extern void NOS_DequeueEventQueue(NOSEventQueueId queueId, NOSEventId eventId);
974 extern void NOS_SignalEventQueue(NOSEventQueueId queueId, u32 pattern);
975
976
977 /* mbuf */
978
979 //#define NOS_MBUF_SIZE NN_NET_OSL_MBUF_DATA_SIZE /**< 一つのmbufに入るデータサイズ */
980 //#define NOS_MBUF_NUM 512 /**< mbufの数 */
981
982 #define NOS_M_BCAST NN_NET_OSL_M_BCAST
983 #define NOS_M_MCAST NN_NET_OSL_M_MCAST
984 #define NOS_M_LOOPBACK NN_NET_OSL_M_LOOPBACK
985
986 #define NOS_M_DONTWAIT 0 /**< 待ちなし */
987 #define NOS_M_WAIT 1 /**< 待ちあり */
988 #define NOS_M_FREELIST 0x8000 /**< mbufはフリーリストにある(デバッグ用) */
989
990 #define NOS_MT_DATA 1 /**< データタイプ */
991
992 #define NOS_MBUF_ADDR_SIZE 6 /**< MACアドレスのサイズ */
993
994 #define NOS_M_CAT_NWCM 0x01 /**< NWCM(暫定無線ドライバ)が受信パケットのために確保 */
995 #define NOS_M_CAT_NWMETH 0x01 /**< NWMETHが受信パケットのために確保 */
996 #define NOS_M_CAT_ARP 0x02 /**< NSOCがARP受信パケットのために確保 */
997 #define NOS_M_CAT_ICMPERR 0x03 /**< NSOCがICMPエラーパケット送信のために確保 */
998 #define NOS_M_CAT_ICMPECHO 0x04 /**< NSOCがpingパケット送信のために確保 */
999 #define NOS_M_CAT_IGMP 0x05 /**< NSOCがIGMPパケット送信のために確保 */
1000 #define NOS_M_CAT_IPREASM 0x06 /**< NSOCがIPパケット再構築のために確保 */
1001 #define NOS_M_CAT_IPFRAG 0x07 /**< NSOCがIPパケットのフラグメントのために確保 */
1002 #define NOS_M_CAT_TCPRESP 0x08 /**< NSOCがTCP応答のために確保 */
1003 #define NOS_M_CAT_TCPSEND 0x09 /**< NSOCがTCPパケット送信のために確保 */
1004 #define NOS_M_CAT_UDP 0x0a /**< NSOCがUDPパケット送信のために確保 */
1005 #define NOS_M_CAT_NDP 0x0b /**< NSOCがNDPパケット送信のために確保 */
1006 #define NOS_M_CAT_MLD 0x0c /**< NSOCがMLDパケット送信のために確保 */
1007
1008 #define NOS_M_CAT_PPPOE 0x81 /**< NSOCがPPPoEパケット送信のために確保 */
1009 #define NOS_M_CAT_PPP 0x82 /**< NSOCがPPPパケット送信のために確保 */
1010
1011 #ifdef NDEBUG_ENABLE
1012 #define NOS_M_OWN_NSOC 0x02 /* NSOCが使用中 */
1013 #define NOS_M_OWN_NPOE 0x03 /* NPOEが使用中 */
1014 #define NOS_M_OWN_NPPP 0x04 /* NPPPが使用中 */
1015 #endif
1016
1017 typedef nnnetOslMbuf NOSMessageBuf;
1018
1019 #define NOS_mtod(m, t) ((t)(nnnetOslMbuf_tod(m)))
1020
1021 NN_EXTERN_C s32 NOS_m_init(void);
1022
1023 NN_EXTERN_C NOSMessageBuf* NOS_m_getm(u32 name, NOSMessageBuf *orig, s32 len, s32 how, u8 type);
1024
NOS_m_freem(NOSMessageBuf * mbuf)1025 NN_INLINE void NOS_m_freem(NOSMessageBuf *mbuf)
1026 {
1027 nnnetOslMbuf_freem(mbuf);
1028 }
1029
NOS_m_adj(NOSMessageBuf * mbuf,s32 len)1030 NN_INLINE s32 NOS_m_adj(NOSMessageBuf *mbuf, s32 len)
1031 {
1032 return nnnetOslMbuf_adj(mbuf, len);
1033 }
1034
NOS_m_append(NOSMessageBuf * mbuf,s32 len,const u8 * cp)1035 NN_INLINE s32 NOS_m_append(NOSMessageBuf *mbuf, s32 len, const u8 *cp)
1036 {
1037 return nnnetOslMbuf_append(mbuf, len, cp);
1038 }
1039
NOS_m_prepend(NOSMessageBuf * mbuf,s32 len,int how)1040 NN_INLINE NOSMessageBuf *NOS_m_prepend(NOSMessageBuf *mbuf, s32 len, int how)
1041 {
1042 return nnnetOslMbuf_prepend(mbuf, len, how);
1043 }
1044
NOS_m_pullup(NOSMessageBuf * mbuf,s32 len)1045 NN_INLINE NOSMessageBuf *NOS_m_pullup(NOSMessageBuf *mbuf, s32 len)
1046 {
1047 return nnnetOslMbuf_pullup(mbuf, len);
1048 }
1049
NOS_m_dup(NOSMessageBuf * mbuf,int how)1050 NN_INLINE NOSMessageBuf *NOS_m_dup(NOSMessageBuf *mbuf, int how)
1051 {
1052 return nnnetOslMbuf_dup(mbuf, how);
1053 }
1054
NOS_m_copydata(const NOSMessageBuf * mbuf,s32 offset,s32 len,u8 * buf)1055 NN_INLINE s32 NOS_m_copydata(const NOSMessageBuf *mbuf, s32 offset, s32 len, u8 *buf)
1056 {
1057 return nnnetOslMbuf_copydata(mbuf, offset, len, buf);
1058 }
1059
NOS_m_copyback(NOSMessageBuf * mbuf,s32 offset,s32 len,const u8 * buf)1060 NN_INLINE s32 NOS_m_copyback(NOSMessageBuf *mbuf, s32 offset, s32 len, const u8 *buf)
1061 {
1062 return nnnetOslMbuf_copyback(mbuf, offset, len, buf);
1063 }
1064
NOS_m_cat(NOSMessageBuf * mbuf,NOSMessageBuf * n)1065 NN_INLINE s32 NOS_m_cat(NOSMessageBuf *mbuf, NOSMessageBuf *n)
1066 {
1067 return nnnetOslMbuf_cat(mbuf, n);
1068 }
1069
NOS_m_split(NOSMessageBuf * mbuf,s32 len,int how)1070 NN_INLINE NOSMessageBuf *NOS_m_split(NOSMessageBuf *mbuf, s32 len, int how)
1071 {
1072 return nnnetOslMbuf_split(mbuf, len, how);
1073 }
1074
NOS_m_length(NOSMessageBuf * mbuf,NOSMessageBuf ** last)1075 NN_INLINE s32 NOS_m_length(NOSMessageBuf *mbuf, NOSMessageBuf **last)
1076 {
1077 return nnnetOslMbuf_length(mbuf, last);
1078 }
1079
NOS_m_apply(NOSMessageBuf * mbuf,s32 offset,s32 len,s32 (* f)(void * arg,void * data,s32 len),void * arg)1080 NN_INLINE s32 NOS_m_apply(NOSMessageBuf *mbuf, s32 offset, s32 len, s32 (*f)(void *arg, void *data, s32 len), void *arg)
1081 {
1082 return nnnetOslMbuf_apply(mbuf, offset, len, f, arg);
1083 }
1084
1085 #ifdef NDEBUG_ENABLE
NOS_m_getfree(void)1086 NN_INLINE s32 NOS_m_getfree(void)
1087 {
1088 return 0;
1089 }
1090
NOS_m_setowner(NOSMessageBuf * mbuf,u16 owner)1091 NN_INLINE void NOS_m_setowner(NOSMessageBuf *mbuf, u16 owner)
1092 {
1093 NN_UNUSED_VAR(mbuf);
1094 NN_UNUSED_VAR(owner);
1095 }
1096
NOS_m_getnum(u16 owner)1097 NN_INLINE s32 NOS_m_getnum(u16 owner)
1098 {
1099 NN_UNUSED_VAR(owner);
1100 return 0;
1101 }
1102
NOS_m_getaddr(int index)1103 NN_INLINE NOSMessageBuf *NOS_m_getaddr(int index)
1104 {
1105 NN_UNUSED_VAR(index);
1106 return NULL;
1107 }
1108 #endif
1109
1110 #ifdef NDEBUG_PRINT_ENABLE
NOS_m_dump(NOSMessageBuf * mbuf)1111 NN_INLINE void NOS_m_dump(NOSMessageBuf *mbuf)
1112 {
1113 nnnetOslMbuf_dump(mbuf);
1114 }
1115 #endif
1116
1117 /* NOS_main.c */
1118 extern s32 NOS_Init(void);
1119
1120
1121 #ifdef __cplusplus
1122 }
1123 #endif
1124
1125 #endif
1126