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);
168 __attribute__((__malloc__));
177 __attribute__((__malloc__));
191 #define SU_ENABLE_MULTISHOT_POLL 1
193 #define SU_ENABLE_MULTISHOT_POLL 0
199 typedef struct su_virtual_port_s {
201 su_port_vtable_t
const *sup_vtable;
211 void 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);
218 void 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);
225 void 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);
232 void 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);
239 void 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);
246 struct _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);
292 int 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);
300 int 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);
309 int 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);
349 int 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);
385 int 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);
393 su_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);
400 int 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);
423 su_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,
451 int 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);
480 SOFIAPUBFUN int su_port_execute(su_task_r
const task,
481 int (*
function)(
void *),
void *arg,
491 typedef 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);
589 typedef 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);
626 SOFIAPUBFUN int su_pthreaded_port_start(su_port_create_f *create,
634 SOFIAPUBFUN int su_pthread_port_execute(su_task_r
const task,
635 int (*
function)(
void *),
void *arg,
645 typedef 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
662 typedef struct su_socket_port_s {
663 su_pthread_port_t sup_base[1];
668 SOFIAPUBFUN int su_socket_port_init(su_socket_port_t *,
669 su_port_vtable_t
const *);
670 SOFIAPUBFUN void su_socket_port_deinit(su_socket_port_t *
self);