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)
89 enum su_port_thread_op {
90 su_port_thread_op_is_obtained,
91 su_port_thread_op_release,
92 su_port_thread_op_obtain
96 typedef 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
195 typedef struct su_virtual_port_s {
197 su_port_vtable_t
const *sup_vtable;
207 void 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);
214 void 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);
221 void 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);
228 void 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);
235 void 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);
242 struct _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);
288 int 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);
296 int 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);
305 int 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);
345 int 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);
381 int 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);
389 su_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);
396 int 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);
419 su_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,
447 int 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,
466 typedef struct su_base_port_s {
468 su_port_vtable_t
const *sup_vtable;
481 su_timer_queue_t sup_timers, sup_deferrable;
485 unsigned sup_running;
497 enum su_port_thread_op op);
550 typedef 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);
587 SOFIAPUBFUN int su_pthreaded_port_start(su_port_create_f *create,
596 int (*
function)(
void *),
void *arg,
606 typedef 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
623 typedef struct su_socket_port_s {
624 su_pthread_port_t sup_base[1];
629 SOFIAPUBFUN int su_socket_port_init(su_socket_port_t *,
630 su_port_vtable_t
const *);
631 SOFIAPUBFUN 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.
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