picox  0.1
xfiber.c ファイル
xfiber.c の依存先関係図:

マクロ定義

#define priv   (&x_g_fiber_kernel)
 
#define X__CHECK_POLL(timeout)
 
#define X__LOG(x)
 
#define X__NODE_TO_FIBER(node)    xnode_entry(node, XFiber, m_node)
 
#define X_CONF_FIBER_IMPL_TYPE   X_FIBER_IMPL_TYPE_COPY_STACK
 
#define X_DECLAER_FIBER_OBJECT_COMMON_MEMBERS
 
#define X_DECLAER_FIBER_WAIT_OBJECT_COMMON_MEMBERS
 
#define X_FIBER_ENTER_CRITICAL()
 
#define X_FIBER_EVENT_WAIT_MASK   (X_FIBER_EVENT_WAIT_OR | X_FIBER_EVENT_WAIT_AND)
 
#define X_FIBER_EXIT_CRITICAL()
 
#define X_FIBER_IMPL_TYPE_COPY_STACK   (0)
 
#define X_FIBER_IMPL_TYPE_PLATFORM_DEPEND   (2)
 
#define X_FIBER_IMPL_TYPE_UCONTEXT   (1)
 
#define X_FIBER_IS_READY(state)    ((state) == X_FIBER_STATE_READY)
 
#define X_FIBER_IS_RUNNING(state)    ((state) == X_FIBER_STATE_RUNNING)
 
#define X_FIBER_IS_SUSPEND(state)    ((state) & X_FIBER_STATE_SUSPEND)
 
#define X_FIBER_IS_WAITING(state)    (((state) & 0xFF) >= X_FIBER_STATE_WAITING_EVENT)
 
#define X_FIBER_IS_WAITING_SUSPEND(state)    ((state) >= X_FIBER_STATE_SUSPEND_AND_WAITING_EVENT)
 

型定義

typedef void(* XFiberTimeEventHandler) (XFiber *)
 

列挙型

enum  XFiberObjectType {
  X_FIBER_OBJTYPE_TASK, X_FIBER_OBJTYPE_EVENT, X_FIBER_OBJTYPE_QUEUE, X_FIBER_OBJTYPE_CHANNEL,
  X_FIBER_OBJTYPE_MUTEX, X_FIBER_OBJTYPE_SEMAPHORE, X_FIBER_OBJTYPE_MAILBOX, X_FIBER_OBJTYPE_POOL,
  X_FIBER_OBJTYPE_END
}
 
enum  XFiberState {
  X_FIBER_STATE_READY, X_FIBER_STATE_RUNNING, X_FIBER_STATE_WAITING_EVENT, X_FIBER_STATE_WAITING_DELAY,
  X_FIBER_STATE_WAITING_SIGNAL, X_FIBER_STATE_WAITING_SEND_QUEUE, X_FIBER_STATE_WAITING_RECV_QUEUE, X_FIBER_STATE_WAITING_SEND_CHANNEL,
  X_FIBER_STATE_WAITING_RECV_CHANNEL, X_FIBER_STATE_WAITING_MUTEX, X_FIBER_STATE_WAITING_SEMAPHORE, X_FIBER_STATE_WAITING_RECV_MAILBOX,
  X_FIBER_STATE_WAITING_POOL, X_FIBER_STATE_SUSPEND = (1 << 8), X_FIBER_STATE_SUSPEND_AND_WAITING_EVENT = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_EVENT, X_FIBER_STATE_SUSPEND_AND_WAITING_DELAY = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_DELAY,
  X_FIBER_STATE_SUSPEND_AND_WAITING_SIGNAL = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_SIGNAL, X_FIBER_STATE_SUSPEND_AND_WAITING_SEND_QUEUE = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_SEND_QUEUE, X_FIBER_STATE_SUSPEND_AND_WAITING_RECV_QUEUE = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_RECV_QUEUE, X_FIBER_STATE_SUSPEND_AND_WAITING_SEND_CHANNEL = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_SEND_CHANNEL,
  X_FIBER_STATE_SUSPEND_AND_WAITING_RECV_CHANNEL = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_RECV_CHANNEL, X_FIBER_STATE_SUSPEND_AND_WAITING_MUTEX = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_MUTEX, X_FIBER_STATE_SUSPEND_AND_WAITING_SEMAPHORE = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_SEMAPHORE, X_FIBER_STATE_SUSPEND_AND_WAITING_RECV_MAILBOX = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_RECV_MAILBOX,
  X_FIBER_STATE_SUSPEND_AND_WAITING_POOL = X_FIBER_STATE_SUSPEND | X_FIBER_STATE_WAITING_POOL
}
 

