Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
bcade6d7485383e956e82b0d781e16d0579c254a
[simgrid.git] / examples / s4u / io / s4u-io.cpp
1 /* Copyright (c) 2006-2017. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include <string>
7 #include <unordered_map>
8
9 #include "simgrid/s4u.hpp"
10
11 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "a sample log category");
12
13 class MyHost {
14 public:
15   void show_info(std::unordered_map<std::string, simgrid::s4u::Storage*> const& mounts)
16   {
17     XBT_INFO("Storage info on %s:", simgrid::s4u::Host::current()->getCname());
18
19     for (auto const& kv : mounts) {
20       std::string mountpoint         = kv.first;
21       simgrid::s4u::Storage* storage = kv.second;
22
23       // Retrieve disk's information
24       sg_size_t free_size = storage->getSizeFree();
25       sg_size_t used_size = storage->getSizeUsed();
26       sg_size_t size      = storage->getSize();
27
28       XBT_INFO("    %s (%s) Used: %llu; Free: %llu; Total: %llu.", storage->getName(), mountpoint.c_str(), used_size,
29                free_size, size);
30     }
31   }
32
33   void operator()() {
34     std::unordered_map<std::string, simgrid::s4u::Storage*> const& mounts =
35         simgrid::s4u::Host::current()->getMountedStorages();
36
37     show_info(mounts);
38
39     // Open an non-existing file to create it
40     std::string filename     = "/home/tmp/data.txt";
41     simgrid::s4u::File* file = new simgrid::s4u::File(filename, nullptr);
42
43     sg_size_t write = file->write(200000);  // Write 200,000 bytes
44     XBT_INFO("Create a %llu bytes file named '%s' on /sd1", write, filename.c_str());
45
46     // check that sizes have changed
47     show_info(mounts);
48
49     // Now retrieve the size of created file and read it completely
50     const sg_size_t file_size = file->size();
51     file->seek(0);
52     const sg_size_t read = file->read(file_size);
53     XBT_INFO("Read %llu bytes on %s", read, filename.c_str());
54
55     // Now write 100,000 bytes in tmp/data.txt
56     write = file->write(100000);  // Write 100,000 bytes
57     XBT_INFO("Write %llu bytes on %s", write, filename.c_str());
58
59     simgrid::s4u::Storage* storage = simgrid::s4u::Storage::byName("Disk4");
60
61     // Now rename file from ./tmp/data.txt to ./tmp/simgrid.readme
62     std::string newpath = "/home/tmp/simgrid.readme";
63     XBT_INFO("Move '%s' to '%s'", file->getPath(), newpath.c_str());
64     file->move(newpath);
65
66     // Test attaching some user data to the file
67     file->setUserdata(new std::string("777"));
68     std::string* file_data = static_cast<std::string*>(file->getUserdata());
69     XBT_INFO("User data attached to the file: %s", file_data->c_str());
70     delete file_data;
71
72     // Close the file
73     delete file;
74
75     // Now attach some user data to disk1
76     XBT_INFO("Get/set data for storage element: %s", storage->getName());
77     XBT_INFO("    Uninitialized storage data: '%s'", static_cast<char*>(storage->getUserdata()));
78
79     storage->setUserdata(new std::string("Some user data"));
80     std::string* storage_data = static_cast<std::string*>(storage->getUserdata());
81     XBT_INFO("    Set and get data: '%s'", storage_data->c_str());
82     delete storage_data;
83   }
84 };
85
86 int main(int argc, char **argv)
87 {
88   simgrid::s4u::Engine e(&argc, argv);
89   e.loadPlatform("../../platforms/storage/storage.xml");
90   simgrid::s4u::Actor::createActor("host", simgrid::s4u::Host::by_name("denise"), MyHost());
91   e.run();
92
93   return 0;
94 }