- u_async.c: process immediate_queue BEFORE epoll_wait in uasync_poll - stcp_link.c: defensive NULL etcp_conn/etcp_link in stcp_link_close - utun_instance.c: move stcp_server_list_destroy_all to Phase J (before ETCP), add deferred drain in both Phase J and L - stcp.h/c: STCP_HS_ENC_CLIENT 6→38, STCP_HS_ENC_SERVER 7→39, exchange ed25519_pubkey in both handshake directions - etcp_connections.c: copy peer_ed25519 from STCP to ETCP_CONN in etcp_link_enter_ready_tcp; guard link->etcp in tcp_link_close_cb - chat_sync.c: fix lk->conn NULL dereference for TCP links - test_stcp.c: update stcp_server_create/stcp_client_connect callsites - tools/chat_tcp_test: change transport udp→tcp
107 lines
3.1 KiB
C
107 lines
3.1 KiB
C
// timeout_heap.h
|
|
|
|
#ifndef TIMEOUT_HEAP_H
|
|
#define TIMEOUT_HEAP_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#include <stdint.h> // For uint64_t
|
|
#include <stddef.h> // For size_t
|
|
|
|
typedef uint64_t TimeoutTime; // e.g., milliseconds since epoch or from now
|
|
|
|
typedef struct {
|
|
TimeoutTime expiration; // Sort key (smaller = earlier)
|
|
void *data; // User data (e.g., callback or ID)
|
|
size_t *index_ptr; // Pointer to node's heap_index (NULL = no tracking)
|
|
int deleted; // 0 = active, 1 = deleted
|
|
} TimeoutEntry;
|
|
|
|
typedef struct TimeoutHeap TimeoutHeap;
|
|
|
|
struct TimeoutHeap {
|
|
TimeoutEntry *heap; // Dynamic array
|
|
size_t size; // Current number of elements
|
|
size_t capacity; // Allocated size
|
|
size_t freed_count; // Number of freed timer nodes
|
|
void* user_data; // User data for free callback
|
|
void (*free_callback)(void* user_data, void* data); // Callback to free data
|
|
};
|
|
|
|
/**
|
|
* Create a new timeout heap with initial capacity.
|
|
* @param initial_capacity Starting capacity (will grow as needed).
|
|
* @return Pointer to the heap, or NULL on failure.
|
|
*/
|
|
TimeoutHeap *timeout_heap_create(size_t initial_capacity);
|
|
|
|
/**
|
|
* Destroy the timeout heap and free resources.
|
|
* @param h The heap to destroy.
|
|
*/
|
|
void timeout_heap_destroy(TimeoutHeap *h);
|
|
|
|
/**
|
|
* Set a callback function to free data when deleted nodes are removed.
|
|
* @param h The heap.
|
|
* @param user_data User data passed to callback.
|
|
* @param callback Callback function (if NULL, data is freed with free()).
|
|
*/
|
|
void timeout_heap_set_free_callback(TimeoutHeap *h, void* user_data, void (*callback)(void* user_data, void* data));
|
|
|
|
/**
|
|
* Insert a new timeout into the heap.
|
|
* @param h The heap.
|
|
* @param expiration The expiration time.
|
|
* @param data User data associated with the timeout.
|
|
* @return 0 on success, -1 on allocation failure.
|
|
*/
|
|
int timeout_heap_push(TimeoutHeap *h, TimeoutTime expiration, void *data, size_t *index_ptr);
|
|
|
|
/**
|
|
* Peek at the earliest non-deleted timeout without removing it.
|
|
* @param h The heap.
|
|
* @param out Where to store the entry.
|
|
* @return 0 on success, -1 if empty.
|
|
*/
|
|
int timeout_heap_peek(TimeoutHeap *h, TimeoutEntry *out);
|
|
|
|
/**
|
|
* Pop the earliest non-deleted timeout from the heap.
|
|
* @param h The heap.
|
|
* @param out Where to store the entry.
|
|
* @return 0 on success, -1 if empty.
|
|
*/
|
|
int timeout_heap_pop(TimeoutHeap *h, TimeoutEntry *out);
|
|
|
|
/**
|
|
* Cancel a timeout by matching expiration and data.
|
|
* Scans the heap linearly, so O(n) time.
|
|
* Assumes combinations are unique; cancels the first match.
|
|
* @param h The heap.
|
|
* @param expiration The expiration time to match.
|
|
* @param data The data to match.
|
|
* @return 0 if found and canceled, -1 if not found.
|
|
*/
|
|
int timeout_heap_cancel(TimeoutHeap *h, TimeoutTime expiration, void *data);
|
|
|
|
int timeout_heap_cancel_at(TimeoutHeap *h, size_t index, void *data);
|
|
|
|
/**
|
|
* Get the number of freed timer nodes.
|
|
* @param h The heap.
|
|
* @return Count of freed timer nodes.
|
|
*/
|
|
size_t timeout_heap_get_freed_count(TimeoutHeap *h);
|
|
|
|
size_t timeout_heap_get_size(TimeoutHeap *h);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif // TIMEOUT_HEAP_H
|