/*
 * Copyright (c) 2015-2019 Cadence Design Systems, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include "FreeRTOS.h"

#if XT_USE_THREAD_SAFE_CLIB

    #if XSHAL_CLIB == XTHAL_CLIB_XCLIB

        #include <errno.h>
        #include <sys/reent.h>

        #include "semphr.h"

        typedef SemaphoreHandle_t _Rmtx;

/*----------------------------------------------------------------------------- */
/*  Override this and set to nonzero to enable locking. */
/*----------------------------------------------------------------------------- */
        int32_t _xclib_use_mt = 1;


/*----------------------------------------------------------------------------- */
/*  Init lock. */
/*----------------------------------------------------------------------------- */
        void _Mtxinit( _Rmtx * mtx )
        {
            *mtx = xSemaphoreCreateRecursiveMutex();
        }

/*----------------------------------------------------------------------------- */
/*  Destroy lock. */
/*----------------------------------------------------------------------------- */
        void _Mtxdst( _Rmtx * mtx )
        {
            if( ( mtx != NULL ) && ( *mtx != NULL ) )
            {
                vSemaphoreDelete( *mtx );
            }
        }

/*----------------------------------------------------------------------------- */
/*  Lock. */
/*----------------------------------------------------------------------------- */
        void _Mtxlock( _Rmtx * mtx )
        {
            if( ( mtx != NULL ) && ( *mtx != NULL ) )
            {
                xSemaphoreTakeRecursive( *mtx, portMAX_DELAY );
            }
        }

/*----------------------------------------------------------------------------- */
/*  Unlock. */
/*----------------------------------------------------------------------------- */
        void _Mtxunlock( _Rmtx * mtx )
        {
            if( ( mtx != NULL ) && ( *mtx != NULL ) )
            {
                xSemaphoreGiveRecursive( *mtx );
            }
        }

/*----------------------------------------------------------------------------- */
/*  Called by malloc() to allocate blocks of memory from the heap. */
/*----------------------------------------------------------------------------- */
        void * _sbrk_r( struct _reent * reent,
                        int32_t incr )
        {
            extern char   _end;
            extern char   _heap_sentry;
            static char * _heap_sentry_ptr = &_heap_sentry;
            static char * heap_ptr;
            char *        base;

            if( !heap_ptr )
            {
                heap_ptr = ( char * ) &_end;
            }

            base      = heap_ptr;

            if( heap_ptr + incr >= _heap_sentry_ptr )
            {
                reent->_errno = ENOMEM;
                return ( char * ) -1;
            }

            heap_ptr += incr;
            return base;
        }

/*----------------------------------------------------------------------------- */
/*  Global initialization for C library. */
/*----------------------------------------------------------------------------- */
        void vPortClibInit( void )
        {
        }

/*----------------------------------------------------------------------------- */
/*  Per-thread cleanup stub provided for linking, does nothing. */
/*----------------------------------------------------------------------------- */
        void _reclaim_reent( void * ptr )
        {
        }

    #endif /* XSHAL_CLIB == XTHAL_CLIB_XCLIB */

    #if XSHAL_CLIB == XTHAL_CLIB_NEWLIB

        #include <errno.h>
        #include <malloc.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>

        #include "semphr.h"

        static SemaphoreHandle_t xClibMutex;
        static uint32_t          ulClibInitDone = 0;

/*----------------------------------------------------------------------------- */
/*  Get C library lock. */
/*----------------------------------------------------------------------------- */
        void __malloc_lock( struct _reent * ptr )
        {
            if( !ulClibInitDone )
            {
                return;
            }

            xSemaphoreTakeRecursive( xClibMutex, portMAX_DELAY );
        }

/*----------------------------------------------------------------------------- */
/*  Release C library lock. */
/*----------------------------------------------------------------------------- */
        void __malloc_unlock( struct _reent * ptr )
        {
            if( !ulClibInitDone )
            {
                return;
            }

            xSemaphoreGiveRecursive( xClibMutex );
        }

/*----------------------------------------------------------------------------- */
/*  Lock for environment. Since we have only one global lock we can just call */
/*  the malloc() lock function. */
/*----------------------------------------------------------------------------- */
        void __env_lock( struct _reent * ptr )
        {
            __malloc_lock( ptr );
        }


/*----------------------------------------------------------------------------- */
/*  Unlock environment. */
/*----------------------------------------------------------------------------- */
        void __env_unlock( struct _reent * ptr )
        {
            __malloc_unlock( ptr );
        }

/*----------------------------------------------------------------------------- */
/*  Called by malloc() to allocate blocks of memory from the heap. */
/*----------------------------------------------------------------------------- */
        void * _sbrk_r( struct _reent * reent,
                        int32_t incr )
        {
            extern char   _end;
            extern char   _heap_sentry;
            static char * _heap_sentry_ptr = &_heap_sentry;
            static char * heap_ptr;
            char *        base;

            if( !heap_ptr )
            {
                heap_ptr = ( char * ) &_end;
            }

            base      = heap_ptr;

            if( heap_ptr + incr >= _heap_sentry_ptr )
            {
                reent->_errno = ENOMEM;
                return ( char * ) -1;
            }

            heap_ptr += incr;
            return base;
        }

/*----------------------------------------------------------------------------- */
/*  Global initialization for C library. */
/*----------------------------------------------------------------------------- */
        void vPortClibInit( void )
        {
            configASSERT( !ulClibInitDone );

            xClibMutex     = xSemaphoreCreateRecursiveMutex();
            ulClibInitDone = 1;
        }

    #endif /* XSHAL_CLIB == XTHAL_CLIB_NEWLIB */

#endif /* XT_USE_THREAD_SAFE_CLIB */
