#include "config.h"
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "sofia-sip/su.h"
#include <pthread.h>
#include "su_port.h"
#include "sofia-sip/su_alloc.h"
Include dependency graph for su_root.c:
Functions | |
su_task_r | su_task_init (su_task_r task) |
Initialize a task handle with su_task_null. | |
void | su_task_deinit (su_task_r task) |
Destroy a task handle. | |
su_task_r | su_task_new (su_task_r task, su_root_t *root, su_port_t *port) |
Create a new task handle. | |
void | su_task_copy (su_task_r dst, su_task_r const src) |
Duplicates a task handle. | |
void | su_task_move (su_task_r dst, su_task_r src) |
Moves a task handle. | |
int | su_task_cmp (su_task_r const a, su_task_r const b) |
Compare two tasks with each other. | |
int | su_task_is_running (su_task_r const task) |
Tests if a task is running. | |
su_root_t * | su_task_root (su_task_r const self) |
Get root pointer attached to a task handle. | |
su_timer_t ** | su_task_timers (su_task_r const task) |
Return the timer list associated with given task. | |
int | su_task_execute (su_task_r const task, int(*function)(void *), void *arg, int *return_value) |
Execute the function by task thread. | |
int | su_timer_reset_all (su_timer_t **t0, su_task_r) |
Resets and frees all timers belonging to a task. | |
su_root_t * | su_root_create (su_root_magic_t *magic) |
Create a reactor object. | |
void | su_root_destroy (su_root_t *self) |
Destroy a root object. | |
char const * | su_root_name (su_root_t *self) |
Get instance name. | |
int | su_root_set_magic (su_root_t *self, su_root_magic_t *magic) |
Set the context pointer. | |
int | su_root_threading (su_root_t *self, int enable) |
Set threading option. | |
su_root_magic_t * | su_root_magic (su_root_t *self) |
Get context pointer. | |
_GSource * | su_root_gsource (su_root_t *self) |
Get a GSource. | |
int | su_root_register (su_root_t *self, su_wait_t *wait, su_wakeup_f callback, su_wakeup_arg_t *arg, int priority) |
Register a su_wait_t object. | |
int | su_root_unregister (su_root_t *self, su_wait_t *wait, su_wakeup_f callback, su_wakeup_arg_t *arg) |
Unregister a su_wait_t object. | |
int | su_root_deregister (su_root_t *self, int i) |
Remove a su_wait_t registration. | |
int | su_root_eventmask (su_root_t *self, int index, int socket, int events) |
Set mask for a registered event. | |
int | su_root_multishot (su_root_t *self, int multishot) |
Set multishot mode. | |
void | su_root_run (su_root_t *self) |
Run event and message loop. | |
void | su_root_break (su_root_t *self) |
Terminate event loop. | |
su_duration_t | su_root_step (su_root_t *self, su_duration_t tout) |
Process events, timers and messages. | |
su_duration_t | su_root_sleep (su_root_t *self, su_duration_t duration) |
Run event and message loop for given duration. | |
int | su_root_yield (su_root_t *self) |
Check wait events in callbacks that take lots of time. | |
su_task_r | su_root_task (su_root_t const *self) |
Get task reference. | |
su_task_r | su_root_parent (su_root_t const *self) |
Get parent task reference. | |
int | su_root_add_prepoll (su_root_t *root, su_prepoll_f *callback, su_prepoll_magic_t *magic) |
Add a pre-poll callback. | |
int | su_root_remove_prepoll (su_root_t *root) |
Remove a pre-poll callback. | |
int | su_msg_create (su_msg_r rmsg, su_task_r const to, su_task_r const from, su_msg_f wakeup, isize_t size) |
Allocates a message of given size. | |
int | su_msg_report (su_msg_r msg, su_msg_f report) |
Add a delivery report function to a message. | |
int | su_msg_reply (su_msg_r reply, su_msg_r const msg, su_msg_f wakeup, isize_t size) |
Allocates a reply message of given size. | |
void | su_msg_delivery_report (su_msg_r msg) |
Send a delivery report. | |
void | su_msg_save (su_msg_r save, su_msg_r msg) |
Save a message. | |
void | su_msg_destroy (su_msg_r rmsg) |
Destroys an unsent message. | |
su_msg_arg_t * | su_msg_data (su_msg_cr rmsg) |
Gets a pointer to the message data area. | |
isize_t | su_msg_size (su_msg_cr rmsg) |
Get size of message data area. | |
su_task_r | su_msg_from (su_msg_r const msg) |
Get sending task. | |
su_task_r | su_msg_to (su_msg_r const msg) |
Get destination task. | |
void | su_msg_remove_refs (su_msg_r const msg) |
Remove references to 'from' and 'to' tasks from a message. | |
int | su_msg_send (su_msg_r rmsg) |
Send a message. | |
Variables | |
int | su_root_size_hint |
Hint for number of registered fds in su_root. | |
su_task_r const | su_task_null |
NULL task. |
int su_msg_create | ( | su_msg_r | rmsg, | |
su_task_r const | to, | |||
su_task_r const | from, | |||
su_msg_f | wakeup, | |||
isize_t | size | |||
) |
Allocates a message of given size.
The function su_msg_create()
allocates a message with given data size. If successful, it moves the new message handle to the rmsg
.
rmsg | handle to the new message (may be uninitialized prior calling) | |
to | the recipient task | |
from | the sender task | |
wakeup | function that is called when message is delivered | |
size | size of the message data |
0 | if successful, | |
-1 | if message allocation fails. |
su_msg_arg_t* su_msg_data | ( | su_msg_cr | rmsg | ) |
Gets a pointer to the message data area.
The function su_msg_data()
returns a pointer to the message data area. If rmsg
contains a NULL
handle, or message size is 0, NULL
pointer is returned.
rmsg | message handle |
void su_msg_delivery_report | ( | su_msg_r | msg | ) |
Send a delivery report.
If the sender has attached a delivery report function to message with su_msg_report(), the message is returned to the message queue of the sending task. The sending task calls the delivery report function when it has received the message.
void su_msg_destroy | ( | su_msg_r | rmsg | ) |
Destroys an unsent message.
rmsg | message handle. |
su_task_r su_msg_from | ( | su_msg_r const | msg | ) |
Get sending task.
Returns the task handle belonging to the sender of the message.
If the message handle contains NULL the function su_msg_from
returns NULL.
msg | message handle |
void su_msg_remove_refs | ( | su_msg_r const | msg | ) |
Remove references to 'from' and 'to' tasks from a message.
msg | message handle |
Allocates a reply message of given size.
reply | handle to the new message (may be uninitialized prior calling) | |
msg | the incoming message | |
wakeup | function that is called when message is delivered | |
size | size of the message data |
0 | if successful, | |
-1 | otherwise. |
Add a delivery report function to a message.
The delivery report funcgtion gets called by the sending task after the message was delivered and the message function was executed. (The su_root_t message delivery loop calls su_msg_delivery_report()
int su_msg_send | ( | su_msg_r | rmsg | ) |
Send a message.
The function su_msg_send()
sends the message. The message is added to the recipients message queue, and recipient is waken up. The caller may not alter the message or the data associated with it after the message has been sent.
rmsg | message handle |
0 | if signal was sent successfully or handle was NULL , | |
-1 | otherwise. |
su_task_r su_msg_to | ( | su_msg_r const | msg | ) |
Get destination task.
The function su_msg_from
returns the task handle belonging to the recipient of the message.
If the message handle contains NULL the function su_msg_to
returns NULL.
msg | message handle |
int su_root_add_prepoll | ( | su_root_t * | root, | |
su_prepoll_f * | callback, | |||
su_prepoll_magic_t * | magic | |||
) |
Add a pre-poll callback.
void su_root_break | ( | su_root_t * | self | ) |
Terminate event loop.
The function su_root_break() is used to terminate execution of su_root_run(). It can be called from a callback function.
self | pointer to root object |
su_root_t* su_root_create | ( | su_root_magic_t * | magic | ) |
int su_root_deregister | ( | su_root_t * | self, | |
int | i | |||
) |
Remove a su_wait_t registration.
The function su_root_deregister() deregisters a su_wait_t object. The wait object, a callback function and a argument are removed from the root object. The wait object is destroyed.
self | pointer to root object | |
i | registration index |
void su_root_destroy | ( | su_root_t * | self | ) |
Destroy a root object.
Stop and free an instance of su_root_t
self | pointer to a root object. |
int su_root_eventmask | ( | su_root_t * | self, | |
int | index, | |||
int | socket, | |||
int | events | |||
) |
Set mask for a registered event.
The function su_root_eventmask() sets the mask describing events that can signal the registered callback.
self | pointer to root object | |
index | registration index | |
socket | socket | |
events | new event mask |
0 | when successful, | |
-1 | upon an error. |
su_root_magic_t* su_root_magic | ( | su_root_t * | self | ) |
Get context pointer.
The function su_root_magic() returns the user context pointer that was given input to su_root_create() or su_root_set_magic().
self | pointer to a root object |
int su_root_multishot | ( | su_root_t * | self, | |
int | multishot | |||
) |
Set multishot mode.
The function su_root_multishot() enables, disables or queries the multishot mode for the root. The multishot mode determines how the events are scheduled by root. If multishot mode is enabled, root serves all the sockets that have received network events. If it is disables, only first socket event is served.
self | pointer to root object | |
multishot | multishot mode (0 => disables, 1 => enables, -1 => query) |
0 | multishot mode is disabled | |
1 | multishot mode is enabled | |
-1 | an error occurred |
char const* su_root_name | ( | su_root_t * | self | ) |
Get instance name.
self | pointer to a root object |
su_task_r su_root_parent | ( | su_root_t const * | self | ) |
Get parent task reference.
The function su_root_parent() is used to retrieve the task reference (PId) of the parent task.
self | a pointer to a root object |
int su_root_register | ( | su_root_t * | self, | |
su_wait_t * | wait, | |||
su_wakeup_f | callback, | |||
su_wakeup_arg_t * | arg, | |||
int | priority | |||
) |
Register a su_wait_t object.
The function su_root_register() registers a su_wait_t object. The wait object, a callback function and a argument are stored to the root object. The callback function is called, when the wait object is signaled.
Please note if identical wait objects are inserted, only first one is ever signalled.
self | pointer to root object | |
wait | pointer to wait object | |
callback | callback function pointer | |
arg | argument given to callback function when it is invoked | |
priority | relative priority of the wait object (0 is normal, 1 important, 2 realtime) |
void su_root_run | ( | su_root_t * | self | ) |
Run event and message loop.
The function su_root_run() runs the root main loop. The root loop waits for wait objects and the timers associated with the root object. When any wait object is signaled or timer is expired, it invokes the callbacks, and returns waiting.
This function returns when su_root_break() is called from a callback.
self | pointer to root object |
int su_root_set_magic | ( | su_root_t * | self, | |
su_root_magic_t * | magic | |||
) |
Set the context pointer.
Set the context pointer (magic) of a root object.
self | pointer to a root object | |
magic | pointer to user data |
0 | when successful, | |
-1 | upon error. |
su_duration_t su_root_sleep | ( | su_root_t * | self, | |
su_duration_t | duration | |||
) |
Run event and message loop for given duration.
The function su_root_sleep() runs event loop for duration milliseconds. The event loop waits for wait objects and the timers associated with the root object. When any wait object is signaled, timer is expired, or message is received, it invokes the callbacks and returns waiting.
self | pointer to root object | |
duration | milliseconds to run event loop |
su_duration_t su_root_step | ( | su_root_t * | self, | |
su_duration_t | tout | |||
) |
Process events, timers and messages.
The function su_root_step() waits for wait objects and the timers associated with the root object. When any wait object is signaled or timer is expired, it invokes the callbacks.
This function returns when a callback has been invoked or tout milliseconds is elapsed.
self | pointer to root object | |
tout | timeout in milliseconds |
su_task_r su_root_task | ( | su_root_t const * | self | ) |
Get task reference.
The function su_root_task() is used to retrieve the task reference (PId) related with the root object.
self | a pointer to a root object |
int su_root_threading | ( | su_root_t * | self, | |
int | enable | |||
) |
Set threading option.
Controls whether su_clone_start() creates a new thread.
self | pointer to a root object | |
enable | if true, enable threading, if false, disable threading |
int su_root_unregister | ( | su_root_t * | self, | |
su_wait_t * | wait, | |||
su_wakeup_f | callback, | |||
su_wakeup_arg_t * | arg | |||
) |
Unregister a su_wait_t object.
The function su_root_unregister() unregisters a su_wait_t object. The wait object, a callback function and a argument are removed from the root object.
self | pointer to root object | |
wait | pointer to wait object | |
callback | callback function pointer (may be NULL) | |
arg | argument given to callback function when it is invoked (may be NULL) |
int su_root_yield | ( | su_root_t * | self | ) |
Check wait events in callbacks that take lots of time.
This function does a 0 timeout poll() and runs wait objects
self | pointer to root object |
int su_task_cmp | ( | su_task_r const | a, | |
su_task_r const | b | |||
) |
Compare two tasks with each other.
a | First task | |
b | Second task |
negative | number, if a < b | |
positive | number, if a > b | |
0,if | a == b. |
void su_task_copy | ( | su_task_r | dst, | |
su_task_r const | src | |||
) |
Duplicates a task handle.
dst | destination task reference | |
src | source task reference |
void su_task_deinit | ( | su_task_r | task | ) |
Destroy a task handle.
task | task handle |
int su_task_execute | ( | su_task_r const | task, | |
int(*)(void *) | function, | |||
void * | arg, | |||
int * | return_value | |||
) |
Execute the function by task thread.
0 | if successful | |
-1 | upon an error |
su_task_r su_task_init | ( | su_task_r | task | ) |
Initialize a task handle with su_task_null.
task | task handle |
int su_task_is_running | ( | su_task_r const | task | ) |
Tests if a task is running.
task | task handle |
true | (nonzero) if task is not stopped, | |
zero | if it is null or stopped. |
void su_task_move | ( | su_task_r | dst, | |
su_task_r | src | |||
) |
Moves a task handle.
dst | destination task reference | |
src | source task reference |
Create a new task handle.
task | task reference | |
root | pointer to root object | |
port | pointer to port object |
su_root_t* su_task_root | ( | su_task_r const | self | ) |
Get root pointer attached to a task handle.
self | task handle |
su_timer_t** su_task_timers | ( | su_task_r const | task | ) |
Return the timer list associated with given task.
task | task handle |
int su_timer_reset_all | ( | su_timer_t ** | timers, | |
su_task_r | task | |||
) |
Resets and frees all timers belonging to a task.
The function su_timer_destroy_all() resets and frees all timers belonging to the specified task in the queue.
timers | pointer to the timers | |
task | task owning the timers |
su_task_r const su_task_null |
NULL task.