fd_array.hh revision 11886:43b882cada33
1/*
2 * Copyright (c) 2016 Advanced Micro Devices, Inc.
3 * All rights reserved.
4 *
5 * For use for simulation and test purposes only
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright notice,
14 * this list of conditions and the following disclaimer in the documentation
15 * and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of the copyright holder nor the names of its
18 * contributors may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
33 * Author: Brandon Potter
34 */
35
36#ifndef __FD_ARRAY_HH__
37#define __FD_ARRAY_HH__
38
39#include <array>
40#include <memory>
41#include <string>
42
43#include "sim/fd_entry.hh"
44
45class FDArray
46{
47  private:
48    static const int NUM_FDS = 1024;
49
50  public:
51    /**
52     * Initialize the file descriptor array and set the standard file
53     * descriptors to defaults or values passed in with the process
54     * params.
55     * @param input Used to initialize the stdin file descriptor
56     * @param output Used to initialize the stdout file descriptor
57     * @param errout Used to initialize the stderr file descriptor
58     */
59    FDArray(std::string const& input, std::string const& output,
60            std::string const& errout);
61
62    std::string _input;
63    std::string _output;
64    std::string _errout;
65
66    /**
67     * Figure out the file offsets for all currently open files and save them
68     * the offsets during the calls to drain by the owning process.
69     */
70    void updateFileOffsets();
71
72    /**
73     * Restore all offsets for currently open files during the unserialize
74     * phase for the owning process class.
75     */
76    void restoreFileOffsets();
77
78    /**
79     * Treat this object like a normal array in using the subscript operator
80     * to pull entries out of it.
81     * @param tgt_fd Use target file descriptors to index the array.
82     */
83    inline std::shared_ptr<FDEntry>
84    operator[](int tgt_fd)
85    {
86        return getFDEntry(tgt_fd);
87    }
88
89    /**
90     * Step through the file descriptor array and find the first available
91     * entry which is denoted as being free by being a 'nullptr'. That file
92     * descriptor entry is the new target file descriptor entry that we
93     * return as the return parameter.
94     * @param fdp Allocated beforehand and passed into this method;
95     * the fdp is meant to be a generic pointer capable of pointing to
96     * different types of file descriptors. Must cast the pointer to the
97     * correct type before dereferencing to access the needed fields.
98     */
99    int allocFD(std::shared_ptr<FDEntry> fdp);
100
101    /**
102     * Return the size of the _fdArray field
103     */
104    int getSize() const { return _fdArray.size(); }
105
106    /**
107     * Put the pointer specified by fdep into the _fdArray entry indexed
108     * by tgt_fd.
109     * @param tgt_fd Use target file descriptors to index the array.
110     * @param fdep Incoming pointer used to set the entry pointed to by tgt_fd.
111     */
112    void setFDEntry(int tgt_fd, std::shared_ptr<FDEntry> fdep);
113
114    /**
115     * Try to close the host file descriptor. If successful, set the
116     * specified file descriptor entry object pointer to nullptr.
117     * Used to "close" the target file descriptor.
118     * @param tgt_fd Use target file descriptors to index the array.
119     */
120    int closeFDEntry(int tgt_fd);
121
122  private:
123    /**
124     * Help clarify our intention when opening files in the init and
125     * restoration code. These are helper functions which are not meant to
126     * be exposed to other objects or files.
127     */
128    int openFile(std::string const& file_name, int flags, mode_t mode) const;
129    int openInputFile(std::string const& file_name) const;
130    int openOutputFile(std::string const& file_name) const;
131
132    /**
133     * Return the file descriptor entry object associated with the index
134     * provided. (The index is protected with bounds checking on the array
135     * size without the use of the array's at operator.)
136     * @param tgt_fd Use target file descriptors to index the array.
137     */
138    std::shared_ptr<FDEntry> getFDEntry(int tgt_fd);
139
140    /**
141     * Hold pointers to the file descriptor entries. The array size is
142     * statically defined by the operating system.
143     */
144    std::array<std::shared_ptr<FDEntry>, NUM_FDS> _fdArray;
145
146    /**
147     * Hold strings which represent the default values which are checked
148     * against to initialize the standard file descriptors. If the string
149     * provided doesn't hit against these maps, then a file is opened on the
150     * host instead of using the host's standard file descriptors.
151     */
152    std::map<std::string, int> imap;
153    std::map<std::string, int> oemap;
154};
155
156#endif // __FD_ARRAY_HH__
157