libamxd  6.4.1
Data Model Manager
amxd_function_deferred.c File Reference
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <amxc/amxc.h>
#include <amxp/amxp_signal.h>
#include <amxp/amxp_slot.h>
#include <amxd/amxd_common.h>
#include <amxd/amxd_types.h>
#include <amxd/amxd_object.h>
#include <amxd/amxd_function.h>
#include "amxd_priv.h"
#include "amxd_assert.h"
#include "amxd_dm_priv.h"

Go to the source code of this file.

Macros

#define _GNU_SOURCE
 

Functions

static void amxd_delete_deferred (amxc_llist_it_t *it)
 
static void amxd_cancel_deferred (amxd_deferred_ctx_t *call, amxc_var_t *sig_data)
 
amxd_deferred_ctx_tamxd_find_deferred (uint64_t call_id)
 
void amxd_dm_cancel_deferred (amxd_dm_t *dm)
 
amxd_status_t amxd_function_defer (const amxd_function_t *const func, uint64_t *call_id, amxc_var_t *const ret, amxd_deferred_cancel_t cancel_fn, void *priv)
 Creates a deferred RPC context. More...
 
void amxd_function_deferred_remove (uint64_t call_id)
 Removes a deferred RPC context. More...
 
void * amxd_function_deferred_get_priv (uint64_t call_id)
 Gets the callee private data of an deferred function. More...
 
amxd_status_t amxd_function_set_deferred_cb (uint64_t call_id, amxp_deferred_fn_t cb, void *priv)
 Sets a callback function to get the result of the deferred call. More...
 
static amxd_status_t amxd_function_deferred_done_impl (uint64_t call_id, amxd_status_t status, amxc_var_t *out_args, amxc_var_t *ret, bool now)
 
amxd_status_t amxd_function_deferred_done (uint64_t call_id, amxd_status_t status, amxc_var_t *out_args, amxc_var_t *ret)
 Finishes a deferred method and removes the deferred function context. More...
 
amxd_status_t amxd_function_deferred_call_done (uint64_t call_id, amxd_status_t status, amxc_var_t *out_args, amxc_var_t *ret)
 Finishes a deferred method and removes the deferred function context. More...
 
static CONSTRUCTOR void amxd_function_deferred_init (void)
 

Variables

static amxc_llist_t deferred
 
static uint64_t g_call_id
 

Macro Definition Documentation

◆ _GNU_SOURCE

#define _GNU_SOURCE

Definition at line 56 of file amxd_function_deferred.c.

Function Documentation

◆ amxd_cancel_deferred()

static void amxd_cancel_deferred ( amxd_deferred_ctx_t call,
amxc_var_t *  sig_data 
)
static

Definition at line 87 of file amxd_function_deferred.c.

87  {
88  if(call->cancel != NULL) {
89  call->cancel(call->call_id, call->called_priv);
90  }
91  if(call->cb != NULL) {
92  call->cb(sig_data, call->caller_priv);
93  }
94 }
amxp_deferred_fn_t cb
Definition: amxd_dm_priv.h:65
amxd_deferred_cancel_t cancel
Definition: amxd_dm_priv.h:66

◆ amxd_delete_deferred()

static void amxd_delete_deferred ( amxc_llist_it_t *  it)
static

Definition at line 80 of file amxd_function_deferred.c.

80  {
81  amxd_deferred_ctx_t* data = amxc_container_of(it, amxd_deferred_ctx_t, it);
82  amxc_llist_it_take(it);
83  amxc_llist_it_take(&data->dm_it);
84  free(data);
85 }
amxc_llist_it_t dm_it
Definition: amxd_dm_priv.h:64

◆ amxd_dm_cancel_deferred()

void amxd_dm_cancel_deferred ( amxd_dm_t dm)

Definition at line 109 of file amxd_function_deferred.c.

