src/ucx/map.c

Wed, 05 Jun 2024 19:50:44 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 05 Jun 2024 19:50:44 +0200
changeset 537
ad44e72fbf50
parent 504
c094afcdfb27
permissions
-rw-r--r--

add extra nullptr check in the event loop to handle the case when the finish ptr is set to NULL after it was already scheduled

504
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved.
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "cx/map.h"
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <string.h>
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 // <editor-fold desc="empty map implementation">
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 static void cx_empty_map_noop(__attribute__((__unused__)) CxMap *map) {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 // this is a noop, but MUST be implemented
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 }
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 static void *cx_empty_map_get(
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 __attribute__((__unused__)) CxMap const *map,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 __attribute__((__unused__)) CxHashKey key
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 ) {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 return NULL;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 }
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 static bool cx_empty_map_iter_valid(__attribute__((__unused__)) void const *iter) {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 return false;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 }
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 static CxIterator cx_empty_map_iterator(
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 struct cx_map_s const *map,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 __attribute__((__unused__)) enum cx_map_iterator_type type
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 ) {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 CxIterator iter = {0};
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 iter.src_handle = map;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 iter.base.valid = cx_empty_map_iter_valid;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 return iter;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 }
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 static struct cx_map_class_s cx_empty_map_class = {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 cx_empty_map_noop,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 cx_empty_map_noop,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 NULL,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 cx_empty_map_get,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 NULL,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 cx_empty_map_iterator
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 };
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 CxMap cx_empty_map = {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 NULL,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 NULL,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 0,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 0,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 NULL,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 NULL,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 NULL,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 false,
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 &cx_empty_map_class
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 };
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 CxMap *const cxEmptyMap = &cx_empty_map;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 // </editor-fold>
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 CxMutIterator cxMapMutIteratorValues(CxMap *map) {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_VALUES);
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 it.base.mutating = true;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 // we know the iterators share the same memory layout
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 CxMutIterator iter;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 memcpy(&iter, &it, sizeof(CxMutIterator));
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 return iter;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 }
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 CxMutIterator cxMapMutIteratorKeys(CxMap *map) {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_KEYS);
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 it.base.mutating = true;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 // we know the iterators share the same memory layout
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 CxMutIterator iter;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 memcpy(&iter, &it, sizeof(CxMutIterator));
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 return iter;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 }
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 CxMutIterator cxMapMutIterator(CxMap *map) {
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS);
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 it.base.mutating = true;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 // we know the iterators share the same memory layout
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 CxMutIterator iter;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 memcpy(&iter, &it, sizeof(CxMutIterator));
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 return iter;
c094afcdfb27 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 }

mercurial