picox  0.1
xfiber.h
[詳解]
1 
15 /*
16  * License: MIT license
17  * Copyright (c) <2016> <MaskedW [maskedw00@gmail.com]>
18  *
19  * Permission is hereby granted, free of charge, to any person
20  * obtaining a copy of self software and associated documentation
21  * files (the "Software"), to deal in the Software without
22  * restriction, including without limitation the rights to use, copy,
23  * modify, merge, publish, distribute, sublicense, and/or sell copies
24  * of the Software, and to permit persons to whom the Software is
25  * furnished to do so, subject to the following conditions:
26  *
27  * The above copyright notice and self permission notice shall be
28  * included in all copies or substantial portions of the Software.
29  *
30  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
31  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
33  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
34  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
35  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
36  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37  * SOFTWARE.
38  */
39 
40 
41 #ifndef picox_multitask_xfiber_h_
42 #define picox_multitask_xfiber_h_
43 
44 
45 #include <picox/core/xcore.h>
47 
48 
116 #ifdef __cplusplus
117 extern "C" {
118 #endif /* __cplusplus */
119 
120 
125 typedef void (*XFiberFunc)(void*);
126 
127 
133 typedef int(*XFiberIdleHook)(void);
134 
135 
142 #define X_FIBER_EVENT_WAIT_OR (0)
143 
145 #define X_FIBER_EVENT_WAIT_AND (1)
146 
148 #define X_FIBER_EVENT_CLEAR_ON_EXIT (1 << 1)
149 
154 /* 前方宣言
155  * fiberオブジェクトはスタックに確保することはできず、xfiber_xxx_create()系の生
156  * 成関数を呼び出す必要があります。
157  */
158 struct XFiber;
159 struct XFiberEvent;
160 struct XFiberQueue;
161 struct XFiberPool;
162 struct XFiberChannel;
163 struct XFiberMailbox;
164 struct XFiberSemaphore;
165 struct XFiberMutex;
166 typedef struct XFiber XFiber;
167 typedef struct XFiberEvent XFiberEvent;
168 typedef struct XFiberQueue XFiberQueue;
169 typedef struct XFiberPool XFiberPool;
170 typedef struct XFiberChannel XFiberChannel;
171 typedef struct XFiberMailbox XFiberMailbox;
172 typedef struct XFiberSemaphore XFiberSemaphore;
173 typedef struct XFiberMutex XFiberMutex;
175 
176 
190 XError xfiber_kernel_init(void* heap, size_t heapsize, XFiberIdleHook idlehook);
191 
192 
196 
197 
203 void xfiber_kernel_end_scheduler(void);
204 
205 
224 XError xfiber_create(XFiber** o_fiber, int priority, const char* name, size_t stack_size, XFiberFunc func, void* arg);
225 
226 
229 void xfiber_delay(XTicks time);
230 
231 
240 XError xfiber_suspend(XFiber* fiber);
241 
242 
245 XError xfiber_resume(XFiber* fiber);
246 
247 
250 void xfiber_yield();
251 
252 
255 XFiber* xfiber_self();
256 
257 
260 const char* xfiber_name(const XFiber* fiber);
261 
262 
275 XError xfiber_event_create(XFiberEvent** o_event);
276 
277 
282 void xfiber_event_destroy(XFiberEvent* event);
283 
284 
292 XError xfiber_event_timed_wait(XFiberEvent* event, XMode mode, XBits wait_pattern, XBits* result, XTicks timeout);
293 
294 
299 XError xfiber_event_wait(XFiberEvent* event, XMode mode, XBits wait_pattern, XBits* result);
300 
301 
306 XError xfiber_event_try_wait(XFiberEvent* event, XMode mode, XBits wait_pattern, XBits* result);
307 
308 
311 XError xfiber_event_set(XFiberEvent* event, XBits pattern);
312 
313 
316 XError xfiber_event_set_isr(XFiberEvent* event, XBits pattern);
317 
318 
321 XBits xfiber_event_clear(XFiberEvent* event, XBits pattern);
322 
323 
326 XBits xfiber_event_clear_isr(XFiberEvent* event, XBits pattern);
327 
328 
331 XBits xfiber_event_get(XFiberEvent* event);
332 
333 
336 XBits xfiber_event_get_isr(XFiberEvent* event);
337 
338 
359 XError xfiber_signal_timed_wait(XBits sigs, XBits* result, XTicks timeout);
360 
361 
364 XError xfiber_signal_wait(XBits sigs, XBits* result);
365 
366 
370 
371 
374 XError xfiber_signal_raise(XFiber* fiber, XBits sigs);
375 
376 
379 XError xfiber_signal_raise_isr(XFiber* fiber, XBits sigs);
380 
381 
384 XBits xfiber_signal_get(XFiber* fiber);
385 
386 
389 XBits xfiber_signal_get_isr(XFiber* fiber);
390 
391 
412 XError xfiber_queue_create(XFiberQueue** o_queue, size_t queue_len, size_t item_size);
413 
414 
419 void xfiber_queue_destroy(XFiberQueue* queue);
420 
421 
424 XError xfiber_queue_timed_send_back(XFiberQueue* queue, const void* src, XTicks timeout);
425 
426 
429 XError xfiber_queue_send_back(XFiberQueue* queue, const void* src);
430 
431 
434 XError xfiber_queue_try_send_back(XFiberQueue* queue, const void* src);
435 
436 
439 XError xfiber_queue_send_back_isr(XFiberQueue* queue, const void* src);
440 
441 
444 XError xfiber_queue_timed_send_front(XFiberQueue* queue, const void* src, XTicks timeout);
445 
446 
449 XError xfiber_queue_send_front(XFiberQueue* queue, const void* src);
450 
451 
454 XError xfiber_queue_try_send_front(XFiberQueue* queue, const void* src);
455 
456 
459 XError xfiber_queue_send_front_isr(XFiberQueue* queue, const void* src);
460 
461 
464 XError xfiber_queue_timed_receive(XFiberQueue* queue, void* dst, XTicks timeout);
465 
466 
469 XError xfiber_queue_receive(XFiberQueue* queue, void* dst);
470 
471 
474 XError xfiber_queue_try_receive(XFiberQueue* queue, void* dst);
475 
476 
479 XError xfiber_queue_receive_isr(XFiberQueue* queue, void* dst);
480 
481 
509 XError xfiber_channel_create(XFiberChannel** o_channel, size_t capacity, size_t max_item_size);
510 
511 
516 void xfiber_channel_destroy(XFiberChannel* channel);
517 
518 
521 XError xfiber_channel_timed_send(XFiberChannel* channel, const void* src, size_t size, XTicks timeout);
522 
523 
526 XError xfiber_channel_send(XFiberChannel* channel, const void* src, size_t size);
527 
528 
531 XError xfiber_channel_try_send(XFiberChannel* channel, const void* src, size_t size);
532 
533 
536 XError xfiber_channel_send_isr(XFiberChannel* channel, const void* src, size_t size);
537 
538 
541 XError xfiber_channel_timed_receive(XFiberChannel* channel, void* dst, size_t* o_size, XTicks timeout);
542 
543 
546 XError xfiber_channel_receive(XFiberChannel* channel, void* dst, size_t* o_size);
547 
548 
551 XError xfiber_channel_try_receive(XFiberChannel* channel, void* dst, size_t* o_size);
552 
553 
556 XError xfiber_channel_receive_isr(XFiberChannel* channel, void* dst, size_t* o_size);
557 
558 
577 XError xfiber_semaphore_create(XFiberSemaphore** o_semaphore, int initial_count);
578 
579 
584 void xfiber_semaphore_destroy(XFiberSemaphore* semaphore);
585 
586 
589 XError xfiber_semaphore_timed_take(XFiberSemaphore* semaphore, XTicks timeout);
590 
591 
594 XError xfiber_semaphore_take(XFiberSemaphore* semaphore);
595 
596 
599 XError xfiber_semaphore_try_take(XFiberSemaphore* semaphore);
600 
601 
604 XError xfiber_semaphore_give(XFiberSemaphore* semaphore);
605 
606 
609 XError xfiber_semaphore_give_isr(XFiberSemaphore* semaphore);
610 
611 
630 XError xfiber_mutex_create(XFiberMutex** o_mutex);
631 
632 
635 void xfiber_mutex_destroy(XFiberMutex* mutex);
636 
637 
640 XError xfiber_mutex_timed_lock(XFiberMutex* mutex, XTicks timeout);
641 
642 
645 XError xfiber_mutex_lock(XFiberMutex* mutex);
646 
647 
650 XError xfiber_mutex_try_lock(XFiberMutex* mutex);
651 
652 
655 XError xfiber_mutex_unlock(XFiberMutex* mutex);
656 
657 
660 XError xfiber_mutex_unlock_isr(XFiberMutex* mutex);
661 
662 
681 XError xfiber_mailbox_create(XFiberMailbox** o_mailbox);
682 
683 
688 void xfiber_mailbox_destroy(XFiberMailbox* mailbox);
689 
690 
693 XError xfiber_mailbox_send(XFiberMailbox* mailbox, XFiberMessage* message);
694 
695 
698 XError xfiber_mailbox_send_isr(XFiberMailbox* mailbox, XFiberMessage* message);
699 
700 
703 XError xfiber_mailbox_timed_receive(XFiberMailbox* mailbox, XFiberMessage** o_message, XTicks timeout);
704 
705 
708 XError xfiber_mailbox_receive(XFiberMailbox* mailbox, XFiberMessage** o_message);
709 
710 
713 XError xfiber_mailbox_try_receive(XFiberMailbox* mailbox, XFiberMessage** o_message);
714 
715 
718 XError xfiber_mailbox_receive_isr(XFiberMailbox* mailbox, XFiberMessage** o_message);
719 
720 
741 XError xfiber_pool_create(XFiberPool** o_pool, size_t block_size, size_t num_blocks);
742 
743 
748 void xfiber_pool_destroy(XFiberPool* pool);
749 
750 
753 XError xfiber_pool_timed_get(XFiberPool* pool, void** o_mem, XTicks timeout);
754 
755 
758 XError xfiber_pool_get(XFiberPool* pool, void** o_mem);
759 
760 
763 XError xfiber_pool_try_get(XFiberPool* pool, void** o_mem);
764 
765 
768 XError xfiber_pool_get_isr(XFiberPool* pool, void** o_mem);
769 
770 
773 XError xfiber_pool_release(XFiberPool* pool, void* mem);
774 
775 
778 XError xfiber_pool_release_isr(XFiberPool* pool, void* mem);
779 
780 
785 #ifdef __cplusplus
786 }
787 #endif /* __cplusplus */
788 
789 
795 #endif /* picox_multitask_xfiber_h_ */
XError xfiber_channel_send_isr(XFiberChannel *channel, const void *src, size_t size)
Definition: xfiber.c:1202
XError xfiber_channel_receive(XFiberChannel *channel, void *dst, size_t *o_size)
Definition: xfiber.c:1227
XError xfiber_pool_try_get(XFiberPool *pool, void **o_mem)
プールからメモリの確保をポーリングで試みます
Definition: xfiber.c:1743
void xfiber_mailbox_destroy(XFiberMailbox *mailbox)
メールボックスを生成します
Definition: xfiber.c:1588
XError xfiber_queue_receive_isr(XFiberQueue *queue, void *dst)
割込みハンドラから呼び出し可能なxfiber_queue_try_receive()です
Definition: xfiber.c:1089
int32_t XTicks
システムチックを格納する型です
Definition: xtime.h:63
void xfiber_queue_destroy(XFiberQueue *queue)
キューを破棄します
Definition: xfiber.c:865
XError xfiber_mailbox_receive_isr(XFiberMailbox *mailbox, XFiberMessage **o_message)
割込みハンドラから呼び出し可能なxfiber_mailbox_try_receive()です
Definition: xfiber.c:1692
XError xfiber_semaphore_try_take(XFiberSemaphore *semaphore)
セマフォの獲得をポーリングで試みます
Definition: xfiber.c:1486
XError xfiber_event_timed_wait(XFiberEvent *event, XMode mode, XBits wait_pattern, XBits *result, XTicks timeout)
指定のイベントが成立するのをタイムアウト付きで待ちます
Definition: xfiber.c:476
XError xfiber_pool_timed_get(XFiberPool *pool, void **o_mem, XTicks timeout)
プールからメモリの確保をタイムアウト付きで試みます
Definition: xfiber.c:1749
XError xfiber_mutex_unlock_isr(XFiberMutex *mutex)
割込みハンドラから呼び出し可能なxfiber_mutex_unlock()です
Definition: xfiber.c:1432
void xfiber_delay(XTicks time)
タスクの実行を指定時間遅延します
Definition: xfiber.c:753
XError xfiber_signal_timed_wait(XBits sigs, XBits *result, XTicks timeout)
シグナルが成立するのをタイムアウト付きで待ちます
Definition: xfiber.c:638
XError xfiber_queue_send_back(XFiberQueue *queue, const void *src)
キューの末尾への要素の転送を試みます
Definition: xfiber.c:876
双方向リンリストリストノード
Definition: xintrusive_list.h:87
XError
errnoの代替として使用する共通のエラーコードを表す列挙型です
Definition: xstddef.h:367
XError xfiber_queue_send_back_isr(XFiberQueue *queue, const void *src)
割込みハンドラから呼び出し可能なxfiber_queue_try_send_back()です
Definition: xfiber.c:929
void xfiber_channel_destroy(XFiberChannel *channel)
Definition: xfiber.c:1136
XError xfiber_mailbox_timed_receive(XFiberMailbox *mailbox, XFiberMessage **o_message, XTicks timeout)
メールボックス先頭からメッセージの受信をタイムアウト付きで試みます
Definition: xfiber.c:1658
void xfiber_semaphore_destroy(XFiberSemaphore *semaphore)
セマフォを破棄します
Definition: xfiber.c:1469
XError xfiber_queue_try_send_front(XFiberQueue *queue, const void *src)
キューの先頭への要素の転送をポーリングで試みます
Definition: xfiber.c:958
XBits xfiber_signal_get(XFiber *fiber)
現在のビットパターンを返します
Definition: xfiber.c:733
XError xfiber_create(XFiber **o_fiber, int priority, const char *name, size_t stack_size, XFiberFunc func, void *arg)
タスクを生成します
Definition: xfiber.c:368
XError xfiber_channel_send(XFiberChannel *channel, const void *src, size_t size)
Definition: xfiber.c:1147
XError xfiber_mutex_create(XFiberMutex **o_mutex)
ミューテックスを生成します
Definition: xfiber.c:1321
XError xfiber_queue_try_send_back(XFiberQueue *queue, const void *src)
キューの末尾への要素の転送をポーリングで試みます
Definition: xfiber.c:882
XError xfiber_pool_create(XFiberPool **o_pool, size_t block_size, size_t num_blocks)
プールを生成します
Definition: xfiber.c:1704
XError xfiber_mailbox_send_isr(XFiberMailbox *mailbox, XFiberMessage *message)
割込みハンドラから呼び出し可能なxfiber_mailbox_send()です
Definition: xfiber.c:1627
XError xfiber_mutex_lock(XFiberMutex *mutex)
ミューテックスを獲得を試みます
Definition: xfiber.c:1350
XError xfiber_semaphore_take(XFiberSemaphore *semaphore)
セマフォの獲得を試みます
Definition: xfiber.c:1480
const char * xfiber_name(const XFiber *fiber)
タスクの名前を返します
Definition: xfiber.c:424
XError xfiber_queue_send_front_isr(XFiberQueue *queue, const void *src)
割込みハンドラから呼び出し可能なxfiber_queue_try_send_front()です
Definition: xfiber.c:1005
XError xfiber_channel_timed_receive(XFiberChannel *channel, void *dst, size_t *o_size, XTicks timeout)
Definition: xfiber.c:1239
uint32_t XBits
XModeと同じくビットフラグを格納しますが、よりビットを意識した型です
Definition: xstddef.h:292
XError xfiber_semaphore_create(XFiberSemaphore **o_semaphore, int initial_count)
セマフォを生成します
Definition: xfiber.c:1451
XError xfiber_mailbox_create(XFiberMailbox **o_mailbox)
メールボックスを生成します
Definition: xfiber.c:1572
XBits xfiber_event_get(XFiberEvent *event)
現在のビットパターンを返します
Definition: xfiber.c:606
XError xfiber_event_try_wait(XFiberEvent *event, XMode mode, XBits wait_pattern, XBits *result)
指定のイベントが成立しているかをポーリングで確認します
Definition: xfiber.c:470
XError xfiber_signal_wait(XBits sigs, XBits *result)
シグナルが成立するのを待ちます
Definition: xfiber.c:626
XError xfiber_kernel_start_scheduler(void)
スケジューリングを開始します
Definition: xfiber.c:329
void xfiber_kernel_end_scheduler(void)
スケジューリングを終了します
Definition: xfiber.c:350
XError xfiber_channel_receive_isr(XFiberChannel *channel, void *dst, size_t *o_size)
Definition: xfiber.c:1289
void(* XFiberFunc)(void *)
タスクのメイン関数ポインタ型です
Definition: xfiber.h:125
XError xfiber_suspend(XFiber *fiber)
タスクをサスペンド状態に遷移させます
Definition: xfiber.c:771
XError xfiber_queue_receive(XFiberQueue *queue, void *dst)
キューの先頭から要素の受信を試みます
Definition: xfiber.c:1028
XError xfiber_signal_raise_isr(XFiber *fiber, XBits sigs)
割込みハンドラから呼び出し可能なxfiber_signal_raise()です
Definition: xfiber.c:718
XError xfiber_queue_timed_receive(XFiberQueue *queue, void *dst, XTicks timeout)
キューの先頭から要素の受信をタイムアウト付きで試みます
Definition: xfiber.c:1040
XError xfiber_channel_try_receive(XFiberChannel *channel, void *dst, size_t *o_size)
Definition: xfiber.c:1233
XError xfiber_queue_timed_send_back(XFiberQueue *queue, const void *src, XTicks timeout)
キューの末尾への要素の転送をタイムアウト付きで試みます
Definition: xfiber.c:888
XError xfiber_pool_release_isr(XFiberPool *pool, void *mem)
割込みハンドラから呼び出し可能なxfiber_pool_release()です
Definition: xfiber.c:1823
int(* XFiberIdleHook)(void)
アイドル時に呼び出されるフック関数のポインタ型です
Definition: xfiber.h:133
XError xfiber_event_set_isr(XFiberEvent *event, XBits pattern)
割込みハンドラから呼び出し可能なxfiber_event_set()です
Definition: xfiber.c:516
XBits xfiber_event_clear(XFiberEvent *event, XBits pattern)
指定ビットをクリアします
Definition: xfiber.c:583
XError xfiber_mailbox_try_receive(XFiberMailbox *mailbox, XFiberMessage **o_message)
メールボックス先頭からメッセージの受信をポーリングで試みます
Definition: xfiber.c:1652
XError xfiber_channel_try_send(XFiberChannel *channel, const void *src, size_t size)
Definition: xfiber.c:1153
XError xfiber_resume(XFiber *fiber)
タスクのサスペンド状態を解除します
Definition: xfiber.c:808
XError xfiber_semaphore_give_isr(XFiberSemaphore *semaphore)
割込みハンドラで呼び出し可能なxfiber_semaphore_give()です
Definition: xfiber.c:1553
XError xfiber_mutex_timed_lock(XFiberMutex *mutex, XTicks timeout)
ミューテックスを獲得をタイムアウト付きで試みます
Definition: xfiber.c:1362
XError xfiber_queue_try_receive(XFiberQueue *queue, void *dst)
キューの先頭から要素の受信をポーリングで試みます
Definition: xfiber.c:1034
XError xfiber_signal_try_wait(XBits sigs, XBits *result)
シグナルが成立するのをポーリングで待ちます
Definition: xfiber.c:632
XError xfiber_mailbox_send(XFiberMailbox *mailbox, XFiberMessage *message)
メールボックス末尾にメッセージを追加します
Definition: xfiber.c:1599
XError xfiber_event_create(XFiberEvent **o_event)
イベントオブジェクトを生成します
Definition: xfiber.c:432
XError xfiber_semaphore_timed_take(XFiberSemaphore *semaphore, XTicks timeout)
セマフォの獲得をタイムアウト付きで試みます
Definition: xfiber.c:1492
XError xfiber_queue_timed_send_front(XFiberQueue *queue, const void *src, XTicks timeout)
キューの先頭への要素の転送をタイムアウト付きで試みます
Definition: xfiber.c:964
XError xfiber_queue_create(XFiberQueue **o_queue, size_t queue_len, size_t item_size)
キューを生成します
Definition: xfiber.c:842
XBits xfiber_signal_get_isr(XFiber *fiber)
割込みハンドラから呼び出し可能なxfiber_signal_get()です
Definition: xfiber.c:746
XBits xfiber_event_get_isr(XFiberEvent *event)
割込みハンドラから呼び出し可能なxfiber_event_get()です
Definition: xfiber.c:619
void xfiber_yield()
タスクの実行を同一優先度の別のタスクにゆずります
Definition: xfiber.c:362
XError xfiber_mutex_try_lock(XFiberMutex *mutex)
ミューテックスを獲得をタイムアウト付きで試みます
Definition: xfiber.c:1356
XError xfiber_queue_send_front(XFiberQueue *queue, const void *src)
キューの先頭への要素の転送を試みます
Definition: xfiber.c:952
XError xfiber_signal_raise(XFiber *fiber, XBits sigs)
タスクにシグナルを発行します
Definition: xfiber.c:694
XError xfiber_mailbox_receive(XFiberMailbox *mailbox, XFiberMessage **o_message)
メールボックス先頭からメッセージの受信を試みます
Definition: xfiber.c:1646
void xfiber_event_destroy(XFiberEvent *event)
イベントオブジェクトを破棄します
Definition: xfiber.c:453
XError xfiber_pool_get_isr(XFiberPool *pool, void **o_mem)
割込みハンドラから呼び出し可能なxfiber_pool_try_get()です
Definition: xfiber.c:1783
XError xfiber_event_set(XFiberEvent *event, XBits pattern)
イベントをセットします
Definition: xfiber.c:545
ノード侵入型のダブルリンクリストコンテナです。
XError xfiber_event_wait(XFiberEvent *event, XMode mode, XBits wait_pattern, XBits *result)
指定のイベントが成立するのを待ちます
Definition: xfiber.c:464
uint32_t XMode
何らかのビットフラグを格納することを意図した型です
Definition: xstddef.h:287
void xfiber_pool_destroy(XFiberPool *pool)
プールを解放します
Definition: xfiber.c:1726
XError xfiber_kernel_init(void *heap, size_t heapsize, XFiberIdleHook idlehook)
カーネルを初期化します
Definition: xfiber.c:316
XError xfiber_pool_release(XFiberPool *pool, void *mem)
プールにメモリを返却します
Definition: xfiber.c:1795
XFiber * xfiber_self()
実行状態のタスクを返します
Definition: xfiber.c:356
XError xfiber_channel_create(XFiberChannel **o_channel, size_t capacity, size_t max_item_size)
Definition: xfiber.c:1117
void xfiber_mutex_destroy(XFiberMutex *mutex)
ミューテックスを破棄します
Definition: xfiber.c:1339
XError xfiber_semaphore_give(XFiberSemaphore *semaphore)
セマフォを返却します
Definition: xfiber.c:1525
XError xfiber_channel_timed_send(XFiberChannel *channel, const void *src, size_t size, XTicks timeout)
Definition: xfiber.c:1159
XBits xfiber_event_clear_isr(XFiberEvent *event, XBits pattern)
割込みハンドラから呼び出し可能なxfiber_event_clear()です
Definition: xfiber.c:597
XError xfiber_mutex_unlock(XFiberMutex *mutex)
ミューテックスのロック解除を行います
Definition: xfiber.c:1395
XError xfiber_pool_get(XFiberPool *pool, void **o_mem)
プールからメモリの確保を試みます
Definition: xfiber.c:1737