/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hidl.allocator@1.0;

/**
 * Interface which allocates the required memory.
 */
interface IAllocator {

    /**
     * Return memory must have instance name corresponding to this type of memory.
     *
     * @param size Size of memory to allocate in bytes.
     * @return success Whether allocation succeeded.
     * @return memory Unmapped memory object.
     */
    allocate(uint64_t size) generates (bool success, memory mem);

    /**
     * Return memory must have instance name corresponding to this type of memory.
     *
     * @param size Size of memory to allocate in bytes.
     * @param count Number of memory instances to allocate.
     * @return success Whether allocation succeeded (returns false if any allocation failed).
     * @return batch Unmapped memory objects.
     */
    batchAllocate(uint64_t size, uint64_t count) generates (bool success, vec<memory> batch);
};