|  | /*****************************************************************************\ | 
|  | *  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 */ |