// bthread - A M:N threading library to make applications more concurrent.
// Copyright (c) 2012 Baidu.com, Inc. All Rights Reserved

// Author: Ge,Jun (gejun@baidu.com)
// Date: Sun Sep  7 22:37:39 CST 2014

#ifndef BAIDU_BTHREAD_ALLOCATE_STACK_H
#define BAIDU_BTHREAD_ALLOCATE_STACK_H

#include <assert.h>
#include <gflags/gflags.h>          // DECLARE_int32
#include "bthread/types.h"
#include "bthread/context.h"        // bthread_fcontext_t
#include "base/object_pool.h"
#include "base/third_party/dynamic_annotations/dynamic_annotations.h" // RunningOnValgrind
#include "base/third_party/valgrind/valgrind.h" // VALGRIND_STACK_REGISTER

namespace bthread {

struct StackContainer {
    bthread_fcontext_t context;
    int stacksize;
    int guardsize;
    void* stack;
    int stacktype;
    unsigned valgrind_stack_id;
};

enum StackType {
    STACK_TYPE_MAIN = 0,
    STACK_TYPE_PTHREAD = BTHREAD_STACKTYPE_PTHREAD,
    STACK_TYPE_SMALL = BTHREAD_STACKTYPE_SMALL,
    STACK_TYPE_NORMAL = BTHREAD_STACKTYPE_NORMAL,
    STACK_TYPE_LARGE = BTHREAD_STACKTYPE_LARGE
};

inline StackContainer* get_stack(StackType type, void (*entry)(intptr_t));
inline void return_stack(StackContainer* sc);

// Allocate/deallocate stacks with guard pages.
void* allocate_stack(int* stacksize, int* guardsize);
void deallocate_stack(void* mem, int stacksize, int guardsize);

}  // namespace bthread

#include "bthread/stack_inl.h"

#endif  // BAIDU_BTHREAD_ALLOCATE_STACK_H