nm_core_interface.h
Go to the documentation of this file.
105void nm_core_gate_connect_async(nm_core_t p_core, nm_gate_t gate, nm_drv_t p_drv, nm_trk_id_t trk_id, const char*url);
118 };
268#define NM_CORE_TAG_MASK_FULL ((nm_core_tag_t){ .tag = NM_TAG_MASK_FULL, .hashcode = NM_CORE_TAG_HASH_FULL })
341void nm_core_req_monitor(struct nm_core*p_core, struct nm_req_s*p_req, struct nm_monitor_s monitor);
345#define NM_EVENT_MATCHING_ANY ((struct nm_core_event_matching_s){ .p_gate = NM_ANY_GATE, .tag = NM_CORE_TAG_NONE, .tag_mask = NM_CORE_TAG_NONE })
347#define NM_MONITOR_NULL ((struct nm_monitor_s){ .p_notifier = NULL, .event_mask = 0, .ref = NULL })
349#define NM_CORE_MONITOR_NULL ((struct nm_core_monitor_s){ .monitor = NM_MONITOR_NULL, .matching = NM_EVENT_MATCHING_ANY })
376 };
535void nm_core_pack_send(struct nm_core*p_core, struct nm_req_s*p_pack, nm_core_tag_t tag, nm_gate_t p_gate, nm_req_flag_t flags);
541void nm_core_pack_set_priority(struct nm_core*p_core, struct nm_req_s*p_pack, nm_prio_t priority);
544static inline void nm_core_pack_set_hlen(struct nm_core*p_core __attribute__((unused)), struct nm_req_s*p_pack, nm_len_t hlen)
549void nm_core_pack_submit_chunks(struct nm_core*p_core, struct nm_req_s*p_pack, int n, const struct nm_chunk_s*p_chunks);
558void nm_core_unpack_data(struct nm_core*p_core, struct nm_req_s*p_unpack, const struct nm_data_s*p_data);
561void nm_core_unpack_match_recv(struct nm_core*p_core, struct nm_req_s*p_unpack, nm_gate_t p_gate, nm_core_tag_t tag, nm_core_tag_t tag_mask);
564void nm_core_unpack_match_event(struct nm_core*p_core, struct nm_req_s*p_unpack, const struct nm_core_event_s*p_event);
567void nm_core_unpack_submit(struct nm_core*p_core, struct nm_req_s*p_unpack, nm_req_flag_t flags);
570int nm_core_unpack_peek(struct nm_core*p_core, struct nm_req_s*p_unpack, const struct nm_data_s*p_data,
602typedef void(*nm_injector_pull_data_t)(struct nm_req_s*p_req, const struct nm_data_s*p_data, nm_len_t chunk_offset, nm_len_t chunk_len, void*p_ref);
606void nm_core_inject_chunk(struct nm_core*p_core, nm_gate_t p_gate, nm_core_tag_t tag, nm_seq_t seq,
611void nm_core_inject_complete(struct nm_core*p_core, struct nm_req_s*p_req, nm_len_t chunk_offset, nm_len_t chunk_len);
617void nm_core_inject_complete_finalize(struct nm_core*p_core, struct nm_req_s*p_req, nm_len_t chunk_offset, nm_len_t chunk_len);
654static inline nm_status_t nm_cond_test_locked(const nm_cond_status_t*p_cond, nm_status_t bitmask);
667static inline void nm_cond_wait_all(void**pp_conds, int n, uintptr_t offset, nm_status_t bitmask, nm_core_t p_core);
687static inline nm_status_t nm_cond_test_locked(const nm_cond_status_t*p_cond, nm_status_t bitmask)
702static inline void nm_cond_wait(nm_cond_status_t*p_cond, nm_status_t bitmask, nm_core_t p_core __attribute__((unused)))
712static inline void nm_cond_wait_all(void**pp_conds, int n, uintptr_t offset, nm_status_t bitmask, nm_core_t p_core __attribute__((unused)))
732static inline nm_status_t nm_cond_test_locked(const nm_cond_status_t*p_cond, nm_status_t bitmask)
760static inline void nm_cond_wait_all(void**pp_conds, int n, uintptr_t offset, nm_status_t bitmask, nm_core_t p_core)
798 if(bitmask & NM_STATUS_FINALIZED) /* status FINALIZED needs strong consistency to avoid use after free */
832 const uintptr_t status_offset = (uintptr_t)&p_req->status - (uintptr_t)p_req; /* offset of 'status' in nm_req_s */
835static inline void nm_status_assert(struct nm_req_s*p_req __attribute__((unused)), nm_status_t value __attribute__((unused)))
1060 NM_FATAL("detected calls from multiple threads in non-threaded mode. Please use pioman-enabled build for multi-threaded use or give thread level using nm_core_set_thread_level(NM_THREAD_SERIALIZED) for serialized thread level.");
1119 NM_FATAL("spinlock is not free in nm_spin_lock(); detected concurrent access from thread = %p. Suspecting multi-threaded use by the application while library is initialized in non-threaded mode.\n",
1272static inline int nm_refcount_count_holder(struct nm_refcount_s*p_refcount, const void*p_holder)
1285static inline void nm_refcount_inc_internal(struct nm_refcount_s*p_refcount, const void*p_holder __attribute__((unused)),
1315static inline int nm_refcount_dec(struct nm_refcount_s*p_refcount, const void*p_holder __attribute__((unused)))
1347static inline void nm_refcount_init(struct nm_refcount_s*p_refcount, char*p_object_id, const void*p_init_holder)
static int nm_atomic_compare_and_swap(int *v, int oldval, int newval)
boolean int compare and swap, atomic only when multithread
Definition nm_core_interface.h:957
static void nm_atomic_always_add(int *v, int v2)
int add, always atomic
Definition nm_core_interface.h:951
static int nm_atomic_dec(int *v)
decrement int, atomic only when multithread
Definition nm_core_interface.h:909
static int nm_atomic_always_dec(int *v)
decrement int, always atomic
Definition nm_core_interface.h:927
static int nm_atomic_inc(int *v)
increment int, atomic only when multithread
Definition nm_core_interface.h:885
static int nm_atomic_always_compare_and_swap(int *v, int oldval, int newval)
boolean int compare and swap, always atomic
Definition nm_core_interface.h:983
static void nm_atomic_add(int *v, int v2)
int add, atomic only when multithread
Definition nm_core_interface.h:933
static int nm_atomic_alway_inc(int *v)
increment int, always atomic
Definition nm_core_interface.h:903
static void nm_cond_init(nm_cond_status_t *p_cond, nm_status_t bitmask)
initialize a nm_cond_status_t object
Definition nm_core_interface.h:718
static nm_status_t nm_cond_test(const nm_cond_status_t *p_cond, nm_status_t bitmask)
test whether the given bit is set in the status; unlocked, weak consistency
Definition nm_core_interface.h:727
static void nm_cond_add(nm_cond_status_t *p_cond, nm_status_t bitmask)
add a bit to the bitmask in the status, do not unlock waiters (for bits that will not be waited for)
Definition nm_core_interface.h:737
static void nm_cond_wait_all(void **pp_conds, int n, uintptr_t offset, nm_status_t bitmask, nm_core_t p_core)
wait on multiple statuses at the same time
Definition nm_core_interface.h:760
static void nm_cond_signal(nm_cond_status_t *p_cond, nm_status_t bitmask)
add a bit and wake up threads waiting for it
Definition nm_core_interface.h:747
static nm_status_t nm_cond_test_locked(const nm_cond_status_t *p_cond, nm_status_t bitmask)
test whether the given bit is set in the status; locked, guaranteed consistency, slower
Definition nm_core_interface.h:732
static void nm_cond_wait(nm_cond_status_t *p_cond, nm_status_t bitmask, nm_core_t p_core)
wait for the given bit to be set in the status; do active polling while waiting
Definition nm_core_interface.h:752
static void nm_cond_mask(nm_cond_status_t *p_cond, nm_status_t bitmask)
Definition nm_core_interface.h:742
static void nm_cond_destroy(nm_cond_status_t *p_cond)
free resources associated with a nm_cond_status_t object
void nm_core_monitor_add(nm_core_t p_core, struct nm_core_monitor_s *m)
Register an event monitor.
void(* nm_core_event_notifier_t)(const struct nm_core_event_s *const event, void *ref)
an event notifier, fired upon status transition
Definition nm_core_interface.h:312
void nm_core_req_monitor(struct nm_core *p_core, struct nm_req_s *p_req, struct nm_monitor_s monitor)
set a per-request monitor.
void nm_core_monitor_remove(nm_core_t p_core, struct nm_core_monitor_s *m)
Unregister an event monitor.
int nm_core_driver_load_init(nm_core_t p_core, puk_component_t driver, nm_trk_kind_t kind, nm_drv_t *pp_drv, const char **p_url)
puk_component_t nm_core_component_load(const char *entity, const char *name)
void nm_core_schedopt_disable(nm_core_t p_core)
disable schedopt for raw driver use
int nm_schedule(nm_core_t p_core)
struct nm_core_internal_s nm_core_internal
int nm_core_exit(nm_core_t p_core)
nm_thread_level_t nm_core_get_thread_level(nm_core_t)
Get the current thread level.
int nm_core_set_strategy(nm_core_t p_core, puk_component_t strategy)
PUK_VECT_TYPE(nm_drv, nm_drv_t)
nm_gate_t nm_core_gate_new(nm_core_t p_core, nm_drv_vect_t *p_drvs)
Init a new gate, using the given set of drivers.
void nm_trace_add_synchro_point(void)
generate a synchronization event to synchronize nmad traces with others (e.g.
void nm_core_set_thread_level(nm_thread_level_t)
Sets the thread level before nm core init.
int nm_core_init(nm_core_t *pp_core)
void nm_core_gate_connect_wait(nm_core_t p_core, struct nm_trk_s *p_trk)
wait for connection completion
void nm_core_gate_connect_async(nm_core_t p_core, nm_gate_t gate, nm_drv_t p_drv, nm_trk_id_t trk_id, const char *url)
start connection process on given gate/trk
int nm_core_unpack_iprobe(struct nm_core *p_core, struct nm_req_s *p_unpack)
probes whether an incoming packet matched this unposted request.
void nm_core_inject_finalize(struct nm_core *p_core, struct nm_req_s *p_req)
finalize an injected request that was only completed.
int nm_core_unpack_cancel(struct nm_core *p_core, struct nm_req_s *p_unpack)
cancel a pending unpack
void nm_core_pack_data(nm_core_t p_core, struct nm_req_s *p_pack, const struct nm_data_s *p_data)
build a pack request from data descriptor
PUK_LIST_DECLARE_TYPE(nm_req_chunk)
void nm_core_unpack_init(struct nm_core *p_core, struct nm_req_s *p_unpack)
initializes an empty unpack request
int nm_core_unpack_peek(struct nm_core *p_core, struct nm_req_s *p_unpack, const struct nm_data_s *p_data, nm_len_t peek_offset, nm_len_t peek_len)
peeks unexpected data without consumming it.
int nm_core_unpack_partition_test(struct nm_req_s *p_unpack, int partition)
void nm_core_inject_chunk(struct nm_core *p_core, nm_gate_t p_gate, nm_core_tag_t tag, nm_seq_t seq, nm_len_t chunk_offset, nm_len_t chunk_len, int is_last_chunk, nm_injector_pull_data_t p_pull_data, void *p_ref)
inject a packet in nmad core as if it arrived from network.
int nm_core_iprobe(struct nm_core *p_core, nm_gate_t p_gate, nm_core_tag_t tag, nm_core_tag_t tag_mask, nm_gate_t *pp_out_gate, nm_core_tag_t *p_out_tag, nm_len_t *p_out_size)
probe unexpected packet, check matching for (packet_tag & tag_mask) == tag
void nm_core_pack_send(struct nm_core *p_core, struct nm_req_s *p_pack, nm_core_tag_t tag, nm_gate_t p_gate, nm_req_flag_t flags)
set tag/gate/flags for pack request
void(* nm_injector_pull_data_t)(struct nm_req_s *p_req, const struct nm_data_s *p_data, nm_len_t chunk_offset, nm_len_t chunk_len, void *p_ref)
user-supplied function called to pull data to posted request through nmad core p_req is the user requ...
Definition nm_core_interface.h:602
void nm_core_unpack_offset(struct nm_core *p_core, struct nm_req_s *p_unpack, nm_len_t offset)
set an offset on data; data before offset will be discarded
void nm_core_unpack_match_recv(struct nm_core *p_core, struct nm_req_s *p_unpack, nm_gate_t p_gate, nm_core_tag_t tag, nm_core_tag_t tag_mask)
match an unpack request with given gate/tag, next sequence number assumed
void nm_core_pack_init(struct nm_core *p_core, struct nm_req_s *p_pack)
initializes an empty pack request
void nm_core_inject_complete_finalize(struct nm_core *p_core, struct nm_req_s *p_req, nm_len_t chunk_offset, nm_len_t chunk_len)
notify data was injected in a matched request and finalize this request.
void nm_core_unpack_partition_set(struct nm_req_s *p_unpack, int n_partitions)
void nm_core_pack_submit(struct nm_core *p_core, struct nm_req_s *p_pack)
post a pack request
void nm_core_inject_complete(struct nm_core *p_core, struct nm_req_s *p_req, nm_len_t chunk_offset, nm_len_t chunk_len)
notify data was injected in a matched request, but do not finalize the request (the status will be NM...
void nm_core_unpack_data(struct nm_core *p_core, struct nm_req_s *p_unpack, const struct nm_data_s *p_data)
build an unpack request from data descriptor
void nm_core_flush(struct nm_core *p_core)
Flush pending packs (if supported by the strategy).
static void nm_core_pack_set_hlen(struct nm_core *p_core __attribute__((unused)), struct nm_req_s *p_pack, nm_len_t hlen)
set a header length for the given pack request
Definition nm_core_interface.h:544
void nm_core_unpack_match_event(struct nm_core *p_core, struct nm_req_s *p_unpack, const struct nm_core_event_s *p_event)
match an unpack request with a packet that triggered an event
void nm_core_unpack_partition_free(struct nm_req_s *p_unpack)
void nm_core_unpack_submit(struct nm_core *p_core, struct nm_req_s *p_unpack, nm_req_flag_t flags)
submit an unpack request
void nm_core_pack_set_priority(struct nm_core *p_core, struct nm_req_s *p_pack, nm_prio_t priority)
set a priority for the given pack request
nm_seq_t nm_core_send_seq_get(struct nm_core *p_core, nm_gate_t p_gate, nm_core_tag_t tag)
get a seq number in the out stream, to route packet outside of nmad core
void nm_core_pack_submit_chunks(struct nm_core *p_core, struct nm_req_s *p_pack, int n, const struct nm_chunk_s *p_chunks)
static nm_session_hash_t nm_core_tag_get_hashcode(nm_core_tag_t core_tag)
Definition nm_core_interface.h:282
uint32_t nm_session_hash_t
a session hashcode in tags, used to multiplex sessions
Definition nm_core_interface.h:254
static nm_core_tag_t nm_core_tag_build(nm_session_hash_t hashcode, nm_tag_t tag)
Definition nm_core_interface.h:271
static nm_tag_t nm_core_tag_get_tag(nm_core_tag_t core_tag)
Definition nm_core_interface.h:278
void nm_core_task_submit_unlocked(struct nm_core *p_core, void(*p_handler)(void))
submit task lock-free to the submission list This is used mostly for benchmarks.
void nm_core_task_submit_locked(struct nm_core *p_core, void(*p_handler)(void))
lock then submit task to pending list This is used mostly for benchmarks.
@ NM_CORE_TASK_COMPLETED_PREFETCH
prefetch completed; process RTR if received
Definition nm_core_interface.h:371
@ NM_CORE_TASK_UNPACK_NEXT
try to match the next unpack on the given gate/tag/gtag
Definition nm_core_interface.h:369
@ NM_CORE_TASK_RTR_SEND
send a RTR once the large pw for recv has been posted
Definition nm_core_interface.h:374
@ NM_CORE_TASK_NOP
a core task that does nothing (but is not invalid nor uninitialized)
Definition nm_core_interface.h:368
@ NM_CORE_TASK_CANCELLED_PREFETCH
prefetch cancelled; release ref on pw
Definition nm_core_interface.h:372
@ NM_CORE_TASK_HANDLER
call a user handler, mainly for testing/benchmarking
Definition nm_core_interface.h:375
static void nm_spin_check_nothread(nm_spinlock_t *p_spin __attribute__((unused)))
check that we are always called from the same thread in case of non-threaded mode
Definition nm_core_interface.h:1046
static void nm_spin_assert_notlocked(nm_spinlock_t *p_spin)
assert that current thread doesn't hold the lock
static int nm_spin_trylock(nm_spinlock_t *p_spin)
try to lock the spin lock return 1 if lock is successfully acquired, 0 otherwise
static void nm_spin_clear_nothread(nm_spinlock_t *p_spin __attribute__((unused)))
clear the last_tid tracking for lock consistency checking
Definition nm_core_interface.h:1067
static void nm_spin_assert_locked(nm_spinlock_t *p_spin)
assert that current thread holds the lock
static void nm_status_signal(struct nm_req_s *p_req, nm_status_t bitmask)
add the bits from bitmak to the status and wakes-up all others waiting on nm_status_wait().
Definition nm_core_interface.h:823
static void nm_status_wait_all(void **pp_reqs, int n, uintptr_t offset, nm_status_t bitmask, nm_core_t p_core)
wait for all reqs, any bit in bitmask
Definition nm_core_interface.h:828
static void nm_status_unset(struct nm_req_s *p_req, nm_status_t bitmask)
remove bits of bitmask from req status
Definition nm_core_interface.h:809
static void nm_status_spinwait(struct nm_req_s *p_req, nm_status_t status)
Definition nm_core_interface.h:840
static void nm_status_init(struct nm_req_s *p_req, nm_status_t bitmask)
initialize cond status with given initial value
Definition nm_core_interface.h:787
static int nm_status_test_allbits(struct nm_req_s *p_req, nm_status_t bitmask)
tests for all given bits in status
Definition nm_core_interface.h:846
static void nm_status_destroy(struct nm_req_s *p_req)
Definition nm_core_interface.h:791
static void nm_status_add(struct nm_req_s *p_req, nm_status_t bitmask)
add a bit to the status of the request; does not unlock others (no signal)
Definition nm_core_interface.h:804
static void nm_status_wait(struct nm_req_s *p_req, nm_status_t bitmask, nm_core_t p_core)
wait for any bit matching in req status
Definition nm_core_interface.h:814
static nm_status_t nm_status_test(const struct nm_req_s *p_req, nm_status_t bitmask)
query for given bits in req status; returns matched bits
Definition nm_core_interface.h:796
static void nm_status_assert(struct nm_req_s *p_req __attribute__((unused)), nm_status_t value __attribute__((unused)))
Definition nm_core_interface.h:835
nm_status_t nm_cond_status_t
status with synchronization (wait/signal)
Definition nm_core_interface.h:155
without even the implied warranty of !MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE See the GNU !General Public License for more details !mpif h
Definition mpif.h:19
static void nm_refcount_inc_internal(struct nm_refcount_s *p_refcount, const void *p_holder __attribute__((unused)), const char *func __attribute__((unused)), const char *file __attribute__((unused)), const int line __attribute__((unused)))
Definition nm_core_interface.h:1285
static void nm_refcount_init(struct nm_refcount_s *p_refcount, char *p_object_id, const void *p_init_holder)
initialize a new refcount object; get the object ID to make debugging easier; we take ownership of ob...
Definition nm_core_interface.h:1347
PUK_LIST_TYPE(nm_refcount_holder, const void *p_holder;const char *func;const char *file;int line;)
elements for nm_refcount_s; a holder in the refcount
static void nm_refcount_dump(struct nm_refcount_s *p_refcount __attribute__((unused)))
Definition nm_core_interface.h:1230
static void nm_refcount_destroy(struct nm_refcount_s *p_refcount __attribute__((unused)))
Definition nm_core_interface.h:1242
static int nm_refcount_dec(struct nm_refcount_s *p_refcount, const void *p_holder __attribute__((unused)))
decrement refcount for holder; returns refcount (if 0, caller may free ref-counted resource)
Definition nm_core_interface.h:1315
static int nm_refcount_get(struct nm_refcount_s *p_refcount)
Definition nm_core_interface.h:1252
assert(p_data->ops.p_traversal !=NULL)
Basic primitives to display info & warnings.
This is the common public header for NewMad.
uint8_t nm_proto_t
protocol flags- not part of the public API, but needed for inline
Definition nm_types.h:99
enum nm_trk_kind_e nm_trk_kind_t
Definition nm_core_interface.h:460
nm_core_tag_t tag_mask
the mask to apply before comparing tags (only bits set in mask will be checked)
Definition nm_core_interface.h:319
struct nm_req_s * p_req
the request that matched the event- NULL in case of unexpected packets
Definition nm_core_interface.h:308
exposed here for inlining; do not use this value, use the accessor nm_core_get_singleton()
Definition nm_core_interface.h:75
struct nm_monitor_s monitor
the monitor to fire upon matching event
Definition nm_core_interface.h:333
struct nm_core_event_matching_s matching
packet matching information
Definition nm_core_interface.h:334
struct nm_core_task_s::@7::@13 rtr_send
struct nm_core_task_s::@7::@9 completed_pw
struct nm_core_task_s::@7::@11 cancelled_prefetch
struct nm_core_task_s::@7::@14 handler
struct nm_core_task_s::@7::@12 pack_submission
union nm_core_task_s::@7 content
struct nm_core_task_s::@7::@8 unpack_next
struct nm_core_task_s::@7::@10 completed_prefetch
a data descriptor, used to pack/unpack data from app layout to/from contiguous buffers
Definition nm_data.h:199
const struct nm_minidriver_iface_s * driver
Driver interface, for use when no instance is needed.
Definition nm_drv.h:46
containers for matching info, used for caching
Definition nm_core_interface.h:381
struct nm_matching_gsession_s * p_gsession
cache of matching gsession
Definition nm_core_interface.h:384
struct nm_matching_wildcard_s * p_wildcard
cache of matching wildcard
Definition nm_core_interface.h:383
Definition nm_gate.h:52
struct to store matching info for any-source requests of a given tag
Definition nm_tags.h:146
struct to store matching info for wildcard requests, one per session
Definition nm_tags.h:126
generic monitor, used for requests and for global events (with matching)
Definition nm_core_interface.h:324
nm_status_t event_mask
mask applied to status to check whether to fire events
Definition nm_core_interface.h:326
nm_core_event_notifier_t p_notifier
notification function called to fire events
Definition nm_core_interface.h:325
a reference-counter that keeps trace of who increments/decrements in debug: full reference tracking i...
Definition nm_core_interface.h:1221
PUK_LIST_LINK(nm_req_chunk)
nm_len_t chunk_offset
offset of the chunk relative to the full data in the req
Definition nm_core_interface.h:474
struct nm_data_properties_s chunk_props
properties of the data chunk
Definition nm_core_interface.h:476
struct nm_req_s * p_req
link to insert the req chunk as a core task
Definition nm_core_interface.h:472
nm_core_tag_t tag
tag to send to/from (works in combination with tag_mask for recv)
Definition nm_core_interface.h:490
struct nm_req_s::@15::@18 unpack
struct nm_req_s::@15::@17 pack
nm_len_t expected_len
length of posted recv (may be updated if matched packet is shorter)
Definition nm_core_interface.h:506
struct nm_matching_container_s matching
link to store request in a matching map
Definition nm_core_interface.h:511
uint32_t checksum
data checkusm when pack was submitted- for debug only
Definition nm_core_interface.h:502
struct nm_gtag_s * p_gtag
cache for tag status on gate; NULL if tag or gate is unspecified yet
Definition nm_core_interface.h:492
struct nm_req_s::@15::@18::@19::nm_req_pchunk_s * p_pchunks
unsorted list of arrived chunks; reads are lock-free, writes are within core_core_lock sections
nm_cond_status_t status
status, including status bits and synchronization
Definition nm_core_interface.h:485
nm_req_seq_t req_seq
request sequence number used to interleave wildcard/non-wildcard requests
Definition nm_core_interface.h:509
struct nm_req_chunk_s req_chunk
preallocated chunk for the common case (single-chunk)
Definition nm_core_interface.h:525
struct nm_pkt_wrap_s * p_prefetch_pw
packet wrapper to prefetch recv
Definition nm_core_interface.h:522
nm_core_tag_t tag_mask
mask applied to tag for matching (only bits in mask need to match)
Definition nm_core_interface.h:510
struct nm_req_s::@15::@18::@19 partition
partitioned unpack, used only if NM_REQ_FLAG_UNPACK_PARTITIONED is set
struct nm_monitor_s monitor
monitor attached to this request (only 1)
Definition nm_core_interface.h:487
Definition nm_core_interface.h:1012
Definition nm_data.h:530