GNUnet  0.20.0
op.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2016 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
28 #include "platform.h"
29 #include <inttypes.h>
30 
31 
32 #include "gnunet_util_lib.h"
33 
34 #define LOG(kind, ...) GNUNET_log_from (kind, "util-op", __VA_ARGS__)
35 
37 {
40 
44  uint64_t op_id;
45 
50 
54  void *cls;
55 
59  void *ctx;
60 };
61 
62 
68 {
73 
78 
82  uint64_t last_op_id;
83 };
84 
85 
89 struct GNUNET_OP_Handle *
91 {
92  return GNUNET_new (struct GNUNET_OP_Handle);
93 }
94 
95 
99 void
101 {
102  GNUNET_free (h);
103 }
104 
105 
114 uint64_t
116 {
117  return ++h->last_op_id;
118 }
119 
120 
131 static struct OperationListItem *
133  uint64_t op_id)
134 {
135  struct OperationListItem *op;
136 
137  for (op = h->op_head; NULL != op; op = op->next)
138  if (op->op_id == op_id)
139  return op;
140  return NULL;
141 }
142 
143 
161 int
163  uint64_t op_id,
165  void **cls,
166  void **ctx)
167 {
168  struct OperationListItem *op = op_find (h, op_id);
169 
170  if (NULL != op)
171  {
172  if (NULL != result_cb)
173  *result_cb = op->result_cb;
174  if (NULL != cls)
175  *cls = op->cls;
176  if (NULL != ctx)
177  *ctx = op->ctx;
178  return GNUNET_YES;
179  }
180  return GNUNET_NO;
181 }
182 
183 
198 uint64_t
201  void *cls,
202  void *ctx)
203 {
204  struct OperationListItem *op;
205 
206  op = GNUNET_new (struct OperationListItem);
207  op->op_id = GNUNET_OP_get_next_id (h);
208  op->result_cb = result_cb;
209  op->cls = cls;
210  op->ctx = ctx;
212  h->op_tail,
213  op);
215  "%p Added operation #%" PRIu64 "\n",
216  h, op->op_id);
217  return op->op_id;
218 }
219 
220 
245 static int
247  uint64_t op_id,
248  int64_t result_code,
249  const void *data,
250  uint16_t data_size,
251  void **ctx,
252  uint8_t cancel)
253 {
254  if (0 == op_id)
255  return GNUNET_NO;
256 
257  struct OperationListItem *op = op_find (h, op_id);
258  if (NULL == op)
259  {
261  "Could not find operation #%" PRIu64 "\n", op_id);
262  return GNUNET_NO;
263  }
264 
265  if (NULL != ctx)
266  *ctx = op->ctx;
267 
268  GNUNET_CONTAINER_DLL_remove (h->op_head,
269  h->op_tail,
270  op);
271 
272  if ((GNUNET_YES != cancel) &&
273  (NULL != op->result_cb))
274  op->result_cb (op->cls,
275  result_code, data,
276  data_size);
277  GNUNET_free (op);
278  return GNUNET_YES;
279 }
280 
281 
301 int
303  uint64_t op_id,
304  int64_t result_code,
305  const void *data,
306  uint16_t data_size,
307  void **ctx)
308 {
310  "%p Received result for operation #%" PRIu64 ": %" PRId64 " (size: %u)\n",
311  h, op_id, result_code, data_size);
312  return op_result (h, op_id, result_code, data, data_size, ctx, GNUNET_NO);
313 }
314 
315 
327 int
329  uint64_t op_id)
330 {
332  "%p Cancelling operation #%" PRIu64 "\n",
333  h, op_id);
334  return op_result (h, op_id, 0, NULL, 0, NULL, GNUNET_YES);
335 }
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:144
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
uint32_t data
The data value.
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
uint64_t GNUNET_OP_get_next_id(struct GNUNET_OP_Handle *h)
Get a unique operation ID to distinguish between asynchronous requests.
Definition: op.c:115
int GNUNET_OP_result(struct GNUNET_OP_Handle *h, uint64_t op_id, int64_t result_code, const void *data, uint16_t data_size, void **ctx)
Call the result callback of an operation and remove it.
Definition: op.c:302
void(* GNUNET_ResultCallback)(void *cls, int64_t result_code, const void *data, uint16_t data_size)
Function called with the result of an asynchronous operation.
int GNUNET_OP_get(struct GNUNET_OP_Handle *h, uint64_t op_id, GNUNET_ResultCallback *result_cb, void **cls, void **ctx)
Find operation by ID.
Definition: op.c:162
int GNUNET_OP_remove(struct GNUNET_OP_Handle *h, uint64_t op_id)
Remove / cancel an operation.
Definition: op.c:328
struct GNUNET_OP_Handle * GNUNET_OP_create()
Create new operations handle.
Definition: op.c:90
void GNUNET_OP_destroy(struct GNUNET_OP_Handle *h)
Destroy operations handle.
Definition: op.c:100
uint64_t GNUNET_OP_add(struct GNUNET_OP_Handle *h, GNUNET_ResultCallback result_cb, void *cls, void *ctx)
Add a new operation.
Definition: op.c:199
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
static int op_result(struct GNUNET_OP_Handle *h, uint64_t op_id, int64_t result_code, const void *data, uint16_t data_size, void **ctx, uint8_t cancel)
Remove an operation, and call its result callback (unless it was cancelled).
Definition: op.c:246
#define LOG(kind,...)
Definition: op.c:34
static struct OperationListItem * op_find(struct GNUNET_OP_Handle *h, uint64_t op_id)
Find operation by ID.
Definition: op.c:132
struct GNUNET_ARM_Operation * next
This is a doubly-linked list.
Definition: arm_api.c:45
Operations handle.
Definition: op.c:68
struct OperationListItem * op_tail
Last operation in the linked list.
Definition: op.c:77
struct OperationListItem * op_head
First operation in the linked list.
Definition: op.c:72
uint64_t last_op_id
Last operation ID used.
Definition: op.c:82
void * ctx
User context.
Definition: op.c:59
void * cls
Closure for result_cb.
Definition: op.c:54
struct OperationListItem * next
Definition: op.c:39
struct OperationListItem * prev
Definition: op.c:38
uint64_t op_id
Operation ID.
Definition: op.c:44
GNUNET_ResultCallback result_cb
Continuation to invoke with the result of an operation.
Definition: op.c:49