109  {
110  amxc_var_t sig_data;
111 
112  amxc_var_init(&sig_data);
113  amxc_var_set_type(&sig_data, AMXC_VAR_ID_HTABLE);
114  amxc_var_add_new_key(&sig_data, "retval");
115  amxc_var_add_key(uint32_t, &sig_data, "status", amxd_status_unknown_error);
116 
117  amxc_llist_for_each(it, &dm->deferred) {
118  amxd_deferred_ctx_t* call = amxc_container_of(it, amxd_deferred_ctx_t, dm_it);
119  amxd_cancel_deferred(call, &sig_data);
120  amxd_delete_deferred(&call->it);
121  }
122 
123  amxc_var_clean(&sig_data);
124 }
static void amxd_delete_deferred(amxc_llist_it_t *it)
static void amxd_cancel_deferred(amxd_deferred_ctx_t *call, amxc_var_t *sig_data)
@ amxd_status_unknown_error
Definition: amxd_types.h:79
amxc_llist_it_t it
Definition: amxd_dm_priv.h:63
amxc_llist_t deferred
Definition: amxd_types.h:264
static amxd_dm_t dm

◆ amxd_find_deferred()

amxd_deferred_ctx_t* amxd_find_deferred ( uint64_t  call_id)

Definition at line 96 of file amxd_function_deferred.c.

96  {
97  amxd_deferred_ctx_t* data = NULL;
98  amxc_llist_for_each(it, &deferred) {
99  data = amxc_container_of(it, amxd_deferred_ctx_t, it);
100  if(data->call_id == call_id) {
101  break;
102  }
103  data = NULL;
104  }
105 
106  return data;
107 }
static amxc_llist_t deferred
static uint64_t call_id

◆ amxd_function_deferred_done_impl()

static amxd_status_t amxd_function_deferred_done_impl ( uint64_t  call_id,
amxd_status_t  status,
amxc_var_t *  out_args,
amxc_var_t *  ret,
bool  now 
)
static

Definition at line 201 of file amxd_function_deferred.c.

205  {
207  amxc_var_t sig_data;
209 
210  amxc_var_init(&sig_data);
211 
212  when_null(call, exit);
213  when_null_status(call->cb, exit, rv = amxd_status_ok);
214 
215  amxc_var_set_type(&sig_data, AMXC_VAR_ID_HTABLE);
216  if(ret != NULL) {
217  amxc_var_set_key(&sig_data, "retval", ret, AMXC_VAR_FLAG_COPY);
218  } else {
219  amxc_var_add_new_key(&sig_data, "retval");
220  }
221  if(out_args != NULL) {
222  amxc_var_set_key(&sig_data, "args", out_args, AMXC_VAR_FLAG_COPY);
223  }
224  amxc_var_add_key(uint32_t, &sig_data, "status", status);
225 
226  if(now) {
227  call->cb(&sig_data, call->caller_priv);
228  } else {
229  amxp_sigmngr_deferred_call(NULL, call->cb, &sig_data, call->caller_priv);
230  }
231 
232  rv = amxd_status_ok;
233 
234 exit:
235  if(call != NULL) {
236  amxd_delete_deferred(&call->it);
237  }
238  amxc_var_clean(&sig_data);
239  return rv;
240 }
amxd_deferred_ctx_t * amxd_find_deferred(uint64_t call_id)
enum _amxd_status amxd_status_t
@ amxd_status_ok
Definition: amxd_types.h:78
static amxd_status_t status

◆ amxd_function_deferred_init()

static CONSTRUCTOR void amxd_function_deferred_init ( void  )
static

Definition at line 257 of file amxd_function_deferred.c.

257  {
258  amxc_llist_init(&deferred);
259 }

Variable Documentation

◆ deferred

amxc_llist_t deferred
static

Definition at line 77 of file amxd_function_deferred.c.

◆ g_call_id

uint64_t g_call_id
static

Definition at line 78 of file amxd_function_deferred.c.