関数

static void X__AddTimerEvent (XFiber *fiber, XFiberTimeEventHandler handler, XTicks time)
 
static void X__DestroyFiber (XFiber *fiber)
 
static void X__EndSchedule ()
 
static void X__FiberMain (XFiber *fiber)
 
static void X__Free (void *ptr)
 
static void X__GetStackPtr (uint8_t **volatile dst)
 
static void X__MakeContext (XFiber *fiber, XFiberFunc func, void *arg, void *stack, size_t stack_size)
 
static void * X__Malloc (size_t size)
 
static void X__PargePendingTasks (XIntrusiveList *list)
 
static XFiber * X__PopFromReadyQueue (void)
 
static void X__PushToReadyQueue (XFiber *fiber)
 
static void X__ReleaseWaiting (XFiber *fiber, XError result)
 
static void * X__ResolvePtr (const XFiber *fiber, const void *ptr)
 
static void X__RestoreStack (XFiber *fiber, uint8_t *addr_in_prev_frame)
 
static void X__SaveStack (XFiber *fiber, const uint8_t *stack_end)
 
static void X__Schedule (void)
 
static void X__SetContext (XFiber *to)
 
static void X__StartSchedule (void)
 
static void X__SwapContext (XFiber *from, XFiber *to)
 
static bool X__TestEvent (XFiberEvent *event, XMode mode, XBits wait_pattern, XBits *result)
 
static void X__TimeoutHandler (XFiber *fiber)
 
static void X__TransitionIntoWaitState (XIntrusiveList *list, XFiber *fiber, XFiberState state, XTicks timeout)
 
XError xfiber_channel_create (XFiberChannel **o_channel, size_t capacity, size_t max_item_size)
 
void xfiber_channel_destroy (XFiberChannel *channel)
 
XError xfiber_channel_receive (XFiberChannel *channel, void *dst, size_t *o_size)
 
XError xfiber_channel_receive_isr (XFiberChannel *channel, void *dst, size_t *o_size)
 
XError xfiber_channel_send (XFiberChannel *channel, const void *src, size_t size)
 
XError xfiber_channel_send_isr (XFiberChannel *channel, const void *src, size_t size)
 
XError xfiber_channel_timed_receive (XFiberChannel *channel, void *dst, size_t *o_size, XTicks timeout)
 
XError xfiber_channel_timed_send (XFiberChannel *channel, const void *src, size_t size, XTicks timeout)
 
XError xfiber_channel_try_receive (XFiberChannel *channel, void *dst, size_t *o_size)
 
XError xfiber_channel_try_send (XFiberChannel *channel, const void *src, size_t size)
 
XError xfiber_create (XFiber **o_fiber, int priority, const char *name, size_t stack_size, XFiberFunc func, void *arg)
 タスクを生成します [詳解]
 
void xfiber_delay (XTicks time)
 タスクの実行を指定時間遅延します
 
XBits xfiber_event_clear (XFiberEvent *event, XBits pattern)
 指定ビットをクリアします
 
XError xfiber_event_clear_isr (XFiberEvent *event, XBits pattern)
 割込みハンドラから呼び出し可能なxfiber_event_clear()です
 
XError xfiber_event_create (XFiberEvent **o_event)
 イベントオブジェクトを生成します
 
void xfiber_event_destroy (XFiberEvent *event)
 イベントオブジェクトを破棄します [詳解]
 
XBits xfiber_event_get (XFiberEvent *event)
 現在のビットパターンを返します
 
XBits xfiber_event_get_isr (XFiberEvent *event)
 割込みハンドラから呼び出し可能なxfiber_event_get()です
 
XError xfiber_event_set (XFiberEvent *event, XBits pattern)
 イベントをセットします
 
XError xfiber_event_set_isr (XFiberEvent *event, XBits pattern)
 割込みハンドラから呼び出し可能なxfiber_event_set()です
 
XError xfiber_event_timed_wait (XFiberEvent *event, XMode mode, XBits wait_pattern, XBits *result, XTicks timeout)
 指定のイベントが成立するのをタイムアウト付きで待ちます [詳解]
 
XError xfiber_event_try_wait (XFiberEvent *event, XMode mode, XBits wait_pattern, XBits *result)
 指定のイベントが成立しているかをポーリングで確認します [詳解]
 
XError xfiber_event_wait (XFiberEvent *event, XMode mode, XBits wait_pattern, XBits *result)
 指定のイベントが成立するのを待ちます [詳解]
 
void xfiber_kernel_end_scheduler (void)
 スケジューリングを終了します [詳解]
 
XError xfiber_kernel_init (void *heap, size_t heapsize, XFiberIdleHook idlehook)
 カーネルを初期化します [詳解]
 
XError xfiber_kernel_start_scheduler (void)
 スケジューリングを開始します
 
XError xfiber_mailbox_create (XFiberMailbox **o_mailbox)
 メールボックスを生成します
 
void xfiber_mailbox_destroy (XFiberMailbox *mailbox)
 メールボックスを生成します [詳解]
 
XError xfiber_mailbox_receive (XFiberMailbox *mailbox, XFiberMessage **o_message)
 メールボックス先頭からメッセージの受信を試みます
 
XError xfiber_mailbox_receive_isr (XFiberMailbox *mailbox, XFiberMessage **o_message)
 割込みハンドラから呼び出し可能なxfiber_mailbox_try_receive()です
 
XError xfiber_mailbox_send (XFiberMailbox *mailbox, XFiberMessage *message)
 メールボックス末尾にメッセージを追加します
 
XError xfiber_mailbox_send_isr (XFiberMailbox *mailbox, XFiberMessage *message)
 割込みハンドラから呼び出し可能なxfiber_mailbox_send()です
 
XError xfiber_mailbox_timed_receive (XFiberMailbox *mailbox, XFiberMessage **o_message, XTicks timeout)
 メールボックス先頭からメッセージの受信をタイムアウト付きで試みます
 
XError xfiber_mailbox_try_receive (XFiberMailbox *mailbox, XFiberMessage **o_message)
 メールボックス先頭からメッセージの受信をポーリングで試みます
 
XError xfiber_mutex_create (XFiberMutex **o_mutex)
 ミューテックスを生成します
 
void xfiber_mutex_destroy (XFiberMutex *mutex)
 ミューテックスを破棄します
 
XError xfiber_mutex_lock (XFiberMutex *mutex)
 ミューテックスを獲得を試みます
 
XError xfiber_mutex_timed_lock (XFiberMutex *mutex, XTicks timeout)
 ミューテックスを獲得をタイムアウト付きで試みます
 
XError xfiber_mutex_try_lock (XFiberMutex *mutex)
 ミューテックスを獲得をタイムアウト付きで試みます
 
XError xfiber_mutex_unlock (XFiberMutex *mutex)
 ミューテックスのロック解除を行います
 
XError xfiber_mutex_unlock_isr (XFiberMutex *mutex)
 割込みハンドラから呼び出し可能なxfiber_mutex_unlock()です
 
const char * xfiber_name (const XFiber *fiber)
 タスクの名前を返します
 
XError xfiber_pool_create (XFiberPool **o_pool, size_t block_size, size_t num_blocks)
 プールを生成します [詳解]
 
void xfiber_pool_destroy (XFiberPool *pool)
 プールを解放します [詳解]
 
XError xfiber_pool_get (XFiberPool *pool, void **o_mem)
 プールからメモリの確保を試みます
 
XError xfiber_pool_get_isr (XFiberPool *pool, void **o_mem)
 割込みハンドラから呼び出し可能なxfiber_pool_try_get()です
 
XError xfiber_pool_release (XFiberPool *pool, void *mem)
 プールにメモリを返却します
 
XError xfiber_pool_release_isr (XFiberPool *pool, void *mem)
 割込みハンドラから呼び出し可能なxfiber_pool_release()です
 
XError xfiber_pool_timed_get (XFiberPool *pool, void **o_mem, XTicks timeout)
 プールからメモリの確保をタイムアウト付きで試みます
 
XError xfiber_pool_try_get (XFiberPool *pool, void **o_mem)
 プールからメモリの確保をポーリングで試みます
 
XError xfiber_queue_create (XFiberQueue **o_queue, size_t queue_len, size_t item_size)
 キューを生成します [詳解]
 
void xfiber_queue_destroy (XFiberQueue *queue)
 キューを破棄します [詳解]
 
XError xfiber_queue_receive (XFiberQueue *queue, void *dst)
 キューの先頭から要素の受信を試みます
 
XError xfiber_queue_receive_isr (XFiberQueue *queue, void *dst)
 割込みハンドラから呼び出し可能なxfiber_queue_try_receive()です
 
XError xfiber_queue_send_back (XFiberQueue *queue, const void *src)
 キューの末尾への要素の転送を試みます
 
XError xfiber_queue_send_back_isr (XFiberQueue *queue, const void *src)
 割込みハンドラから呼び出し可能なxfiber_queue_try_send_back()です
 
