Age | Commit message (Expand) | Author |
2020-01-12 | libcamera: camera: Remove the prepared state | Niklas Söderlund |
2020-01-12 | cam: Cache buffer memory mapping | Niklas Söderlund |
2020-01-12 | libcamera: Switch to FrameBuffer interface | Niklas Söderlund |
2020-01-12 | libcamera: buffer: Move captured metadata to FrameMetadata | Niklas Söderlund |
2020-01-12 | libcamera: request: In addBuffer() do not fetch stream from Buffer | Niklas Söderlund |
2019-12-16 | libcamera: Remove buffer index from logging | Niklas Söderlund |
2019-11-20 | cam: Store camera as shared pointer everywhere | Niklas Söderlund |
2019-11-19 | libcamera: camera: Remove explicit stream to buffer map in requestCompleted s... | Niklas Söderlund |
2019-10-26 | cam: capture: remove unused local variable | Paul Elder |
2019-10-23 | libcamera: Standardise on C compatibility headers | Laurent Pinchart |
2019-09-14 | libcamera: Switch to the std::chrono API | Laurent Pinchart |
2019-07-14 | libcamera: buffer: Add an accessor to the BufferMemory | Laurent Pinchart |
2019-07-14 | libcamera: stream: Shorten access to the bufferPool | Jacopo Mondi |
2019-07-14 | libcamera: Stop using Stream::bufferPool to get the number of buffers | Laurent Pinchart |
2019-07-14 | libcamera: buffer: Split memory information to BufferMemory | Laurent Pinchart |
2019-06-25 | cam: capture: Stop stream when queueRequest() fails | Helen Koike |
2019-06-19 | cam: Move camera configuration preparation to CamApp | Niklas Söderlund |
2019-05-25 | cam: capture: Break out capture to a new class | Niklas Söderlund |
2' href='#n162'>162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* shared_fd.cpp - SharedFD test
*/
#include <fcntl.h>
#include <iostream>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <libcamera/base/shared_fd.h>
#include <libcamera/base/utils.h>
#include "test.h"
using namespace libcamera;
using namespace std;
class SharedFDTest : public Test
{
protected:
int init()
{
desc1_ = nullptr;
desc2_ = nullptr;
fd_ = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
if (fd_ < 0)
return TestFail;
/* Cache inode number of temp file. */
struct stat s;
if (fstat(fd_, &s))
return TestFail;
inodeNr_ = s.st_ino;
return 0;
}
int run()
{
/* Test creating empty SharedFD. */
desc1_ = new SharedFD();
if (desc1_->get() != -1) {
std::cout << "Failed fd numerical check (default constructor)"
<< std::endl;
return TestFail;
}
delete desc1_;
desc1_ = nullptr;
/*
* Test creating SharedFD by copying numerical file
* descriptor.
*/
desc1_ = new SharedFD(fd_);
if (desc1_->get() == fd_) {
std::cout << "Failed fd numerical check (lvalue ref constructor)"
<< std::endl;
return TestFail;
}
if (!isValidFd(fd_) || !isValidFd(desc1_->get())) {
std::cout << "Failed fd validity after construction (lvalue ref constructor)"
<< std::endl;
return TestFail;
}
int fd = desc1_->get();
delete desc1_;
desc1_ = nullptr;
if (!isValidFd(fd_) || isValidFd(fd)) {
std::cout << "Failed fd validity after destruction (lvalue ref constructor)"
<< std::endl;
return TestFail;
}
/*
* Test creating SharedFD by taking ownership of
* numerical file descriptor.
*/
int dupFd = dup(fd_);
int dupFdCopy = dupFd;
desc1_ = new SharedFD(std::move(dupFd));
if (desc1_->get() != dupFdCopy) {
std::cout << "Failed fd numerical check (rvalue ref constructor)"
<< std::endl;
return TestFail;
}
if (dupFd != -1 || !isValidFd(fd_) || !isValidFd(desc1_->get())) {
std::cout << "Failed fd validity after construction (rvalue ref constructor)"
<< std::endl;
return TestFail;
}
fd = desc1_->get();
delete desc1_;
desc1_ = nullptr;
if (!isValidFd(fd_) || isValidFd(fd)) {
std::cout << "Failed fd validity after destruction (rvalue ref constructor)"
<< std::endl;
return TestFail;
}
/* Test creating SharedFD from other SharedFD. */
desc1_ = new SharedFD(fd_);
desc2_ = new SharedFD(*desc1_);
if (desc1_->get() == fd_ || desc2_->get() == fd_ ||
desc1_->get() != desc2_->get()) {
std::cout << "Failed fd numerical check (copy constructor)"
<< std::endl;
return TestFail;
}
if (!isValidFd(desc1_->get()) || !isValidFd(desc2_->get())) {
std::cout << "Failed fd validity after construction (copy constructor)"
<< std::endl;
return TestFail;
}
delete desc1_;
desc1_ = nullptr;
if (!isValidFd(desc2_->get())) {
std::cout << "Failed fd validity after destruction (copy constructor)"
<< std::endl;
return TestFail;
}
delete desc2_;
desc2_ = nullptr;
/* Test creating SharedFD by taking over other SharedFD. */
desc1_ = new SharedFD(fd_);
fd = desc1_->get();
desc2_ = new SharedFD(std::move(*desc1_));
if (desc1_->get() != -1 || desc2_->get() != fd) {
std::cout << "Failed fd numerical check (move constructor)"
<< std::endl;
return TestFail;
}
if (!isValidFd(desc2_->get())) {
std::cout << "Failed fd validity after construction (move constructor)"
<< std::endl;
return TestFail;
}
delete desc1_;
desc1_ = nullptr;
delete desc2_;
desc2_ = nullptr;
/* Test creating SharedFD by copy assignment. */
desc1_ = new SharedFD();
desc2_ = new SharedFD(fd_);
fd = desc2_->get();
*desc1_ = *desc2_;
if (desc1_->get() != fd || desc2_->get() != fd) {
std::cout << "Failed fd numerical check (copy assignment)"
<< std::endl;
return TestFail;
}
if (!isValidFd(desc1_->get()) || !isValidFd(desc2_->get())) {
std::cout << "Failed fd validity after construction (copy assignment)"
<< std::endl;
return TestFail;
}
delete desc1_;
desc1_ = nullptr;
delete desc2_;
desc2_ = nullptr;
/* Test creating SharedFD by move assignment. */
desc1_ = new SharedFD();
desc2_ = new SharedFD(fd_);
fd = desc2_->get();
*desc1_ = std::move(*desc2_);
if (desc1_->get() != fd || desc2_->get() != -1) {
std::cout << "Failed fd numerical check (move assignment)"
<< std::endl;
return TestFail;
}
if (!isValidFd(desc1_->get())) {
std::cout << "Failed fd validity after construction (move assignment)"
<< std::endl;
return TestFail;
}
delete desc1_;
desc1_ = nullptr;
delete desc2_;
desc2_ = nullptr;
return TestPass;
}
void cleanup()
{
delete desc2_;
delete desc1_;
if (fd_ > 0)
close(fd_);
}
private:
bool isValidFd(int fd)
{
struct stat s;
if (fstat(fd, &s))
return false;
/* Check that inode number matches cached temp file. */
return s.st_ino == inodeNr_;
}
int fd_;
ino_t inodeNr_;
SharedFD *desc1_, *desc2_;
};
TEST_REGISTER(SharedFDTest)
|