summaryrefslogtreecommitdiffstats
path: root/src/H5FPprivate.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5FPprivate.h')
-rw-r--r--src/H5FPprivate.h201
1 files changed, 201 insertions, 0 deletions
diff --git a/src/H5FPprivate.h b/src/H5FPprivate.h
new file mode 100644
index 0000000..c5e5f00
--- /dev/null
+++ b/src/H5FPprivate.h
@@ -0,0 +1,201 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#ifndef H5FPPRIVATE_H__
+#define H5FPPRIVATE_H__ 0
+
+#include "H5FPpublic.h" /* Flexible Parallel HDF5 */
+#include "H5Rprivate.h" /* References */
+
+#ifndef TRUE
+#define TRUE 1
+#endif /* !TRUE */
+
+#ifndef FALSE
+#define FALSE 0
+#endif /* !FALSE */
+
+#define H5FP_BYTE_BITS 8
+
+/* Different types of requests */
+
+/*
+ * The H5FP_REQ_LOCK_END and H5FP_REQ_RELEASE_END are used to lock and
+ * release a collection of objects at the same time. The last object you
+ * need to lock is sent with the H5FP_REQ_LOCK_END request type (this can
+ * also be a null message - where you're just sending a message that has
+ * H5FP_REQ_LOCK_END as the request type with no data associated with it.
+ * In that case, the md_len MUST be set to 0). The SAP will then try to
+ * lock all of the objects you've requested to lock at once. If it cannot
+ * do so, then it will fail and you have to try again at a later time.
+ *
+ * Releasing locks is done in the exact same way, except that the action
+ * will always release locks (i.e., not fail) if there is a vaild lock
+ * for that object.
+ */
+enum sap_request {
+ H5FP_REQ_OPEN,
+ H5FP_REQ_LOCK,
+ H5FP_REQ_LOCK_END,
+ H5FP_REQ_RELEASE,
+ H5FP_REQ_RELEASE_END,
+ H5FP_REQ_CHANGE,
+ H5FP_REQ_SYNC,
+ H5FP_REQ_CLOSE,
+ H5FP_REQ_STOP
+};
+
+/* Actions to take when performing a change */
+enum sap_action {
+ H5FP_ACT_CREATE,
+ H5FP_ACT_EXTEND,
+ H5FP_ACT_DELETE
+};
+
+/* Types of objects we can change */
+enum sap_obj_type {
+ H5FP_OBJ_FILE,
+ H5FP_OBJ_GROUP,
+ H5FP_OBJ_DATASET,
+ H5FP_OBJ_DATATYPE,
+ H5FP_OBJ_ATTRIBUTE
+};
+
+/* Types of locks we can get */
+enum sap_lock_type {
+ H5FP_LOCK_READ,
+ H5FP_LOCK_WRITE
+};
+
+/* The structure sent to the SAP which holds all of the requested action */
+struct SAP_request {
+ enum sap_request req_type; /* Request type */
+ unsigned int req_id; /* ID for request set by sending process */
+ unsigned int proc_rank; /* Rank of sending process */
+ unsigned int sap_file_id; /* SAP's file ID for the specific file */
+ int md_len; /* Length of the metadata sent in next msg */
+ enum sap_obj_type obj_type; /* Type of object */
+ enum sap_action action; /* Action to do to object (H5FP_REQ_CHANGE only) */
+ enum sap_lock_type rw_lock; /* Indicates read or write lock */
+ unsigned char oid[H5R_OBJ_REF_BUF_SIZE]; /* Buffer to store OID of object referenced */
+};
+
+extern MPI_Datatype SAP_request_t; /* MPI datatype for the SAP_request obj */
+
+/* The status of the SAP */
+enum sap_status {
+ H5FP_STATUS_OK,
+
+ /* For locking */
+ H5FP_STATUS_LOCK_ACQUIRED,
+ H5FP_STATUS_LOCK_FAILED,
+
+ /* For releasing locks */
+ H5FP_STATUS_LOCK_RELEASED,
+ H5FP_STATUS_LOCK_RELEASE_FAILED,
+ H5FP_STATUS_BAD_LOCK, /* Process doesn't own a lock on the OID */
+
+ /* For change requests */
+ H5FP_STATUS_FILE_CLOSING,
+ H5FP_STATUS_NO_LOCK,
+
+ /* Out of memory error */
+ H5FP_STATUS_OOM,
+
+ /* Bad file ID */
+ H5FP_STATUS_BAD_FILE_ID,
+
+ /* Reserved for completely disasterous failures which require an abort */
+ H5FP_STATUS_CATASTROPHIC
+};
+
+/* Reply from the SAP on an SAP_request send */
+struct SAP_reply {
+ unsigned int req_id; /* Request ID copied from the SAP_request */
+ unsigned int sap_file_id; /* File ID assigned to an open file */
+ enum sap_status status; /* Status of the request */
+};
+
+extern MPI_Datatype SAP_reply_t; /* MPI datatype for the SAP_reply obj */
+
+/* The sync message from the SAP on an SAP_request H5FP_REQ_SYNC send */
+struct SAP_sync {
+ unsigned int req_id; /* Request ID copied from the SAP_request */
+ unsigned int sync_id; /* Sync ID to order the sync messages */
+ unsigned int sap_file_id; /* SAP's file ID for the specific file */
+ unsigned int last_msg; /* Indicates this is the last sync msg sent */
+ int md_len; /* Length of the metadata sent in next msg */
+ enum sap_obj_type obj_type; /* Type of object */
+ enum sap_action action; /* Action done on the object */
+ enum sap_status status; /* Status of the request */
+};
+
+extern MPI_Datatype SAP_sync_t; /* MPI datatype for the SAP_sync obj */
+
+/*
+ * Special tag numbers for requests, replies, and string passing messages.
+ *
+ * Certain actions (Open, Change, and Close) require a pathname to the
+ * object. This pathname is sent in a separate message and the SAP will
+ * search for it after getting the appropriate request.
+ */
+enum {
+ H5FP_TAG_REQUEST = 37,
+ H5FP_TAG_REPLY,
+ H5FP_TAG_SYNC,
+ H5FP_TAG_METADATA,
+ H5FP_TAG_FILE_ID
+};
+
+/* Handy #define for copying OIDs */
+#define H5FP_COPY_OID(dst, src) HDmemcpy((dst), (src), H5R_OBJ_REF_BUF_SIZE)
+
+/* SAP specific variables */
+extern MPI_Comm H5FP_SAP_COMM; /* Comm we use: Supplied by user */
+extern MPI_Comm H5FP_SAP_BARRIER_COMM; /* Comm if you want to do a barrier */
+
+extern unsigned H5FP_sap_rank; /* The rank of the SAP: Supplied by user */
+extern unsigned H5FP_capt_rank; /* The rank which tells SAP of opens */
+extern unsigned H5FP_my_rank; /* Rank of this process in the COMM */
+extern int H5FP_comm_size; /* Size of the COMM */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* NOTE: Don't use this function explicitly!! */
+extern herr_t H5FP_send_metadata(const char *mdata, int len, int rank);
+
+/* Start the SAP */
+extern herr_t H5FP_sap_receive_loop(void);
+
+/* Use these functions to communicate with the SAP */
+extern herr_t H5FP_request_open(const char *mdata, int md_len, enum sap_obj_type obj_type,
+ unsigned *file_id, unsigned *req_id);
+extern herr_t H5FP_request_lock(unsigned int sap_file_id, unsigned char *mdata,
+ enum sap_lock_type rw_lock, int last, unsigned *req_id,
+ enum sap_status *status);
+extern herr_t H5FP_request_release_lock(unsigned int sap_file_id, unsigned char *mdata,
+ int last, unsigned *req_id, enum sap_status *status);
+extern herr_t H5FP_request_change(unsigned int sap_file_id, enum sap_obj_type obj_type,
+ enum sap_action action, int mdata_len, const char *mdata,
+ unsigned *req_id);
+extern herr_t H5FP_request_sync(unsigned int sap_file_id, hid_t hdf_file_id,
+ unsigned *req_id, enum sap_status *status);
+extern herr_t H5FP_request_close(unsigned sap_file_id, unsigned *req_id);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* H5FPPRIVATE_H__ */