blob: 9e8f8eee759723f399405f23bf1458eecbe1651d [file] [log] [blame]
/*****************************************************************************\
* 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 */