Dynamically allocate contact and efc_ arrays on a new memory arena.
- Add private function `mj_arenaAlloc`. This is used internally to allocate memory from the arena. - Add private function `mj_nefc` to count constraints. This function returns a tight upper bound on `d->nefc`. The number of counted constraints can be slightly bigger than exact `d->nefc` in the case of constraints with empty Jacobian, as when placing a frictional tendon between two world sites. - Add new `memory` attribute to the `size` XML element for specification of arena memory size. This attribute is mutually exclusive with `nstack` and `njmax` specifications, which are now deprecated (but left around for the time being for legacy compatibility). - Move `d->stack` to the end of the new arena space. The stack now grows in reverse from the end. PiperOrigin-RevId: 479341539 Change-Id: Ie019c202e0908577ffc6f833a37920858116f667
This commit is contained in:
committed by
Copybara-Service
parent
4d85a464cc
commit
58fd72f53d
@@ -41,25 +41,26 @@ inline char ReadChar(std::istream& input) {
|
||||
return c;
|
||||
}
|
||||
|
||||
inline void WriteInt(std::ostream& output, int i) {
|
||||
output.write(reinterpret_cast<char*>(&i), sizeof(int));
|
||||
inline void WriteInt(std::ostream& output, std::size_t i) {
|
||||
output.write(reinterpret_cast<char*>(&i), sizeof(std::size_t));
|
||||
}
|
||||
|
||||
inline int ReadInt(std::istream& input) {
|
||||
int i = 0;
|
||||
input.read(reinterpret_cast<char*>(&i), sizeof(int));
|
||||
inline std::size_t ReadInt(std::istream& input) {
|
||||
std::size_t i = 0;
|
||||
input.read(reinterpret_cast<char*>(&i), sizeof(std::size_t));
|
||||
return i;
|
||||
}
|
||||
|
||||
inline void WriteBytes(std::ostream& output, const void* src, size_t nbytes) {
|
||||
inline void WriteBytes(std::ostream& output, const void* src,
|
||||
std::size_t nbytes) {
|
||||
// Start by writing nbytes itself, so it can be validated at the time of
|
||||
// reading.
|
||||
WriteInt(output, nbytes);
|
||||
output.write(reinterpret_cast<const char*>(src), nbytes);
|
||||
}
|
||||
|
||||
inline void ReadBytes(std::istream& input, void* dest, size_t nbytes) {
|
||||
size_t actual_nbytes = ReadInt(input);
|
||||
inline void ReadBytes(std::istream& input, void* dest, std::size_t nbytes) {
|
||||
std::size_t actual_nbytes = ReadInt(input);
|
||||
if (actual_nbytes != nbytes) {
|
||||
input.setstate(input.rdstate() | std::ios_base::failbit);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user