41#define SU_MSG_ARG_T union { char anoymous[4]; }
48#ifndef SU_MODULE_DEBUG_H
49#include "su_module_debug.h"
58#define SU_WAIT_MIN (16)
83 unsigned sur_threading : 1;
84 unsigned sur_deiniting : 1;
87#define SU_ROOT_MAGIC(r) ((r) ? (r)->sur_magic : NULL)
89enum su_port_thread_op {
90 su_port_thread_op_is_obtained,
91 su_port_thread_op_release,
92 su_port_thread_op_obtain
96typedef struct su_port_vtable {
97 unsigned su_vtable_size;
98 void (*su_port_lock)(
su_port_t *port,
char const *who);
99 void (*su_port_unlock)(
su_port_t *port,
char const *who);
100 void (*su_port_incref)(
su_port_t *port,
char const *who);
101 void (*su_port_decref)(
su_port_t *port,
int block,
char const *who);
102 struct _GSource *(*su_port_gsource)(
su_port_t *port);
110 int (*su_port_unregister)(
su_port_t *port,
115 int (*su_port_deregister)(
su_port_t *self,
int i);
116 int (*su_port_unregister_all)(
su_port_t *self,
118 int (*su_port_eventmask)(
su_port_t *self,
int index,
int socket,
int events);
124 int (*su_port_thread)(
su_port_t *port,
enum su_port_thread_op op);
126 int (*su_port_add_prepoll)(
su_port_t *port,
131 int (*su_port_remove_prepoll)(
su_port_t *port,
134 su_timer_queue_t *(*su_port_timers)(
su_port_t *port);
136 int (*su_port_multishot)(
su_port_t *port,
int multishot);
143 char const *(*su_port_name)(
su_port_t const *port);
144 int (*su_port_start_shared)(su_root_t *root,
150 int (*su_port_execute)(
su_task_r const task,
151 int (*function)(
void *),
void *arg,
155 su_timer_queue_t *(*su_port_deferrable)(
su_port_t *port);
156 int (*su_port_max_defer)(
su_port_t *port,
160 int (*su_port_is_running)(
su_port_t const *port);
164 __attribute__((__malloc__));
173 __attribute__((__malloc__));
187#define SU_ENABLE_MULTISHOT_POLL 1
189#define SU_ENABLE_MULTISHOT_POLL 0
195typedef struct su_virtual_port_s {
197 su_port_vtable_t
const *sup_vtable;
207void su_port_lock(
su_port_t *self,
char const *who)
209 su_virtual_port_t *base = (su_virtual_port_t *)self;
210 base->sup_vtable->su_port_lock(self, who);
214void su_port_unlock(
su_port_t *self,
char const *who)
216 su_virtual_port_t *base = (su_virtual_port_t *)self;
217 base->sup_vtable->su_port_unlock(self, who);
221void su_port_incref(
su_port_t *self,
char const *who)
223 su_virtual_port_t *base = (su_virtual_port_t *)self;
224 base->sup_vtable->su_port_incref(self, who);
228void su_port_decref(
su_port_t *self,
char const *who)
230 su_virtual_port_t *base = (su_virtual_port_t *)self;
231 base->sup_vtable->su_port_decref(self, 0, who);
235void su_port_zapref(
su_port_t *self,
char const *who)
237 su_virtual_port_t *base = (su_virtual_port_t *)self;
238 base->sup_vtable->su_port_decref(self, 1, who);
242struct _GSource *su_port_gsource(
su_port_t *self)
244 su_virtual_port_t *base = (su_virtual_port_t *)self;
245 return base->sup_vtable->su_port_gsource(self);
251 su_virtual_port_t *base = (su_virtual_port_t *)self;
252 return base->sup_vtable->su_port_send(self, rmsg);
258 su_virtual_port_t *base = (su_virtual_port_t *)self;
259 return base->sup_vtable->su_port_wakeup(self);
270 su_virtual_port_t *base = (su_virtual_port_t *)self;
271 return base->sup_vtable->
272 su_port_register(self, root, wait, callback, arg, priority);
282 su_virtual_port_t *base = (su_virtual_port_t *)self;
283 return base->sup_vtable->
284 su_port_unregister(self, root, wait, callback, arg);
288int su_port_deregister(
su_port_t *self,
int i)
290 su_virtual_port_t *base = (su_virtual_port_t *)self;
291 return base->sup_vtable->
292 su_port_deregister(self, i);
296int su_port_unregister_all(
su_port_t *self,
299 su_virtual_port_t *base = (su_virtual_port_t *)self;
300 return base->sup_vtable->
301 su_port_unregister_all(self, root);
305int su_port_eventmask(
su_port_t *self,
int index,
int socket,
int events)
307 su_virtual_port_t *base = (su_virtual_port_t *)self;
308 return base->sup_vtable->
309 su_port_eventmask(self, index, socket, events);
315 su_virtual_port_t *base = (su_virtual_port_t *)self;
316 if (base->sup_vtable->su_port_wait_events == NULL)
317 return errno = ENOSYS, -1;
318 return base->sup_vtable->
319 su_port_wait_events(self, timeout);
325 su_virtual_port_t *base = (su_virtual_port_t *)self;
326 base->sup_vtable->su_port_run(self);
332 su_virtual_port_t *base = (su_virtual_port_t *)self;
333 base->sup_vtable->su_port_break(self);
339 su_virtual_port_t *base = (su_virtual_port_t *)self;
340 return base->sup_vtable->su_port_step(self, tout);
345int su_port_own_thread(
su_port_t const *self)
347 su_virtual_port_t
const *base = (su_virtual_port_t *)self;
348 return base->sup_vtable->
349 su_port_thread((
su_port_t *)self, su_port_thread_op_is_obtained) == 2;
354 su_virtual_port_t *base = (su_virtual_port_t *)self;
355 return base->sup_vtable->su_port_thread(self, su_port_thread_op_is_obtained);
360 su_virtual_port_t *base = (su_virtual_port_t *)self;
361 return base->sup_vtable->su_port_thread(self, su_port_thread_op_release);
366 su_virtual_port_t *base = (su_virtual_port_t *)self;
367 return base->sup_vtable->su_port_thread(self, su_port_thread_op_obtain);
376 su_virtual_port_t *base = (su_virtual_port_t *)self;
377 return base->sup_vtable->su_port_add_prepoll(self, root, prepoll, magic);
381int su_port_remove_prepoll(
su_port_t *self,
384 su_virtual_port_t *base = (su_virtual_port_t *)self;
385 return base->sup_vtable->su_port_remove_prepoll(self, root);
389su_timer_queue_t *su_port_timers(
su_port_t *self)
391 su_virtual_port_t *base = (su_virtual_port_t *)self;
392 return base->sup_vtable->su_port_timers(self);
396int su_port_multishot(
su_port_t *self,
int multishot)
398 su_virtual_port_t *base = (su_virtual_port_t *)self;
399 return base->sup_vtable->su_port_multishot(self, multishot);
405 su_virtual_port_t *base = (su_virtual_port_t *)self;
406 return base->sup_vtable->su_port_getmsgs(self);
412 su_virtual_port_t *base = (su_virtual_port_t *)self;
413 return base->sup_vtable->su_port_getmsgs_from(self, cloneport);
419su_timer_queue_t *su_port_deferrable(
su_port_t *self)
421 su_virtual_port_t *base = (su_virtual_port_t *)self;
428 return base->sup_vtable->su_port_deferrable(self);
436 su_virtual_port_t *base = (su_virtual_port_t *)self;
439 return (errno = EFAULT), -1;
441 return base->sup_vtable->su_port_max_defer(self,
447int su_port_is_running(
su_port_t const *self)
449 su_virtual_port_t *base = (su_virtual_port_t *)self;
450 return base && base->sup_vtable->su_port_is_running(self);
456 int (*function)(
void *),
void *arg,
466typedef struct su_base_port_s {
468 su_port_vtable_t
const *sup_vtable;
475 su_root_t *sup_pp_root;
481 su_timer_queue_t sup_timers, sup_deferrable;
485 unsigned sup_running;
497 enum su_port_thread_op op);
528SOFIAPUBFUN int su_base_port_start_shared(su_root_t *parent,
550typedef struct su_pthread_port_s {
551 su_base_port_t sup_base[1];
552 struct su_pthread_port_waiting_parent
555 pthread_mutex_t sup_obtained[1];
558 pthread_mutex_t sup_runlock[1];
559 pthread_cond_t sup_resume[1];
574 enum su_port_thread_op op);
587SOFIAPUBFUN int su_pthreaded_port_start(su_port_create_f *create,
596 int (*function)(
void *),
void *arg,
606typedef su_base_port_t su_pthread_port_t;
608#define su_pthread_port_init su_base_port_init
609#define su_pthread_port_deinit su_base_port_deinit
610#define su_pthread_port_lock su_base_port_lock
611#define su_pthread_port_unlock su_base_port_unlock
612#define su_pthread_port_thread su_base_port_thread
613#define su_pthread_port_wait su_base_port_wait
614#define su_pthread_port_execute su_base_port_execute
621#define SU_MBOX_SIZE 2
623typedef struct su_socket_port_s {
624 su_pthread_port_t sup_base[1];
629SOFIAPUBFUN int su_socket_port_init(su_socket_port_t *,
630 su_port_vtable_t
const *);
631SOFIAPUBFUN void su_socket_port_deinit(su_socket_port_t *self);
Time in seconds and microsecondcs.
Definition su_time.h:48
int su_socket_t
Socket descriptor type.
Definition su.h:128
Home-based memory management interface.
SU_HOME_T su_home_t
Memory home type.
Definition su_alloc.h:50
#define SOFIAPUBFUN
SOFIAPUBFUN declares an exported function.
Definition su_config.h:66
long su_duration_t
Time difference in microseconds.
Definition su_time.h:61
Syncronization and threading interface.
SU_WAKEUP_ARG_T su_wakeup_arg_t
Wakeup callback argument type.
Definition su_wait.h:261
void(* su_root_deinit_f)(su_root_t *, su_root_magic_t *)
Clone finalization function type.
Definition su_wait.h:425
int(* su_wakeup_f)(su_root_magic_t *, su_wait_t *, su_wakeup_arg_t *arg)
Wakeup callback function pointer type.
Definition su_wait.h:268
SU_ROOT_MAGIC_T su_root_magic_t
Root context pointer type.
Definition su_wait.h:236
struct pollfd su_wait_t
Wait object.
Definition su_wait.h:184
int(* su_root_init_f)(su_root_t *, su_root_magic_t *)
Clone initialization function type.
Definition su_wait.h:422
_su_task_t su_task_r[1]
Task reference type.
Definition su_wait.h:360
SU_PREPOLL_MAGIC_T su_prepoll_magic_t
Root context pointer type.
Definition su_wait.h:310
struct su_msg_s su_msg_t
Message type.
Definition su_wait.h:382
su_msg_function * su_msg_f
Message delivery function pointer type.
Definition su_wait.h:405
SU_CLONE_T * su_clone_r[1]
Clone reference.
Definition su_wait.h:416
struct su_port_s su_port_t
Port type.
Definition su_wait.h:355
SU_MSG_ARG_T su_msg_arg_t
Message argument type.
Definition su_wait.h:379
void su_prepoll_f(su_prepoll_magic_t *, su_root_t *)
Pre-poll callback function prototype.
Definition su_wait.h:317
void su_msg_deinit_function(su_msg_arg_t *arg)
Message deinitializer function type.
Definition su_wait.h:402
su_msg_t * su_msg_r[1]
Message reference type.
Definition su_wait.h:385