#include "sr_osal.h"

#if 1
void BspOsEnterCritical(void)
{

  // protect critical region in task context
  //调度器上锁，进入调度临界区，不再切换线程
   taskENTER_CRITICAL();

}

void BspOsExitCritical(void)
{
  // protect critical region in task context
  //调度器解锁，退出调度临界区
  taskEXIT_CRITICAL(); 
}

#endif

srTick_t BspOsGetTick(void)
{
	//return  rt_tick_get();
	return  0;
}



/************互斥量**************/
SR_MUTX_T BspOsMutexCreate(void)
{
	int ret=0;

	luat_rtos_mutex_t handle;

	ret = luat_rtos_mutex_create(&handle);

	return (ret == 0) ? handle : SR_NULL;
 

}

int BspOsMutexDelete(SR_MUTX_T mutexHdl)
{
  int ret = 0;
  luat_rtos_mutex_t handle = (luat_rtos_mutex_t )mutexHdl;

  ret =  luat_rtos_mutex_delete(handle);

  return (ret == 0) ? SR_OK : SR_FAIL;
}


int BspOsMutexTake(SR_MUTX_T mutexHdl,uint32_t timeout)
{
  int ret = 0;
  luat_rtos_mutex_t handle = (luat_rtos_mutex_t)mutexHdl;

  ret = luat_rtos_mutex_lock(handle,timeout);
  return (ret == 0) ? SR_OK : SR_FAIL;
}

int BspOsMutexRelease(SR_MUTX_T mutexHdl)
{
  int ret = 0;
  luat_rtos_mutex_t handle = (luat_rtos_mutex_t)mutexHdl;

  ret = luat_rtos_mutex_unlock(handle);
  return (ret == 0) ? SR_OK : SR_FAIL;
}



#ifndef SR_USE_DMEM_MONITOR
void *BspOsMalloc(srSize_t size)
{
  return luat_heap_malloc(size);
}

void BspOsFree(void *rmem)
{
  luat_heap_free(rmem);
  
}

void* BspOsRealloc(void* ptr, srSize_t size) 
{
  return luat_heap_realloc(ptr, size);
}

void* BspOsCalloc(srSize_t count, srSize_t size) 
{
  return luat_heap_calloc(count, size);
}

#else

static uint32_t gs_dmemUseSize =0;  //记录使用的动态内存


void *BspOsMalloc(srSize_t size)
{
  uint32_t *tmp = SR_NULL;
  void *p =SR_NULL;

  p = luat_heap_malloc(size+4);
  if(p!=SR_NULL)
  {
     tmp = (uint32_t *)p;
     *tmp = size;
	 gs_dmemUseSize += size;
  }
  
  return (p!=SR_NULL)? (void *)(tmp+1):SR_NULL;
}

void BspOsFree(void *rmem)
{
  uint32_t *tmp = rmem;
  
  if(*(tmp-1)>0) gs_dmemUseSize -= (*(tmp-1));
  luat_heap_free(tmp-1);
  
}

void* BspOsRealloc(void* ptr, srSize_t size) 
{
  uint32_t *tmp = ptr;
  void *p =SR_NULL;
  

  uint32_t oldSize = *(tmp-1);
  
  p = luat_heap_realloc(tmp-1, size+4);
  if(p!=SR_NULL)
  {
      tmp = (uint32_t *)p;
      *tmp = size;

	  if(size >= oldSize)
	    gs_dmemUseSize += (size-oldSize);  //size扩大
	  else
	  	gs_dmemUseSize -= (oldSize-size);  //size减小
  }

  return (p!=SR_NULL)? (void *)(tmp+1):SR_NULL; 
}

void* BspOsCalloc(srSize_t count, srSize_t size) 
{

  uint32_t *tmp = SR_NULL;
  void *p =SR_NULL;

  p = luat_heap_calloc(count, size+4);
  if(p!=SR_NULL)
  {
     tmp = (uint32_t *)p;
     *tmp = size*count;
	 gs_dmemUseSize += size*count;
  }
  
  return (p!=SR_NULL)? (void *)(tmp+1):SR_NULL;
}



void BspPrintDmemInfo(void)
{
   SR_LOG(INFO,"[MEM] use: %u  free: %u",gs_dmemUseSize,xPortGetFreeHeapSize());
}

#endif




