diff --git a/doc/APIreference/functions.rst b/doc/APIreference/functions.rst index 1f33d81b..abc123ea 100644 --- a/doc/APIreference/functions.rst +++ b/doc/APIreference/functions.rst @@ -1251,12 +1251,12 @@ mj_freeStack Free the current :ref:`mjData` stack frame. All pointers returned by mj_stackAlloc since the last call to mj_markStack must no longer be used afterwards. -.. _mj_stackAlloc: +.. _mj_stackAllocByte: -mj_stackAlloc -~~~~~~~~~~~~~ +mj_stackAllocByte +~~~~~~~~~~~~~~~~~ -.. mujoco-include:: mj_stackAlloc +.. mujoco-include:: mj_stackAllocByte Allocate a number of bytes on :ref:`mjData` stack at a specific alignment. Call mju_error on stack overflow. diff --git a/doc/changelog.rst b/doc/changelog.rst index 77c6fae3..1945d26d 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -43,10 +43,10 @@ General :ref:`mj_freeStack`. These functions manage the :ref:`mjData stack` in a fully encapsulated way (i.e., without introducing a local variable at the call site). - 5. Changed the function :ref:`mj_stackAlloc` to allocate an arbitrary number of bytes, rather than in multiples of - ``sizeof(mjtNum)``, and added an additional argument for specifying the alignment of the returned pointer. + 5. Renamed ``mj_stackAlloc`` to :ref:`mj_stackAllocNum`. The new function :ref:`mj_stackAllocByte` allocates an + arbitrary number of bytes and has an additional argument for specifying the alignment of the returned pointer. - **Migration:** The functionality for allocating ``mjtNum`` arrays is available via :ref:`mj_stackAllocNum`. + **Migration:** The functionality for allocating ``mjtNum`` arrays is now available via :ref:`mj_stackAllocNum`. 6. Renamed the ``nstack`` field in :ref:`mjModel` and :ref:`mjData` to ``narena``. Changed ``narena``, ``pstack``, and ``maxuse_stack`` to count number of bytes rather than number of :ref:`mjtNum` |-| s. diff --git a/doc/includes/references.h b/doc/includes/references.h index e4b932b8..2c3ba4d3 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -2233,7 +2233,7 @@ void mj_resetDataDebug(const mjModel* m, mjData* d, unsigned char debug_value); void mj_resetDataKeyframe(const mjModel* m, mjData* d, int key); void mj_markStack(mjData* d); void mj_freeStack(mjData* d); -void* mj_stackAlloc(mjData* d, size_t bytes, size_t alignment); +void* mj_stackAllocByte(mjData* d, size_t bytes, size_t alignment); mjtNum* mj_stackAllocNum(mjData* d, int size); int* mj_stackAllocInt(mjData* d, int size); void mj_deleteData(mjData* d); diff --git a/doc/programming/simulation.rst b/doc/programming/simulation.rst index b63ab55b..6ff67094 100644 --- a/doc/programming/simulation.rst +++ b/doc/programming/simulation.rst @@ -721,7 +721,7 @@ The function :ref:`mj_stackAllocNum` checks if there is enough space, and if so otherwise it triggers an error. It also keeps track of the maximum stack allocation; see :ref:`diagnostics ` below. Note that :ref:`mj_stackAllocNum` is only used for allocating ``mjtNum`` arrays, the most common type of array. :ref:`mj_stackAllocInt` is provided for integer array allocation, -and :ref:`mj_stackAlloc` is provided for allocation of arbitrary number of bytes and alignment. +and :ref:`mj_stackAllocByte` is provided for allocation of arbitrary number of bytes and alignment. .. _siError: diff --git a/include/mujoco/mujoco.h b/include/mujoco/mujoco.h index c7964c73..26bf0567 100644 --- a/include/mujoco/mujoco.h +++ b/include/mujoco/mujoco.h @@ -194,7 +194,7 @@ MJAPI void mj_freeStack(mjData* d); // Allocate a number of bytes on mjData stack at a specific alignment. // Call mju_error on stack overflow. -MJAPI void* mj_stackAlloc(mjData* d, size_t bytes, size_t alignment); +MJAPI void* mj_stackAllocByte(mjData* d, size_t bytes, size_t alignment); // Allocate array of mjtNums on mjData stack. Call mju_error on stack overflow. MJAPI mjtNum* mj_stackAllocNum(mjData* d, int size); diff --git a/introspect/functions.py b/introspect/functions.py index a27e95db..69b74de7 100644 --- a/introspect/functions.py +++ b/introspect/functions.py @@ -705,9 +705,9 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ ), doc='Free the current mjData stack frame. All pointers returned by mj_stackAlloc since the last call to mj_markStack must no longer be used afterwards.', # pylint: disable=line-too-long )), - ('mj_stackAlloc', + ('mj_stackAllocByte', FunctionDecl( - name='mj_stackAlloc', + name='mj_stackAllocByte', return_type=PointerType( inner_type=ValueType(name='void'), ), diff --git a/python/mujoco/functions.cc b/python/mujoco/functions.cc index d1e00d9b..768b2568 100644 --- a/python/mujoco/functions.cc +++ b/python/mujoco/functions.cc @@ -126,7 +126,7 @@ PYBIND11_MODULE(_functions, pymodule) { Def(pymodule); Def(pymodule); Def(pymodule); - // Skipped: mj_stackAlloc (doesn't make sense in Python) + // Skipped: mj_stackAllocByte (doesn't make sense in Python) // Skipped: mj_deleteData (have MjData.__del__) Def(pymodule); Def(pymodule); @@ -1356,7 +1356,7 @@ PYBIND11_MODULE(_functions, pymodule) { data->ncon = ncon; data->nefc = nefc; data->contact = - static_cast(InterceptMjErrors(::mj_arenaAlloc)( + static_cast(InterceptMjErrors(::mj_arenaAllocByte)( data, ncon * sizeof(raw::MjContact), alignof(raw::MjContact))); if (!data->contact) { cleanup(data); @@ -1367,12 +1367,12 @@ PYBIND11_MODULE(_functions, pymodule) { #define MJ_M(x) d.metadata().x #undef MJ_D #define MJ_D(x) data->x -#define X(type, name, nr, nc) \ - data->name = static_cast(InterceptMjErrors(::mj_arenaAlloc)( \ - data, sizeof(type) * (nr) * (nc), alignof(type))); \ - if (!data->name) { \ - cleanup(data); \ - throw FatalError("insufficient arena memory available"); \ +#define X(type, name, nr, nc) \ + data->name = static_cast(InterceptMjErrors(::mj_arenaAllocByte)( \ + data, sizeof(type) * (nr) * (nc), alignof(type))); \ + if (!data->name) { \ + cleanup(data); \ + throw FatalError("insufficient arena memory available"); \ } MJDATA_ARENA_POINTERS_PRIMAL diff --git a/python/mujoco/private.h b/python/mujoco/private.h index abaad3a0..13a71b61 100644 --- a/python/mujoco/private.h +++ b/python/mujoco/private.h @@ -22,7 +22,7 @@ // They should be regarded as part of MuJoCo's internal implementation detail. extern "C" { MJAPI void _mjPRIVATE__set_tls_error_fn(void (*h)(const char*)); -MJAPI void* mj_arenaAlloc(mjData* d, int bytes, int alignment); +MJAPI void* mj_arenaAllocByte(mjData* d, int bytes, int alignment); } #endif // MUJOCO_PYTHON_PRIVATE_H_ diff --git a/python/mujoco/structs.cc b/python/mujoco/structs.cc index 94eb8c3a..6c54f3b5 100644 --- a/python/mujoco/structs.cc +++ b/python/mujoco/structs.cc @@ -820,11 +820,11 @@ MjDataWrapper MjDataWrapper::Deserialize(std::istream& input) { #define MJ_M(x) m.x #undef MJ_D #define MJ_D(x) d->x -#define X(type, name, nr, nc) \ - if ((nr) * (nc)) { \ - d->name = static_castname)>( \ - mj_arenaAlloc(d, sizeof(type) * (nr) * (nc), alignof(type))); \ - ReadBytes(input, d->name, sizeof(type) * (nr) * (nc)); \ +#define X(type, name, nr, nc) \ + if ((nr) * (nc)) { \ + d->name = static_castname)>( \ + mj_arenaAllocByte(d, sizeof(type) * (nr) * (nc), alignof(type))); \ + ReadBytes(input, d->name, sizeof(type) * (nr) * (nc)); \ } MJDATA_ARENA_POINTERS_CONTACT diff --git a/src/engine/engine_collision_driver.c b/src/engine/engine_collision_driver.c index 3a887c7f..bc5d787c 100644 --- a/src/engine/engine_collision_driver.c +++ b/src/engine/engine_collision_driver.c @@ -223,7 +223,7 @@ int mj_collideOBB(const mjtNum aabb1[6], const mjtNum aabb2[6], } static mjCollisionTree* mj_stackAllocTree(mjData* d, int max_stack) { - return (mjCollisionTree*) mj_stackAlloc( + return (mjCollisionTree*) mj_stackAllocByte( d, max_stack * sizeof(mjCollisionTree), _Alignof(mjCollisionTree)); } @@ -770,9 +770,9 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) { } // allocate sort buffer - sortbuf = (mjtBroadphase*) mj_stackAlloc( + sortbuf = (mjtBroadphase*) mj_stackAllocByte( d, 2 * bufcnt * sizeof(mjtBroadphase), _Alignof(mjtBroadphase)); - activebuf = (mjtBroadphase*) mj_stackAlloc( + activebuf = (mjtBroadphase*) mj_stackAllocByte( d, 2 * bufcnt * sizeof(mjtBroadphase), _Alignof(mjtBroadphase)); // init sortbuf with axis0 @@ -955,7 +955,7 @@ static void collideGeoms(const mjModel* m, mjData* d, // allocate mjContact[mjMAXCONPAIR] on the arena mjContact* con = - (mjContact*) mj_arenaAlloc(d, sizeof(mjContact) * mjMAXCONPAIR, _Alignof(mjContact)); + (mjContact*) mj_arenaAllocByte(d, sizeof(mjContact) * mjMAXCONPAIR, _Alignof(mjContact)); if (!con) { mj_warning(d, mjWARN_CONTACTFULL, d->ncon); return; diff --git a/src/engine/engine_collision_sdf.c b/src/engine/engine_collision_sdf.c index bdf16679..4e17eebb 100644 --- a/src/engine/engine_collision_sdf.c +++ b/src/engine/engine_collision_sdf.c @@ -459,7 +459,7 @@ static void collideBVH(const mjModel* m, mjData* d, int g, int node; }; typedef struct CollideTreeArgs_ CollideTreeArgs; - CollideTreeArgs* stack = (CollideTreeArgs*) mj_stackAlloc( + CollideTreeArgs* stack = (CollideTreeArgs*) mj_stackAllocByte( d, max_stack * sizeof(CollideTreeArgs), _Alignof(CollideTreeArgs)); int nstack = 0; diff --git a/src/engine/engine_core_constraint.c b/src/engine/engine_core_constraint.c index 1ffe5b99..4d8bfa61 100644 --- a/src/engine/engine_core_constraint.c +++ b/src/engine/engine_core_constraint.c @@ -61,13 +61,13 @@ static int arenaAllocEfc(const mjModel* m, mjData* d) { (char*)d->arena + d->parena, d->narena - d->pstack - d->parena); #endif -#define X(type, name, nr, nc) \ - d->name = mj_arenaAlloc(d, sizeof(type) * (nr) * (nc), _Alignof(type)); \ - if (!d->name) { \ - mj_warning(d, mjWARN_CNSTRFULL, d->narena); \ - mj_clearEfc(d); \ - d->parena = d->ncon * sizeof(mjContact); \ - return 0; \ +#define X(type, name, nr, nc) \ + d->name = mj_arenaAllocByte(d, sizeof(type) * (nr) * (nc), _Alignof(type)); \ + if (!d->name) { \ + mj_warning(d, mjWARN_CNSTRFULL, d->narena); \ + mj_clearEfc(d); \ + d->parena = d->ncon * sizeof(mjContact); \ + return 0; \ } MJDATA_ARENA_POINTERS_PRIMAL @@ -171,7 +171,7 @@ int mj_addContact(const mjModel* m, mjData* d, const mjContact* con) { mj_clearEfc(d); // copy contact - mjContact* dst = mj_arenaAlloc(d, sizeof(mjContact), _Alignof(mjContact)); + mjContact* dst = mj_arenaAllocByte(d, sizeof(mjContact), _Alignof(mjContact)); if (!dst) { mj_warning(d, mjWARN_CONTACTFULL, d->ncon); return 1; diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index b27815ae..7ce8cafe 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -1217,7 +1217,7 @@ mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src) { // allocate memory from the mjData arena -void* mj_arenaAlloc(mjData* d, size_t bytes, size_t alignment) { +void* mj_arenaAllocByte(mjData* d, size_t bytes, size_t alignment) { size_t misalignment = fastmod(d->parena, alignment); size_t padding = misalignment ? alignment - misalignment : 0; @@ -1374,7 +1374,7 @@ void mj_freeStack(mjData* d) { #endif } -void* mj_stackAlloc(mjData* d, size_t bytes, size_t alignment) { +void* mj_stackAllocByte(mjData* d, size_t bytes, size_t alignment) { return stackalloc(d, bytes, alignment); } diff --git a/src/engine/engine_io.h b/src/engine/engine_io.h index b0595747..3fcf695f 100644 --- a/src/engine/engine_io.h +++ b/src/engine/engine_io.h @@ -104,7 +104,7 @@ MJAPI void mj_resetDataDebug(const mjModel* m, mjData* d, unsigned char debug_va MJAPI void mj_resetDataKeyframe(const mjModel* m, mjData* d, int key); // mjData arena allocate -MJAPI void* mj_arenaAlloc(mjData* d, size_t bytes, size_t alignment); +MJAPI void* mj_arenaAllocByte(mjData* d, size_t bytes, size_t alignment); // mjData mark stack frame MJAPI void mj_markStack(mjData* d); @@ -113,7 +113,7 @@ MJAPI void mj_markStack(mjData* d); MJAPI void mj_freeStack(mjData* d); // mjData stack allocate -MJAPI void* mj_stackAlloc(mjData* d, size_t bytes, size_t alignment); +MJAPI void* mj_stackAllocByte(mjData* d, size_t bytes, size_t alignment); // mjData stack allocate for array of mjtNums MJAPI mjtNum* mj_stackAllocNum(mjData* d, int size); diff --git a/src/engine/engine_island.c b/src/engine/engine_island.c index c7bba3b9..827bd88d 100644 --- a/src/engine/engine_island.c +++ b/src/engine/engine_island.c @@ -113,12 +113,12 @@ static int arenaAllocIsland(const mjModel* m, mjData* d) { size_t parena_old = d->parena; -#define X(type, name, nr, nc) \ - d->name = mj_arenaAlloc(d, sizeof(type) * (nr) * (nc), _Alignof(type)); \ - if (!d->name) { \ - mj_warning(d, mjWARN_CNSTRFULL, d->narena); \ - clearIsland(d, parena_old); \ - return 0; \ +#define X(type, name, nr, nc) \ + d->name = mj_arenaAllocByte(d, sizeof(type) * (nr) * (nc), _Alignof(type)); \ + if (!d->name) { \ + mj_warning(d, mjWARN_CNSTRFULL, d->narena); \ + clearIsland(d, parena_old); \ + return 0; \ } MJDATA_ARENA_POINTERS_ISLAND diff --git a/src/engine/engine_util_container.c b/src/engine/engine_util_container.c index a14a717d..f3daab8c 100644 --- a/src/engine/engine_util_container.c +++ b/src/engine/engine_util_container.c @@ -24,7 +24,7 @@ // stack allocate and initialize new mjArrayList mjArrayList* mju_arrayListCreate(mjData* d, size_t element_size, size_t initial_capacity) { - mjArrayList* array_list = (mjArrayList*) mj_stackAlloc( + mjArrayList* array_list = (mjArrayList*) mj_stackAllocByte( d, sizeof(mjArrayList), _Alignof(mjArrayList)); initial_capacity = mjMAX(1, initial_capacity); array_list->d = d; @@ -34,7 +34,7 @@ mjArrayList* mju_arrayListCreate(mjData* d, size_t element_size, size_t initial_ array_list->next_segment = NULL; // allocate array list buffer - array_list->buffer = (void*) mj_stackAlloc( + array_list->buffer = (void*) mj_stackAllocByte( d, element_size * initial_capacity, _Alignof(mjtMaxAlign)); return array_list; } diff --git a/test/engine/engine_io_test.cc b/test/engine/engine_io_test.cc index b9f723cb..4c6443a4 100644 --- a/test/engine/engine_io_test.cc +++ b/test/engine/engine_io_test.cc @@ -830,8 +830,8 @@ TEST_F(EngineIoTest, RedZoneAlignmentTest) { ASSERT_THAT(data, NotNull()); mj_markStack(data); - mj_stackAlloc(data, 1, 1); - mj_stackAlloc(data, 1, 1); + mj_stackAllocByte(data, 1, 1); + mj_stackAllocByte(data, 1, 1); mj_freeStack(data); mj_deleteData(data); diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index 7984df84..fddc661e 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -6110,7 +6110,7 @@ public static unsafe extern void mj_markStack(mjData_* d); public static unsafe extern void mj_freeStack(mjData_* d); [DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)] -public static unsafe extern void* mj_stackAlloc(mjData_* d, UIntPtr bytes, UIntPtr alignment); +public static unsafe extern void* mj_stackAllocByte(mjData_* d, UIntPtr bytes, UIntPtr alignment); [DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)] public static unsafe extern double* mj_stackAllocNum(mjData_* d, int size);