File: ad_zoidfs_common.c

package info (click to toggle)
openmpi 4.1.4-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 127,592 kB
  • sloc: ansic: 690,998; makefile: 43,047; f90: 19,220; sh: 7,182; java: 6,360; perl: 3,590; cpp: 2,227; python: 1,350; lex: 989; fortran: 61; tcl: 12
file content (126 lines) | stat: -rw-r--r-- 3,083 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/* 
 *   Copyright (C) 2003 University of Chicago. 
 *   See COPYRIGHT notice in top-level directory.
 */

#include "ad_zoidfs.h"
#include "ad_zoidfs_common.h"
#include <unistd.h>
#include <sys/types.h>

/* keyval hack to both tell us if we've already initialized zoidfs and also
 * close it down when mpi exits */
int ADIOI_ZOIDFS_Initialized = MPI_KEYVAL_INVALID;

void ADIOI_ZOIDFS_End(int *error_code)
{
    int ret;
    static char myname[] = "ADIOI_ZOIDFS_END";

    ret = zoidfs_finalize();

    /* --BEGIN ERROR HANDLING-- */
    if (ret != 0 ) {
	*error_code = MPIO_Err_create_code(MPI_SUCCESS,
					   MPIR_ERR_RECOVERABLE,
					   myname, __LINE__,
					   ADIOI_ZOIDFS_error_convert(ret),
					   "Error in zoidfs_finalize", 0);
	return;
    }
    /* --END ERROR HANDLING-- */

    *error_code = MPI_SUCCESS;
}

int ADIOI_ZOIDFS_End_call(MPI_Comm comm, int keyval, 
			 void *attribute_val, void *extra_state)
{
    int error_code;
    ADIOI_ZOIDFS_End(&error_code);
    MPI_Keyval_free(&keyval);
    return error_code;
}

void ADIOI_ZOIDFS_Init(int rank, int *error_code )
{
    int ret;
    static char myname[] = "ADIOI_ZOIDFS_INIT";

    /* do nothing if we've already fired up the zoidfs interface */
    if (ADIOI_ZOIDFS_Initialized != MPI_KEYVAL_INVALID) {
	*error_code = MPI_SUCCESS;
	return;
    }

    ret = zoidfs_init();
    if (ret < 0 ) {
	*error_code = MPIO_Err_create_code(MPI_SUCCESS,
					   MPIR_ERR_RECOVERABLE,
					   myname, __LINE__,
					   ADIOI_ZOIDFS_error_convert(ret),
					   "Error in zoidfs_init",
					   0);
	return;
    }
    
    MPI_Keyval_create(MPI_NULL_COPY_FN, ADIOI_ZOIDFS_End_call,
		      &ADIOI_ZOIDFS_Initialized, (void *)0); 
    /* just like romio does, we make a dummy attribute so we 
     * get cleaned up */
    MPI_Attr_put(MPI_COMM_SELF, ADIOI_ZOIDFS_Initialized, (void *)0);
}

void ADIOI_ZOIDFS_makeattribs(zoidfs_sattr_t * attribs)
{
    memset(attribs, 0, sizeof(zoidfs_sattr_t));

    attribs->mask = ZOIDFS_ATTR_MODE;
    attribs->mode = 0644;
}

int ADIOI_ZOIDFS_error_convert(int error)
{
    switch (error)
    {
	case ZFSERR_PERM: /* ??? */
	case ZFSERR_ACCES:
	    return MPI_ERR_ACCESS;
	case ZFSERR_NOENT:
	case ZFSERR_NXIO: /* ??? */
	case ZFSERR_NODEV: /* ??? */
	    return MPI_ERR_NO_SUCH_FILE;
	case ZFSERR_IO:
	    return MPI_ERR_IO;
	case ZFSERR_EXIST:
	    return MPI_ERR_FILE_EXISTS;
	case ZFSERR_NOTDIR: /* ??? */
	case ZFSERR_ISDIR: /* ??? */
	case ZFSERR_NAMETOOLONG:
	    return MPI_ERR_BAD_FILE;
	case ZFSERR_INVAL:
	case ZFSERR_STALE:
	    return MPI_ERR_FILE;
	case ZFSERR_FBIG: /* ??? */
	case ZFSERR_NOSPC:
	    return MPI_ERR_NO_SPACE;
	case ZFSERR_ROFS:
	    return MPI_ERR_READ_ONLY;
	case ZFSERR_NOTIMPL:
	    return MPI_ERR_UNSUPPORTED_OPERATION;
	case ZFSERR_DQUOT:
	    return MPI_ERR_QUOTA;
	/* case ZFSERR_NOTEMPTY: */
	/* case ZFSERR_WFLUSH: */
	/* case ZFSERR_OTHER: */
	case ZFSERR_NOMEM:
	    return MPI_ERR_INTERN;
	default:
	    return MPI_UNDEFINED;
    }
}

/* 
 * vim: ts=8 sts=4 sw=4 noexpandtab 
 */