mirror of https://github.com/openssl/openssl.git
				
				
				
			
		
			
				
	
	
		
			164 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
 | |
|  *
 | |
|  * Licensed under the Apache License 2.0 (the "License").  You may not use
 | |
|  * this file except in compliance with the License.  You can obtain a copy
 | |
|  * in the file LICENSE in the source distribution or at
 | |
|  * https://www.openssl.org/source/license.html
 | |
|  */
 | |
| 
 | |
| #ifndef OSSL_INTERNAL_EVENT_QUEUE_H
 | |
| # define OSSL_INTERNAL_EVENT_QUEUE_H
 | |
| # pragma once
 | |
| 
 | |
| # include "internal/priority_queue.h"
 | |
| # include "internal/time.h"
 | |
| 
 | |
| /*
 | |
|  * Opaque type holding an event.
 | |
|  */
 | |
| typedef struct ossl_event_st OSSL_EVENT;
 | |
| 
 | |
| DEFINE_PRIORITY_QUEUE_OF(OSSL_EVENT);
 | |
| 
 | |
| /*
 | |
|  * Public type representing an event queue, the underlying structure being
 | |
|  * opaque.
 | |
|  */
 | |
| typedef struct ossl_event_queue_st OSSL_EVENT_QUEUE;
 | |
| 
 | |
| /*
 | |
|  * Public type representing a event queue entry.
 | |
|  * It is (internally) public so that it can be embedded into other structures,
 | |
|  * it should otherwise be treated as opaque.
 | |
|  */
 | |
| struct ossl_event_st {
 | |
|     uint32_t type;              /* What type of event this is               */
 | |
|     uint32_t priority;          /* What priority this event has             */
 | |
|     OSSL_TIME when;             /* When the event is scheduled to happen    */
 | |
|     void *ctx;                  /* User argument passed to call backs       */
 | |
|     void *payload;              /* Event specific data of unknown kind      */
 | |
|     size_t payload_size;        /* Length (in bytes) of event specific data */
 | |
| 
 | |
|     /* These fields are for internal use only */
 | |
|     PRIORITY_QUEUE_OF(OSSL_EVENT) *queue;    /* Queue containing this event */
 | |
|     size_t ref;                 /* ID for this event                        */
 | |
|     unsigned int flag_dynamic : 1;  /* Malloced or not?                     */
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Utility function to populate an event structure and add it to the queue
 | |
|  */
 | |
| int ossl_event_queue_add(OSSL_EVENT_QUEUE *queue, OSSL_EVENT *event,
 | |
|                          uint32_t type, uint32_t priority,
 | |
|                          OSSL_TIME when, void *ctx,
 | |
|                          void *payload, size_t payload_size);
 | |
| 
 | |
| /*
 | |
|  * Utility functions to extract event fields
 | |
|  */
 | |
| static ossl_unused ossl_inline
 | |
| uint32_t ossl_event_get_type(const OSSL_EVENT *event)
 | |
| {
 | |
|     return event->type;
 | |
| }
 | |
| 
 | |
| static ossl_unused ossl_inline
 | |
| uint32_t ossl_event_get_priority(const OSSL_EVENT *event)
 | |
| {
 | |
|     return event->priority;
 | |
| }
 | |
| 
 | |
| static ossl_unused ossl_inline
 | |
| OSSL_TIME ossl_event_get_when(const OSSL_EVENT *event)
 | |
| {
 | |
|     return event->when;
 | |
| }
 | |
| 
 | |
| static ossl_unused ossl_inline
 | |
| void *ossl_event_get0_ctx(const OSSL_EVENT *event)
 | |
| {
 | |
|     return event->ctx;
 | |
| }
 | |
| 
 | |
| static ossl_unused ossl_inline
 | |
| void *ossl_event_get0_payload(const OSSL_EVENT *event, size_t *length)
 | |
| {
 | |
|     if (length != NULL)
 | |
|         *length = event->payload_size;
 | |
|     return event->payload;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Create and free a queue.
 | |
|  */
 | |
| OSSL_EVENT_QUEUE *ossl_event_queue_new(void);
 | |
| void ossl_event_queue_free(OSSL_EVENT_QUEUE *queue);
 | |
| 
 | |
| /*
 | |
|  * Schedule a new event into an event queue.
 | |
|  *
 | |
|  * The event parameters are taken from the function arguments.
 | |
|  *
 | |
|  * The function returns NULL on failure and the added event on success.
 | |
|  */
 | |
| OSSL_EVENT *ossl_event_queue_add_new(OSSL_EVENT_QUEUE *queue,
 | |
|                                      uint32_t type, uint32_t priority,
 | |
|                                      OSSL_TIME when, void *ctx,
 | |
|                                      void *payload, size_t payload_size)
 | |
| ;
 | |
| 
 | |
| /*
 | |
|  * Schedule an event into an event queue.
 | |
|  *
 | |
|  * The event parameters are taken from the function arguments.
 | |
|  *
 | |
|  * The function returns 0 on failure and 1 on success.
 | |
|  */
 | |
| int ossl_event_queue_add(OSSL_EVENT_QUEUE *queue, OSSL_EVENT *event,
 | |
|                          uint32_t type, uint32_t priority,
 | |
|                          OSSL_TIME when, void *ctx,
 | |
|                          void *payload, size_t payload_size);
 | |
| 
 | |
| /*
 | |
|  * Delete an event from the queue.
 | |
|  * This will cause the early deletion function to be called if it is non-NULL.
 | |
|  * A pointer to the event structure is returned.
 | |
|  */
 | |
| int ossl_event_queue_remove(OSSL_EVENT_QUEUE *queue, OSSL_EVENT *event);
 | |
| 
 | |
| /*
 | |
|  * Free a dynamic event.
 | |
|  * Is a NOP for a static event.
 | |
|  */
 | |
| void ossl_event_free(OSSL_EVENT *event);
 | |
| 
 | |
| /*
 | |
|  * Return the time until the next event for the specified event, if the event's
 | |
|  * time is past, zero is returned.  Once activated, the event reference becomes
 | |
|  * invalid and this function becomes undefined.
 | |
|  */
 | |
| OSSL_TIME ossl_event_time_until(const OSSL_EVENT *event);
 | |
| 
 | |
| /*
 | |
|  * Return the time until the next event in the queue.
 | |
|  * If the next event is in the past, zero is returned.
 | |
|  */
 | |
| OSSL_TIME ossl_event_queue_time_until_next(const OSSL_EVENT_QUEUE *queue);
 | |
| 
 | |
| /*
 | |
|  * Postpone an event to trigger at the specified time.
 | |
|  * If the event has triggered, this function's behaviour is undefined.
 | |
|  */
 | |
| int ossl_event_queue_postpone_until(OSSL_EVENT_QUEUE *queue,
 | |
|                                     OSSL_EVENT *event,
 | |
|                                     OSSL_TIME when);
 | |
| 
 | |
| /*
 | |
|  * Return the next event to process.
 | |
|  */
 | |
| int ossl_event_queue_get1_next_event(OSSL_EVENT_QUEUE *queue,
 | |
|                                      OSSL_EVENT **event);
 | |
| 
 | |
| #endif
 |