| /*****************************************************************************\ | 
 |  *  src/common/eio.h Event-based I/O for slurm | 
 |  ***************************************************************************** | 
 |  *  Copyright (C) 2002 The Regents of the University of California. | 
 |  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). | 
 |  *  Written by Mark Grondona <mgrondona@llnl.gov>. | 
 |  *  CODE-OCEC-09-009. All rights reserved. | 
 |  * | 
 |  *  This file is part of Slurm, a resource management program. | 
 |  *  For details, see <https://slurm.schedmd.com/>. | 
 |  *  Please also read the included file: DISCLAIMER. | 
 |  * | 
 |  *  Slurm is free software; you can redistribute it and/or modify it under | 
 |  *  the terms of the GNU General Public License as published by the Free | 
 |  *  Software Foundation; either version 2 of the License, or (at your option) | 
 |  *  any later version. | 
 |  * | 
 |  *  Slurm is distributed in the hope that it will be useful, but WITHOUT ANY | 
 |  *  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | 
 |  *  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more | 
 |  *  details. | 
 |  * | 
 |  *  You should have received a copy of the GNU General Public License along | 
 |  *  with Slurm; if not, write to the Free Software Foundation, Inc., | 
 |  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA. | 
 | \*****************************************************************************/ | 
 |  | 
 | #ifndef _EIO_H | 
 | #define _EIO_H 1 | 
 |  | 
 | #include "src/common/list.h" | 
 | #include "src/common/macros.h" | 
 | #include "src/common/slurm_protocol_defs.h" | 
 | typedef struct eio_obj eio_obj_t; | 
 |  | 
 | typedef struct eio_handle_components eio_handle_t; | 
 |  | 
 | /* Possible I/O operations on an I/O object | 
 |  * Each takes the io_obj being operated on as an argument | 
 |  * | 
 |  * handle_*() functions also pass the list of io_obj's from the event loop | 
 |  * | 
 |  * If either "handle_error" (for POLLERR and POLLNVAL) or "handle_close" | 
 |  * (for POLLHUP) are not defined, the eio server will fallback to handle_read | 
 |  * if defined, and fallback to handle_write if handle_read is not defined | 
 |  * either. | 
 |  * | 
 |  * If there are no handlers at all when POLLERR or POLLNVAL occurs, the eio | 
 |  * server will set the eio_obj_t shutdown flag to "true".  Keep in mind | 
 |  * that the shutdown flag is essentially just an advisory flag.  The | 
 |  * "readable" and "writable" functions have the final say over whether a | 
 |  * file descriptor will continue to be polled. | 
 |  */ | 
 | struct io_operations { | 
 | 	bool (*readable    )(eio_obj_t *); | 
 | 	bool (*writable    )(eio_obj_t *); | 
 | 	void (*handle_msg  )(void *arg, slurm_msg_t *msg); | 
 | 	int  (*handle_read )(eio_obj_t *, list_t *); | 
 | 	int  (*handle_write)(eio_obj_t *, list_t *); | 
 | 	int  (*handle_error)(eio_obj_t *, list_t *); | 
 | 	int  (*handle_close)(eio_obj_t *, list_t *); | 
 | 	int  (*handle_cleanup)(eio_obj_t *, list_t *, list_t *); | 
 | 	int  timeout; | 
 | }; | 
 |  | 
 | struct eio_obj { | 
 | 	int fd;                           /* fd to operate on                */ | 
 | 	void *conn; | 
 | 	uint32_t data_on_conn; | 
 | 	void *arg;                        /* application-specific data       */ | 
 | 	struct io_operations *ops;        /* pointer to ops struct for obj   */ | 
 | 	bool shutdown; | 
 | 	time_t close_time; /* time we marked this to be closed */ | 
 | }; | 
 |  | 
 | eio_handle_t *eio_handle_create(uint16_t); | 
 | void eio_handle_destroy(eio_handle_t *eio); | 
 |  | 
 | /* | 
 |  * Add an eio_obj_t "obj" to an eio_handle_t "eio"'s internal object list. | 
 |  * | 
 |  * This function can only be used to initialize "eio"'s list before | 
 |  * calling eio_handle_mainloop.  If it is used after the eio engine's | 
 |  * mainloop has started, segfaults are likely. | 
 |  */ | 
 | void eio_new_initial_obj(eio_handle_t *eio, eio_obj_t *obj); | 
 |  | 
 | /* | 
 |  * Queue an eio_obj_t "obj" for inclusion in an already running | 
 |  * eio_handle_t "eio"'s internal object list. | 
 |  */ | 
 | void eio_new_obj(eio_handle_t *eio, eio_obj_t *obj); | 
 |  | 
 | /* | 
 |  * DeQueue an eio_obj_t "obj" from the running | 
 |  * eio_handle_t eio's internal object list "objs". | 
 |  * Supposed to be called from read/write handlers | 
 |  * (have "objs" as one of their arguments). | 
 |  */ | 
 | bool eio_remove_obj(eio_obj_t *obj, list_t *objs); | 
 |  | 
 |  | 
 | /* | 
 |  * This routine will watch for activity on the fd's as long | 
 |  * as obj->readable() or obj->writable() returns >0 | 
 |  * | 
 |  * routine returns 0 when either list is empty or no objects in list are | 
 |  * readable() or writable(). | 
 |  * | 
 |  * returns -1 on error. | 
 |  */ | 
 | int eio_handle_mainloop(eio_handle_t *eio); | 
 |  | 
 | bool eio_message_socket_readable(eio_obj_t *obj); | 
 | int eio_message_socket_accept(eio_obj_t *obj, list_t *objs); | 
 |  | 
 | int eio_signal_wakeup(eio_handle_t *eio); | 
 | int eio_signal_shutdown(eio_handle_t *eio); | 
 |  | 
 | eio_obj_t *eio_obj_create(int fd, struct io_operations *ops, void *arg); | 
 | void eio_obj_destroy(void *arg); | 
 |  | 
 | #endif /* !_EIO_H */ |