XError xfiber_queue_send_front (XFiberQueue *queue, const void *src)
 キューの先頭への要素の転送を試みます
 
XError xfiber_queue_send_front_isr (XFiberQueue *queue, const void *src)
 割込みハンドラから呼び出し可能なxfiber_queue_try_send_front()です
 
XError xfiber_queue_timed_receive (XFiberQueue *queue, void *dst, XTicks timeout)
 キューの先頭から要素の受信をタイムアウト付きで試みます
 
XError xfiber_queue_timed_send_back (XFiberQueue *queue, const void *src, XTicks timeout)
 キューの末尾への要素の転送をタイムアウト付きで試みます
 
XError xfiber_queue_timed_send_front (XFiberQueue *queue, const void *src, XTicks timeout)
 キューの先頭への要素の転送をタイムアウト付きで試みます
 
XError xfiber_queue_try_receive (XFiberQueue *queue, void *dst)
 キューの先頭から要素の受信をポーリングで試みます
 
XError xfiber_queue_try_send_back (XFiberQueue *queue, const void *src)
 キューの末尾への要素の転送をポーリングで試みます
 
XError xfiber_queue_try_send_front (XFiberQueue *queue, const void *src)
 キューの先頭への要素の転送をポーリングで試みます
 
XError xfiber_resume (XFiber *fiber)
 タスクのサスペンド状態を解除します
 
XFiber * xfiber_self (void)
 実行状態のタスクを返します
 
XError xfiber_semaphore_create (XFiberSemaphore **o_semaphore, int initial_count)
 セマフォを生成します [詳解]
 
void xfiber_semaphore_destroy (XFiberSemaphore *semaphore)
 セマフォを破棄します [詳解]
 
XError xfiber_semaphore_give (XFiberSemaphore *semaphore)
 セマフォを返却します
 
XError xfiber_semaphore_give_isr (XFiberSemaphore *semaphore)
 割込みハンドラで呼び出し可能なxfiber_semaphore_give()です
 
XError xfiber_semaphore_take (XFiberSemaphore *semaphore)
 セマフォの獲得を試みます
 
XError xfiber_semaphore_timed_take (XFiberSemaphore *semaphore, XTicks timeout)
 セマフォの獲得をタイムアウト付きで試みます
 
XError xfiber_semaphore_try_take (XFiberSemaphore *semaphore)
 セマフォの獲得をポーリングで試みます
 
XBits xfiber_signal_get (XFiber *fiber)
 現在のビットパターンを返します
 
XBits xfiber_signal_get_isr (XFiber *fiber)
 割込みハンドラから呼び出し可能なxfiber_signal_get()です
 
XError xfiber_signal_raise (XFiber *fiber, XBits sigs)
 タスクにシグナルを発行します
 
XError xfiber_signal_raise_isr (XFiber *fiber, XBits sigs)
 割込みハンドラから呼び出し可能なxfiber_signal_raise()です
 
XError xfiber_signal_timed_wait (XBits sigs, XBits *result, XTicks timeout)
 シグナルが成立するのをタイムアウト付きで待ちます [詳解]
 
XError xfiber_signal_try_wait (XBits sigs, XBits *result)
 シグナルが成立するのをポーリングで待ちます
 
XError xfiber_signal_wait (XBits sigs, XBits *result)
 シグナルが成立するのを待ちます
 
XError xfiber_suspend (XFiber *fiber)
 タスクをサスペンド状態に遷移させます [詳解]
 
void xfiber_yield ()
 タスクの実行を同一優先度の別のタスクにゆずります
 

変数

static const char *const X__TAG = "XFiber"
 
X__Kernel x_g_fiber_kernel
 

詳解

著者
MaskedW

マクロ定義詳解

#define X__CHECK_POLL (   timeout)
値:
do \
{ \
if ((timeout) == 0) \
{ \
err = X_ERR_TIMED_OUT; \
X_FIBER_EXIT_CRITICAL(); \
goto x__exit; \
} \
} while (0)
Definition: xstddef.h:372
#define X_DECLAER_FIBER_OBJECT_COMMON_MEMBERS
値:
XIntrusiveNode m_node; \
char m_name[16]; \
XFiberObjectType m_type
双方向リンリストリストノード
Definition: xintrusive_list.h:87
#define X_DECLAER_FIBER_WAIT_OBJECT_COMMON_MEMBERS
値:
X_DECLAER_FIBER_OBJECT_COMMON_MEMBERS; \
XIntrusiveList m_pending_tasks