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);
168 __attribute__((__malloc__));
177 __attribute__((__malloc__));
191#define SU_ENABLE_MULTISHOT_POLL 1
193#define SU_ENABLE_MULTISHOT_POLL 0
199typedef struct su_virtual_port_s {
201 su_port_vtable_t
const *sup_vtable;
211void su_port_lock(
su_port_t *self,
char const *who)
213 su_virtual_port_t *base = (su_virtual_port_t *)self;
214 base->sup_vtable->su_port_lock(self, who);
218void su_port_unlock(
su_port_t *self,
char const *who)
220 su_virtual_port_t *base = (su_virtual_port_t *)self;
221 base->sup_vtable->su_port_unlock(self, who);
225void su_port_incref(
su_port_t *self,
char const *who)
227 su_virtual_port_t *base = (su_virtual_port_t *)self;
228 base->sup_vtable->su_port_incref(self, who);
232void su_port_decref(
su_port_t *self,
char const *who)
234 su_virtual_port_t *base = (su_virtual_port_t *)self;
235 base->sup_vtable->su_port_decref(self, 0, who);
239void su_port_zapref(
su_port_t *self,
char const *who)
241 su_virtual_port_t *base = (su_virtual_port_t *)self;
242 base->sup_vtable->su_port_decref(self, 1, who);
246struct _GSource *su_port_gsource(
su_port_t *self)
248 su_virtual_port_t *base = (su_virtual_port_t *)self;
249 return base->sup_vtable->su_port_gsource(self);
255 su_virtual_port_t *base = (su_virtual_port_t *)self;
256 return base->sup_vtable->su_port_send(self, rmsg);
262 su_virtual_port_t *base = (su_virtual_port_t *)self;
263 return base->sup_vtable->su_port_wakeup(self);
274 su_virtual_port_t *base = (su_virtual_port_t *)self;
275 return base->sup_vtable->
276 su_port_register(self, root, wait, callback, arg, priority);
286 su_virtual_port_t *base = (su_virtual_port_t *)self;
287 return base->sup_vtable->
288 su_port_unregister(self, root, wait, callback, arg);
292int su_port_deregister(
su_port_t *self,
int i)
294 su_virtual_port_t *base = (su_virtual_port_t *)self;
295 return base->sup_vtable->
296 su_port_deregister(self, i);
300int su_port_unregister_all(
su_port_t *self,
303 su_virtual_port_t *base = (su_virtual_port_t *)self;
304 return base->sup_vtable->
305 su_port_unregister_all(self, root);
309int su_port_eventmask(
su_port_t *self,
int index,
int socket,
int events)
311 su_virtual_port_t *base = (su_virtual_port_t *)self;
312 return base->sup_vtable->
313 su_port_eventmask(self, index, socket, events);
319 su_virtual_port_t *base = (su_virtual_port_t *)self;
320 if (base->sup_vtable->su_port_wait_events == NULL)
321 return errno = ENOSYS, -1;
322 return base->sup_vtable->
323 su_port_wait_events(self, timeout);
329 su_virtual_port_t *base = (su_virtual_port_t *)self;
330 base->sup_vtable->su_port_run(self);
336 su_virtual_port_t *base = (su_virtual_port_t *)self;
337 base->sup_vtable->su_port_break(self);
343 su_virtual_port_t *base = (su_virtual_port_t *)self;
344 return base->sup_vtable->su_port_step(self, tout);
349int su_port_own_thread(
su_port_t const *self)
351 su_virtual_port_t
const *base = (su_virtual_port_t *)self;
352 return base->sup_vtable->
353 su_port_thread((
su_port_t *)self, su_port_thread_op_is_obtained) == 2;
358 su_virtual_port_t *base = (su_virtual_port_t *)self;
359 return base->sup_vtable->su_port_thread(self, su_port_thread_op_is_obtained);
364 su_virtual_port_t *base = (su_virtual_port_t *)self;
365 return base->sup_vtable->su_port_thread(self, su_port_thread_op_release);
370 su_virtual_port_t *base = (su_virtual_port_t *)self;
371 return base->sup_vtable->su_port_thread(self, su_port_thread_op_obtain);
380 su_virtual_port_t *base = (su_virtual_port_t *)self;
381 return base->sup_vtable->su_port_add_prepoll(self, root, prepoll, magic);
385int su_port_remove_prepoll(
su_port_t *self,
388 su_virtual_port_t *base = (su_virtual_port_t *)self;
389 return base->sup_vtable->su_port_remove_prepoll(self, root);
393su_timer_queue_t *su_port_timers(
su_port_t *self)
395 su_virtual_port_t *base = (su_virtual_port_t *)self;
396 return base->sup_vtable->su_port_timers(self);
400int su_port_multishot(
su_port_t *self,
int multishot)
402 su_virtual_port_t *base = (su_virtual_port_t *)self;
403 return base->sup_vtable->su_port_multishot(self, multishot);
409 su_virtual_port_t *base = (su_virtual_port_t *)self;
410 return base->sup_vtable->su_port_getmsgs(self);
416 su_virtual_port_t *base = (su_virtual_port_t *)self;
417 return base->sup_vtable->su_port_getmsgs_from(self, cloneport);
423su_timer_queue_t *su_port_deferrable(
su_port_t *self)
425 su_virtual_port_t *base = (su_virtual_port_t *)self;
432 return base->sup_vtable->su_port_deferrable(self);
440 su_virtual_port_t *base = (su_virtual_port_t *)self;
443 return (errno = EFAULT), -1;
445 return base->sup_vtable->su_port_max_defer(self,
451int su_port_is_running(
su_port_t const *self)
453 su_virtual_port_t *base = (su_virtual_port_t *)self;
454 return base && base->sup_vtable->su_port_is_running(self);
460 su_virtual_port_t *base = (su_virtual_port_t *)self;
463 return base->sup_vtable->su_port_stamp64(self);
470 su_virtual_port_t *base = (su_virtual_port_t *)self;
473 return base->sup_vtable->su_port_stamp64_offset(self);
481 int (*function)(
void *),
void *arg,
491typedef struct su_base_port_s {
493 su_port_vtable_t
const *sup_vtable;
514 su_timer_queue_t sup_timers, sup_deferrable;
518 unsigned sup_running;
530 enum su_port_thread_op op);
561SOFIAPUBFUN int su_base_port_start_shared(su_root_t *parent,
589typedef struct su_pthread_port_s {
590 su_base_port_t sup_base[1];
591 struct su_pthread_port_waiting_parent
594 pthread_mutex_t sup_obtained[1];
597 pthread_mutex_t sup_runlock[1];
598 pthread_cond_t sup_resume[1];
613 enum su_port_thread_op op);
626SOFIAPUBFUN int su_pthreaded_port_start(su_port_create_f *create,
635 int (*function)(
void *),
void *arg,
645typedef su_base_port_t su_pthread_port_t;
647#define su_pthread_port_init su_base_port_init
648#define su_pthread_port_deinit su_base_port_deinit
649#define su_pthread_port_lock su_base_port_lock
650#define su_pthread_port_unlock su_base_port_unlock
651#define su_pthread_port_thread su_base_port_thread
652#define su_pthread_port_wait su_base_port_wait
653#define su_pthread_port_execute su_base_port_execute
660#define SU_MBOX_SIZE 2
662typedef struct su_socket_port_s {
663 su_pthread_port_t sup_base[1];
668SOFIAPUBFUN int su_socket_port_init(su_socket_port_t *,
669 su_port_vtable_t
const *);
670SOFIAPUBFUN void su_socket_port_deinit(su_socket_port_t *self);
Time in seconds and microsecondcs.
Definition su_time.h:57
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
su_time64_t su_now64(void)
Get current time as nanoseconds since epoch.
Definition su_time0.c:194
int64_t su_dur64_t
Time offset (duration) in nanoseconds.
Definition su_time.h:50
long su_duration_t
Time difference in microseconds.
Definition su_time.h:70
su_time64_t su_stamp64(void)
Get current monotonic timestamp as nanoseconds.
Definition su_time0.c:271
uint64_t su_time64_t
Time in nanoseconds.
Definition su_time.h:44
Syncronization and threading interface.
struct su_root_t su_root_t
Root object type.
Definition su_wait.h:210
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