📄 su_port.h
字号:
int su_port_eventmask(su_port_t *self, int index, int socket, int events){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable-> su_port_eventmask(self, index, socket, events);}su_inlineint su_port_wait_events(su_port_t *self, su_duration_t timeout){ su_virtual_port_t *base = (su_virtual_port_t *)self; if (base->sup_vtable->su_port_wait_events == NULL) return errno = ENOSYS, -1; return base->sup_vtable-> su_port_wait_events(self, timeout);}su_inlinevoid su_port_run(su_port_t *self){ su_virtual_port_t *base = (su_virtual_port_t *)self; base->sup_vtable->su_port_run(self);}su_inlinevoid su_port_break(su_port_t *self){ su_virtual_port_t *base = (su_virtual_port_t *)self; base->sup_vtable->su_port_break(self);}su_inlinesu_duration_t su_port_step(su_port_t *self, su_duration_t tout){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_step(self, tout);}su_inlineint su_port_own_thread(su_port_t const *self){ su_virtual_port_t const *base = (su_virtual_port_t *)self; return base->sup_vtable-> su_port_thread((su_port_t *)self, su_port_thread_op_is_obtained) == 2;}su_inline int su_port_has_thread(su_port_t *self){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_thread(self, su_port_thread_op_is_obtained);}su_inline int su_port_release(su_port_t *self){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_thread(self, su_port_thread_op_release);}su_inline int su_port_obtain(su_port_t *self){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_thread(self, su_port_thread_op_obtain);}su_inlineint su_port_add_prepoll(su_port_t *self, su_root_t *root, su_prepoll_f *prepoll, su_prepoll_magic_t *magic){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_add_prepoll(self, root, prepoll, magic);}su_inlineint su_port_remove_prepoll(su_port_t *self, su_root_t *root){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_remove_prepoll(self, root);}su_inlinesu_timer_t **su_port_timers(su_port_t *self){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_timers(self);}su_inlineint su_port_multishot(su_port_t *self, int multishot){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_multishot(self, multishot);}su_inlineint su_port_getmsgs(su_port_t *self){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_getmsgs(self);}su_inlineint su_port_getmsgs_from(su_port_t *self, su_port_t *cloneport){ su_virtual_port_t *base = (su_virtual_port_t *)self; return base->sup_vtable->su_port_getmsgs_from(self, cloneport);}SOFIAPUBFUN void su_port_wait(su_clone_r rclone);SOFIAPUBFUN int su_port_execute(su_task_r const task, int (*function)(void *), void *arg, int *return_value);/* ---------------------------------------------------------------------- *//**@internal Base port object. * * Port is a per-thread reactor. Multiple root objects executed by a single * thread share the su_port_t object. */typedef struct su_base_port_s { su_home_t sup_home[1]; su_port_vtable_t const *sup_vtable; /* Implementation may vary stuff below, too. */ /* Pre-poll callback */ su_prepoll_f *sup_prepoll; su_prepoll_magic_t *sup_pp_magic; su_root_t *sup_pp_root; /* Message list - this is protected by su_port_lock()/su_port_unlock() */ su_msg_t *sup_head, **sup_tail; /* Timer list */ su_timer_queue_t sup_timers; unsigned sup_running; /**< In su_root_run() loop? */} su_base_port_t;/* Base methods */SOFIAPUBFUN int su_base_port_init(su_port_t *, su_port_vtable_t const *);SOFIAPUBFUN void su_base_port_deinit(su_port_t *self);SOFIAPUBFUN void su_base_port_lock(su_port_t *self, char const *who);SOFIAPUBFUN void su_base_port_unlock(su_port_t *self, char const *who);SOFIAPUBFUN int su_base_port_thread(su_port_t const *self, enum su_port_thread_op op);SOFIAPUBFUN void su_base_port_incref(su_port_t *self, char const *who);SOFIAPUBFUN int su_base_port_decref(su_port_t *self, int blocking, char const *who);SOFIAPUBFUN struct _GSource *su_base_port_gsource(su_port_t *self);SOFIAPUBFUN su_socket_t su_base_port_mbox(su_port_t *self);SOFIAPUBFUN int su_base_port_send(su_port_t *self, su_msg_r rmsg);SOFIAPUBFUN int su_base_port_getmsgs(su_port_t *self);SOFIAPUBFUN int su_base_port_getmsgs_from(su_port_t *self, su_port_t *from);SOFIAPUBFUN void su_base_port_run(su_port_t *self);SOFIAPUBFUN void su_base_port_break(su_port_t *self);SOFIAPUBFUN su_duration_t su_base_port_step(su_port_t *self, su_duration_t tout);SOFIAPUBFUN int su_base_port_add_prepoll(su_port_t *self, su_root_t *root, su_prepoll_f *, su_prepoll_magic_t *);SOFIAPUBFUN int su_base_port_remove_prepoll(su_port_t *self, su_root_t *root);SOFIAPUBFUN su_timer_t **su_base_port_timers(su_port_t *self);SOFIAPUBFUN int su_base_port_multishot(su_port_t *self, int multishot);SOFIAPUBFUN int su_base_port_start_shared(su_root_t *parent, su_clone_r return_clone, su_root_magic_t *magic, su_root_init_f init, su_root_deinit_f deinit);SOFIAPUBFUN void su_base_port_wait(su_clone_r rclone);/* ---------------------------------------------------------------------- */#if SU_HAVE_PTHREADS#include <pthread.h>/** @internal Pthread port object */ typedef struct su_pthread_port_s { su_base_port_t sup_base[1]; struct su_pthread_port_waiting_parent *sup_waiting_parent; pthread_t sup_tid; pthread_mutex_t sup_obtained[1];#if 0 pthread_mutex_t sup_runlock[1]; pthread_cond_t sup_resume[1]; short sup_paused; /**< True if thread is paused */#endif short sup_thread; /**< True if thread is active */} su_pthread_port_t;/* Pthread methods */SOFIAPUBFUN int su_pthread_port_init(su_port_t *, su_port_vtable_t const *);SOFIAPUBFUN void su_pthread_port_deinit(su_port_t *self);SOFIAPUBFUN void su_pthread_port_lock(su_port_t *self, char const *who);SOFIAPUBFUN void su_pthread_port_unlock(su_port_t *self, char const *who);SOFIAPUBFUN int su_pthread_port_thread(su_port_t *self, enum su_port_thread_op op);#if 0 /* not yet */SOFIAPUBFUN int su_pthread_port_send(su_port_t *self, su_msg_r rmsg);SOFIAPUBFUN su_port_t *su_pthread_port_create(void);SOFIAPUBFUN su_port_t *su_pthread_port_start(su_root_t *parent, su_clone_r return_clone, su_root_magic_t *magic, su_root_init_f init, su_root_deinit_f deinit);#endifSOFIAPUBFUN int su_pthreaded_port_start(su_port_create_f *create, su_root_t *parent, su_clone_r return_clone, su_root_magic_t *magic, su_root_init_f init, su_root_deinit_f deinit);SOFIAPUBFUN void su_pthread_port_wait(su_clone_r rclone);SOFIAPUBFUN int su_pthread_port_execute(su_task_r const task, int (*function)(void *), void *arg, int *return_value);#if 0SOFIAPUBFUN int su_pthread_port_pause(su_port_t *self);SOFIAPUBFUN int su_pthread_port_resume(su_port_t *self);#endif#elsetypedef su_base_port_t su_pthread_port_t;#define su_pthread_port_init su_base_port_init#define su_pthread_port_deinit su_base_port_deinit#define su_pthread_port_lock su_base_port_lock#define su_pthread_port_unlock su_base_port_unlock#define su_pthread_port_thread su_base_port_thread#define su_pthread_port_wait su_base_port_wait#define su_pthread_port_execute su_base_port_execute#endif/* ====================================================================== *//* Mailbox port using sockets */#define SU_MBOX_SIZE 2typedef struct su_socket_port_s { su_pthread_port_t sup_base[1]; int sup_mbox_index; su_socket_t sup_mbox[SU_MBOX_SIZE];} su_socket_port_t;SOFIAPUBFUN int su_socket_port_init(su_socket_port_t *, su_port_vtable_t const *);SOFIAPUBFUN void su_socket_port_deinit(su_socket_port_t *self);SOFIAPUBFUN int su_socket_port_send(su_port_t *self, su_msg_r rmsg);SOFIA_END_DECLS#endif /* SU_PORT_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -