示例#1
0
文件: task.c 项目: JamesLinus/core
void hb_taskDestroyMutex( void ** pMutexPtr )
{
   PHB_TASKMTX pMutex = ( PHB_TASKMTX ) *pMutexPtr;

   if( pMutex )
   {
      PHB_TASKMTX * pMutexLst = &s_mutexList;

      while( *pMutexLst )
      {
         if( *pMutexLst == pMutex )
         {
            *pMutexLst = pMutex->next;
            if( pMutex->count )
               hb_errInternal( HB_EI_ERRUNRECOV, "TaskDestroyMutex: locked", NULL, NULL );
            else if( pMutex->lockers )
               hb_errInternal( HB_EI_ERRUNRECOV, "TaskDestroyMutex: lockers", NULL, NULL );
            hb_xfree( pMutex );
            return;
         }
         pMutexLst = &( *pMutexLst )->next;
      }
      hb_errInternal( HB_EI_ERRUNRECOV, "TaskDestroyMutex: not a mutex", NULL, NULL );
   }
}
示例#2
0
void hb_xfree( void * pMem )            /* frees fixed memory */
{
   if( pMem )
   {
#ifdef HB_FM_STATISTICS
      PHB_MEMINFO pMemBlock = ( PHB_MEMINFO ) ( ( HB_BYTE * ) pMem - HB_MEMINFO_SIZE );

      if( pMemBlock->Signature != HB_MEMINFO_SIGNATURE )
         hb_errInternal( HB_EI_XFREEINV, "hb_xfree called with an invalid pointer", NULL, NULL );

      if( HB_GET_LE_UINT32( ( ( HB_BYTE * ) pMem ) + pMemBlock->nSize ) != HB_MEMINFO_SIGNATURE )
         hb_errInternal( HB_EI_XMEMOVERFLOW, "Memory buffer overflow", NULL, NULL );

      s_nMemoryConsumed -= pMemBlock->nSize;
      s_nMemoryBlocks--;
      if( s_pMemBlocks == pMemBlock )
         s_pMemBlocks = pMemBlock->pNextBlock;
      else
         pMemBlock->pPrevBlock->pNextBlock = pMemBlock->pNextBlock;

      if( pMemBlock->pNextBlock )
         pMemBlock->pNextBlock->pPrevBlock = pMemBlock->pPrevBlock;

      pMemBlock->Signature = 0;
      HB_PUT_LE_UINT32( ( ( HB_BYTE * ) pMem ) + pMemBlock->nSize, 0 );
      pMem = ( HB_BYTE * ) pMem - HB_MEMINFO_SIZE;
#endif
      free( pMem );
   }
   else
      hb_errInternal( HB_EI_XFREENULL, "hb_xfree called with a NULL pointer", NULL, NULL );
}
示例#3
0
文件: task.c 项目: JamesLinus/core
static PHB_TASKINFO hb_taskSwitchLock( PHB_TASKMTX pMutex )
{
   PHB_TASKINFO pTask = pMutex->lockers;

   if( pTask )
   {
      pMutex->lockers = pTask->pBlockNext;
#ifdef HB_TASK_DEBUG
      if( pTask->locking != pMutex )
         hb_errInternal( HB_EI_ERRUNRECOV, "TaskSwitchLock: broken lock", NULL, NULL );
#endif
      pTask->locking = NULL;
      pTask->locked++;
      pMutex->task = pTask;
      pMutex->count = 1;
      if( pTask->state == TASK_SLEEPING )
      {
         hb_taskWakeUp( pTask );
         pTask->state = TASK_RUNNING;
      }
      else if( pTask->state != TASK_RUNNING )
         hb_errInternal( HB_EI_ERRUNRECOV, "TaskSwitchLock: task resumed", NULL, NULL );
   }
   return pTask;
}
示例#4
0
void hb_compPCodeEval( PFUNCTION pFunc, const HB_PCODE_FUNC_PTR * pFunctions, void * cargo )
{
   HB_SIZE nPos = 0;
   HB_SIZE nSkip;
   HB_BYTE opcode;

   /* Make sure that table is correct */
   assert( sizeof( hb_comp_pcode_len ) == HB_P_LAST_PCODE );
   assert( sizeof( s_psize_table ) / sizeof( HB_PCODE_FUNC_PTR ) == HB_P_LAST_PCODE );

   while( nPos < pFunc->nPCodePos )
   {
      opcode = pFunc->pCode[ nPos ];
      if( opcode < HB_P_LAST_PCODE )
      {
         HB_PCODE_FUNC_PTR pCall = pFunctions[ opcode ];
         nSkip = pCall ? pCall( pFunc, nPos, cargo ) : 0;
         if( nSkip == 0 )
         {
            nSkip = hb_comp_pcode_len[ opcode ];
            if( nSkip == 0 )
            {
               pCall = s_psize_table[ opcode ];
               if( pCall != NULL )
                  nSkip = pCall( pFunc, nPos, NULL );
            }
         }

         if( nSkip == 0 )
         {
            char szOpcode[ 16 ];
            ++nPos;
            hb_snprintf( szOpcode, sizeof( szOpcode ), "%i", opcode );
            hb_errInternal( HB_EI_COMPBADOPSIZE, "Invalid (zero) opcode %s size in hb_compPCodeEval()", szOpcode, NULL );
         }
#if 0
         /*
          * Test code to validate return values by PCODE eval functions,
          * in some cases the eval functions can return intentionally differ
          * values so it's not enabled by default. [druzus]
          */
         if( hb_comp_pcode_len[ opcode ] != 0 && hb_comp_pcode_len[ opcode ] != nSkip )
         {
            char szMsg[ 100 ];
            hb_snprintf( szMsg, sizeof( szMsg ), "Wrong PCODE (%d) size (%ld!=%d)", opcode, nSkip, hb_comp_pcode_len[ opcode ] );
            hb_errInternal( HB_EI_COMPBADOPSIZE, szMsg, NULL, NULL );
         }
#endif
         nPos += nSkip;
      }
      else
      {
         char szOpcode[ 16 ];
         ++nPos;
         hb_snprintf( szOpcode, sizeof( szOpcode ), "%i", opcode );
         hb_errInternal( HB_EI_COMPBADOPCODE, "Invalid opcode: %s in hb_compPCodeEval()", szOpcode, NULL );
      }
   }
}
示例#5
0
文件: core.c 项目: JamesLinus/core
static void hb_ocidd_init( void * cargo )
{
   HB_SYMBOL_UNUSED( cargo );

   if( ! OCI_Initialize( NULL, NULL, OCI_ENV_DEFAULT | OCI_ENV_CONTEXT | OCI_ENV_THREADED ) )
      hb_errInternal( 8000, NULL, NULL, NULL );
   else if( ! hb_sddRegister( &s_ocidd ) )
      hb_errInternal( HB_EI_RDDINVALID, NULL, NULL, NULL );
}
示例#6
0
void * hb_xrealloc( void * pMem, HB_SIZE nSize )       /* reallocates memory */
{
#ifdef HB_FM_STATISTICS
   PHB_MEMINFO pMemBlock;
   HB_SIZE nMemSize;
   void * pResult;

   if( nSize == 0 )
   {
      if( pMem )
         hb_xfree( pMem );
      return NULL;
   }
   else if( ! pMem )
      return hb_xgrab( nSize );

   pMemBlock = ( PHB_MEMINFO ) ( ( HB_BYTE * ) pMem - HB_MEMINFO_SIZE );
   nMemSize = pMemBlock->nSize;

   if( pMemBlock->Signature != HB_MEMINFO_SIGNATURE )
      hb_errInternal( HB_EI_XREALLOCINV, "hb_xrealloc called with an invalid pointer", NULL, NULL );

   if( HB_GET_LE_UINT32( ( ( HB_BYTE * ) pMem ) + nMemSize ) != HB_MEMINFO_SIGNATURE )
      hb_errInternal( HB_EI_XMEMOVERFLOW, "Memory buffer overflow", NULL, NULL );

   HB_PUT_LE_UINT32( ( ( HB_BYTE * ) pMem ) + nMemSize, 0 );

   pResult = realloc( pMemBlock, nSize + HB_MEMINFO_SIZE + sizeof( HB_U32 ) );
   if( pResult )
   {
      if( s_pMemBlocks == pMemBlock )
         s_pMemBlocks = ( PHB_MEMINFO ) pResult;
      else
         ( ( PHB_MEMINFO ) pResult )->pPrevBlock->pNextBlock = ( PHB_MEMINFO ) pResult;

      if( ( ( PHB_MEMINFO ) pResult )->pNextBlock )
         ( ( PHB_MEMINFO ) pResult )->pNextBlock->pPrevBlock = ( PHB_MEMINFO ) pResult;
      s_nMemoryConsumed += ( nSize - nMemSize );

      if( s_nMemoryMaxConsumed < s_nMemoryConsumed )
         s_nMemoryMaxConsumed = s_nMemoryConsumed;

      ( ( PHB_MEMINFO ) pResult )->nSize = nSize;  /* size of the memory block */
      HB_PUT_LE_UINT32( ( ( HB_BYTE * ) pResult ) + nSize + HB_MEMINFO_SIZE, HB_MEMINFO_SIGNATURE );
      pResult = ( HB_BYTE * ) pResult + HB_MEMINFO_SIZE;
   }
#else
   void * pResult = realloc( pMem, nSize );
#endif

   if( ! pResult && nSize )
      hb_errInternal( HB_EI_XREALLOC, "hb_xrealloc can't reallocate memory", NULL, NULL );

   return pResult;
}
示例#7
0
文件: dynsym.c 项目: CsBela/core
/* Insert new symbol into dynamic symbol table.
 * In MT mode caller should protected it by HB_DYNSYM_LOCK()
 */
static PHB_DYNS hb_dynsymInsert( PHB_SYMB pSymbol, HB_UINT uiPos )
{
   PHB_DYNS pDynSym;

   HB_TRACE( HB_TR_DEBUG, ( "hb_dynsymInsert(%p,%u)", pSymbol, uiPos ) );

   if( ++s_uiDynSymbols == 0 )
   {
      --s_uiDynSymbols;
      hb_errInternal( 6004, "Internal error: size of dynamic symbol table exceed", NULL, NULL );
   }
   else if( s_uiDynSymbols == 1 )
   {
      s_pDynItems = ( PDYNHB_ITEM ) hb_xgrab( sizeof( DYNHB_ITEM ) );
   }
   else
   {
      s_pDynItems = ( PDYNHB_ITEM ) hb_xrealloc( s_pDynItems, s_uiDynSymbols * sizeof( DYNHB_ITEM ) );
      memmove( &s_pDynItems[ uiPos + 1 ], &s_pDynItems[ uiPos ],
               sizeof( DYNHB_ITEM ) * ( s_uiDynSymbols - uiPos - 1 ) );
   }

   pDynSym = ( PHB_DYNS ) hb_xgrab( sizeof( HB_DYNS ) );
   memset( pDynSym, 0, sizeof( HB_DYNS ) );
   pDynSym->pSymbol  = pSymbol;
   pDynSym->uiSymNum = s_uiDynSymbols;

   pSymbol->pDynSym = s_pDynItems[ uiPos ].pDynSym = pDynSym;

   return pDynSym;
}
示例#8
0
文件: langapi.c 项目: xharbour/core
PHB_LANG hb_langSelect( PHB_LANG lang )
{
   PHB_LANG langOld = s_lang;

   HB_TRACE( HB_TR_DEBUG, ( "hb_langSelect(%p)", lang ) );

   if( lang )
   {
      s_lang = lang;
   }
   else
   {
      /*
         // Intentionally not using generic rutines which might require valid language setup.
         printf( "Internal error: invalid language selected.\n" );
         exit(1);

         druzus: in hb_errInternal(...) s_lang is checked before so we only have
              to set it to NULL to avoid recursion
       */
      s_lang = NULL;
      hb_errInternal( HB_EI_ERRUNRECOV, "invalid language selected", NULL, NULL );
   }

   return langOld;
}
示例#9
0
文件: sdf1.c 项目: AmericoBalboa/core
static void hb_sdfRddInit( void * cargo )
{
   HB_SYMBOL_UNUSED( cargo );

   if( hb_rddRegister( "SDF", RDT_TRANSFER ) > 1 )
      hb_errInternal( HB_EI_RDDINVALID, NULL, NULL, NULL );
}
示例#10
0
文件: garbage.c 项目: JamesLinus/core
/* release a memory block allocated with hb_gcAlloc*() */
void hb_gcFree( void * pBlock )
{
   if( pBlock )
   {
      PHB_GARBAGE pAlloc = HB_GC_PTR( pBlock );

      /* Don't release the block that will be deleted during finalization */
      if( ! ( pAlloc->used & HB_GC_DELETE ) )
      {
         HB_GC_LOCK();
         if( pAlloc->locked )
            hb_gcUnlink( &s_pLockedBlock, pAlloc );
         else
         {
            hb_gcUnlink( &s_pCurrBlock, pAlloc );
            HB_GC_AUTO_DEC();
         }
         HB_GC_UNLOCK();

         HB_GARBAGE_FREE( pAlloc );
      }
   }
   else
   {
      hb_errInternal( HB_EI_XFREENULL, NULL, NULL, NULL );
   }
}
示例#11
0
文件: memvars.c 项目: rrgaona/core
void hb_memvarGetRefer( PHB_ITEM pItem, PHB_SYMB pMemvarSymb )
{
   PHB_DYNS pDyn;

   HB_TRACE( HB_TR_DEBUG, ( "hb_memvarGetRefer(%p, %p)", pItem, pMemvarSymb ) );

   pDyn = ( PHB_DYNS ) pMemvarSymb->pDynSym;
   if( pDyn )
   {
      PHB_ITEM pMemvar;

      pMemvar = hb_dynsymGetMemvar( pDyn );

      HB_TRACE( HB_TR_INFO, ( "Memvar item (%p)(%s) referenced", pMemvar, pMemvarSymb->szName ) );

      if( pMemvar )
      {
         if( HB_IS_BYREF( pMemvar ) && ! HB_IS_ENUM( pMemvar ) )
            hb_itemCopy( pItem, pMemvar );
         else
         {
            /* value is already created */
            pItem->type = HB_IT_BYREF | HB_IT_MEMVAR;
            pItem->item.asMemvar.value = pMemvar;
            hb_xRefInc( pMemvar );
         }
      }
      else
      {
         /* Generate an error with retry possibility
          * (user created error handler can make this variable accessible)
          */
         PHB_ITEM pError;

         pError = hb_errRT_New( ES_ERROR, NULL, EG_NOVAR, 1003,
                                NULL, pMemvarSymb->szName, 0, EF_CANRETRY );

         while( hb_errLaunch( pError ) == E_RETRY )
         {
            pMemvar = hb_dynsymGetMemvar( pDyn );
            if( pMemvar )
            {
               if( HB_IS_BYREF( pMemvar ) && ! HB_IS_ENUM( pMemvar ) )
                  hb_itemCopy( pItem, pMemvar );
               else
               {
                  /* value is already created */
                  pItem->type = HB_IT_BYREF | HB_IT_MEMVAR;
                  pItem->item.asMemvar.value = pMemvar;
                  hb_xRefInc( pMemvar );
               }
               break;
            }
         }
         hb_errRelease( pError );
      }
   }
   else
      hb_errInternal( HB_EI_MVBADSYMBOL, NULL, pMemvarSymb->szName, NULL );
}
示例#12
0
static void hb_mlzo_init( void * cargo )
{
   HB_SYMBOL_UNUSED( cargo );

   if( lzo_init() != LZO_E_OK )
      hb_errInternal( HB_EI_VMBADSTARTUP /* TOFIX: ? */, NULL, NULL, NULL );
}
示例#13
0
static void hb_sqlbaseInit( void * cargo )
{
   HB_SYMBOL_UNUSED( cargo );

   if( hb_rddRegister( "SQLBASE", RDT_FULL ) > 1 )
      hb_errInternal( HB_EI_RDDINVALID, NULL, NULL, NULL );
}
示例#14
0
文件: task.c 项目: JamesLinus/core
static PHB_TASKINFO hb_taskNew( long stack_size )
{
   PHB_TASKINFO pTask;
   HB_PTRUINT new_size;

   if( stack_size < HB_TASK_STACK_MIN )
      stack_size = HB_TASK_STACK_MIN;

   pTask = ( PHB_TASKINFO ) hb_xgrabz( sizeof( HB_TASKINFO ) );
   pTask->stack = ( char * ) hb_xgrab( stack_size );

   new_size = ( HB_PTRUINT ) pTask->stack + stack_size;
   new_size &= ~ ( HB_PTRUINT ) ( HB_TASK_STACK_ALIGN - 1 );
   new_size -= ( HB_PTRUINT ) pTask->stack;

   pTask->stack_size = ( long ) new_size;
   pTask->id = ++s_iTaskID;

   pTask->state = TASK_INIT;

#if defined( HB_HAS_UCONTEXT )
   /* create new execution context and initialize its private stack */
   if( getcontext( &pTask->context ) == -1 )
      hb_errInternal( HB_EI_ERRUNRECOV, "getcontext", NULL, NULL );
   pTask->context.uc_link          = NULL;
   pTask->context.uc_stack.ss_sp   = pTask->stack;
   pTask->context.uc_stack.ss_size = pTask->stack_size;
   makecontext( &pTask->context, hb_taskRun, 0 );
#endif

   return pTask;
}
示例#15
0
ULONG hb_gcDecRef( void *pBlock )
{
   HB_GARBAGE_PTR pAlloc = ( HB_GARBAGE_PTR ) pBlock;

   --pAlloc;

   if( pAlloc->ulHolders == 0 )
   {
      hb_errInternal( HB_EI_PREMATURE_RELEASE, "Premature Pointer Release detected: '%p'", (char *) pBlock, NULL );
   }

   if( HB_ATOMIC_DEC( pAlloc->ulHolders ) == 0 && !pAlloc->locked )
   {
      //OutputDebugString("Calling GC Cleanup function...");
      if( pAlloc->pFunc )
      {
         ( pAlloc->pFunc )( ( void * )( pBlock ) );
      }

      //OutputDebugString("Attempting to free GC mem...");
      hb_gcFree( pBlock );
      //OutputDebugString("GC mem freed...");

      return 0;
   }
   else
   {
      return pAlloc->ulHolders;
   }
}
示例#16
0
文件: sddpg.c 项目: ggargano/hbtest2
static void hb_pgsqldd_init( void * cargo )
{
   HB_SYMBOL_UNUSED( cargo );

   if( ! hb_sddRegister( &pgsqldd ) )
      hb_errInternal( HB_EI_RDDINVALID, NULL, NULL, NULL );
}
示例#17
0
文件: adsx.c 项目: SBCamus/core
static void hb_adsxRddInit( void * cargo )
{
   HB_SYMBOL_UNUSED( cargo );

   if( hb_rddRegister( "ADSX",    RDT_FULL ) > 1 ||
       hb_rddRegister( "ADSNTXX", RDT_FULL ) > 1 ||
       hb_rddRegister( "ADSCDXX", RDT_FULL ) > 1 ||
#if ADS_LIB_VERSION >= 900
       hb_rddRegister( "ADSVFPX", RDT_FULL ) > 1 ||
#endif
       hb_rddRegister( "ADSADTX", RDT_FULL ) > 1 )
   {
      /* try different RDD register order */
      hb_rddRegister( "ADS",    RDT_FULL );
      hb_rddRegister( "ADSNTX", RDT_FULL );
      hb_rddRegister( "ADSCDX", RDT_FULL );
#if ADS_LIB_VERSION >= 900
      hb_rddRegister( "ADSVFP", RDT_FULL );
#endif
      hb_rddRegister( "ADSADT", RDT_FULL );

      if( hb_rddRegister( "ADSX",    RDT_FULL ) > 1 ||
          hb_rddRegister( "ADSNTXX", RDT_FULL ) > 1 ||
          hb_rddRegister( "ADSCDXX", RDT_FULL ) > 1 ||
#if ADS_LIB_VERSION >= 900
          hb_rddRegister( "ADSVFPX", RDT_FULL ) > 1 ||
#endif
          hb_rddRegister( "ADSADTX", RDT_FULL ) > 1 )
      {
         hb_errInternal( HB_EI_RDDINVALID, NULL, NULL, NULL );
         /* not executed, only to force linking ADS RDD */
         HB_FUNC_EXEC( ADSCDX );
      }
   }
}
示例#18
0
HB_ERRCODE hb_memvarGet( PHB_ITEM pItem, PHB_SYMB pMemvarSymb )
{
   PHB_DYNS pDyn;
   HB_ERRCODE bSuccess = HB_FAILURE;

   HB_TRACE( HB_TR_DEBUG, ( "hb_memvarGet(%p, %p)", pItem, pMemvarSymb ) );

   pDyn = pMemvarSymb->pDynSym;
   if( pDyn )
   {
      PHB_ITEM pMemvar;

      pMemvar = hb_dynsymGetMemvar( pDyn );

      HB_TRACE( HB_TR_INFO, ( "Memvar item (%p)(%s) queried", pMemvar, pMemvarSymb->szName ) );

      if( pMemvar )
      {
         /* value is already created
          */
         if( HB_IS_BYREF( pMemvar ) )
            hb_itemCopy( pItem, hb_itemUnRef( pMemvar ) );
         else
            hb_itemCopy( pItem, pMemvar );
         bSuccess = HB_SUCCESS;
      }
   }
   else
      hb_errInternal( HB_EI_MVBADSYMBOL, NULL, pMemvarSymb->szName, NULL );

   return bSuccess;
}
示例#19
0
文件: errapi.c 项目: emazv72/core
static HB_BOOL hb_errGetNumCode( int * piValue, const char * szOperation )
{
   PHB_ITEM pItem = hb_param( 1, HB_IT_NUMERIC );

   if( pItem )
      *piValue = hb_itemGetNI( pItem );
   else
   {
      pItem = hb_errRT_BASE_Subst( EG_ARG, 0, NULL, szOperation,
                                   HB_ERR_ARGS_BASEPARAMS );
      if( ! pItem )
      {
         *piValue = 0;
         return HB_FALSE;
      }

      if( ! HB_IS_NUMERIC( pItem ) )
         hb_errInternal( HB_EI_ERRRECFAILURE, NULL, NULL, NULL );

      *piValue = hb_itemGetNI( pItem );
      hb_itemRelease( pItem );
   }

   return HB_TRUE;
}
示例#20
0
void hb_compPCodeTrace( PFUNCTION pFunc, const HB_PCODE_FUNC_PTR * pFunctions, void * cargo )
{
   HB_SIZE nPos = 0;

   /* Make sure that table is correct */
   assert( sizeof( hb_comp_pcode_len ) == HB_P_LAST_PCODE );

   while( nPos < pFunc->nPCodePos )
   {
      HB_BYTE opcode = pFunc->pCode[ nPos ];
      if( opcode < HB_P_LAST_PCODE )
      {
         HB_PCODE_FUNC_PTR pCall = pFunctions[ opcode ];
         if( pCall )
            nPos = pCall( pFunc, nPos, cargo );
         else
            nPos += hb_comp_pcode_len[ opcode ];
      }
      else
      {
         char szOpcode[ 16 ];
         ++nPos;
         hb_snprintf( szOpcode, sizeof( szOpcode ), "%i", opcode );
         hb_errInternal( HB_EI_COMPBADOPCODE, "Invalid opcode: %s in hb_compPCodeTrace()", szOpcode, NULL );
      }
   }
}
示例#21
0
/*
 * This functions copies passed item value into the memvar pointed
 * by symbol
 *
 * pMemvar - symbol associated with a variable
 * pItem   - value to store in memvar
 *
 */
void hb_memvarSetValue( PHB_SYMB pMemvarSymb, PHB_ITEM pItem )
{
   PHB_DYNS pDyn;

   HB_TRACE( HB_TR_DEBUG, ( "hb_memvarSetValue(%p, %p)", pMemvarSymb, pItem ) );

   pDyn = pMemvarSymb->pDynSym;
   if( pDyn )
   {
      PHB_ITEM pMemvar;

      pMemvar = hb_dynsymGetMemvar( pDyn );

      HB_TRACE( HB_TR_INFO, ( "Memvar item (%p)(%s) assigned", pMemvar, pMemvarSymb->szName ) );

      if( pMemvar )
      {
         /* value is already created */
         hb_itemCopyToRef( pMemvar, pItem );
         /* Remove MEMOFLAG if exists (assignment from field). */
         pMemvar->type &= ~HB_IT_MEMOFLAG;
      }
      else
      {
         /* assignment to undeclared memvar - PRIVATE is assumed */
         hb_memvarCreateFromDynSymbol( pDyn, HB_VSCOMP_PRIVATE, pItem );
      }
   }
   else
      hb_errInternal( HB_EI_MVBADSYMBOL, NULL, pMemvarSymb->szName, NULL );
}
示例#22
0
文件: task.c 项目: JamesLinus/core
void hb_taskSignal( void ** pCondPtr )
{
   PHB_TASKCOND pCond;

   if( *pCondPtr == NULL )
      *pCondPtr = ( void * ) hb_taskCondNew();

   pCond = ( PHB_TASKCOND ) *pCondPtr;

   if( pCond->waiters )
   {
      PHB_TASKINFO * pLockers = &pCond->mutex->lockers, pTask;

      while( *pLockers )
         pLockers = &( *pLockers )->pBlockNext;

      pTask = pCond->waiters;

#ifdef HB_TASK_DEBUG
      if( pTask->waiting != pCond )
         hb_errInternal( HB_EI_ERRUNRECOV, "TaskSignal: broken cond", NULL, NULL );
#endif
      pTask->waiting = NULL;
      pCond->waiters = pTask->pWaitNext;

      pTask->locking = pCond->mutex;
      pTask->pBlockNext = NULL;
      *pLockers = pTask;

      if( pCond->mutex->count == 0 )
         hb_taskSwitchLock( pCond->mutex );
   }
}
示例#23
0
文件: task.c 项目: ggargano/hbtest2
/* TODO: do not start task immediately */
void hb_taskResume( void * pTaskPtr )
{
   PHB_TASKINFO pTask = ( PHB_TASKINFO ) pTaskPtr, pCurrTask;

   if( s_currTask != pTask )
   {
      pCurrTask = s_currTask;
      switch( pTask->state )
      {
#if ! defined( HB_HAS_UCONTEXT )
         case TASK_INIT:
            /* save current execution context  */
            if( setjmp( s_currTask->context ) == 0 )
            {
               s_currTask = pTask;
               hb_taskStart();
               /* unreachable code */
            }
            break;
#endif
         case TASK_SLEEPING:
            hb_taskWakeUp( pTask );
            /* no break */
#if defined( HB_HAS_UCONTEXT )
         case TASK_INIT:
#endif
         case TASK_SUSPEND:
            pTask->state = TASK_RUNNING;
            /* no break */
         case TASK_RUNNING:
#if defined( HB_HAS_UCONTEXT )
            s_currTask = pTask;
            /* save current execution context and switch to the new one */
            swapcontext( &pCurrTask->context, &pTask->context );
#else
            /* save current execution context  */
            if( setjmp( s_currTask->context ) == 0 )
            {
               s_currTask = pTask;
               /* switch execution context */
               longjmp( pTask->context, 1 );
               /* unreachable code */
            }
#endif
            break;

         case TASK_DONE:
            break;

         case TASK_ZOMBIE:
            /* It should not happen - it's bug in user code */
            hb_errInternal( HB_EI_ERRUNRECOV, "TaskResume: zombie", NULL, NULL );
/*
         default:
            hb_errInternal( HB_EI_ERRUNRECOV, "TaskResume: corrupt", NULL, NULL );
 */
      }
   }
}
示例#24
0
文件: errapi.c 项目: emazv72/core
PHB_ITEM hb_errNew( void )
{
   HB_TRACE( HB_TR_DEBUG, ( "hb_errNew()" ) );

   if( ! s_pError || ! HB_IS_OBJECT( s_pError ) )
      hb_errInternal( HB_EI_ERRRECFAILURE, NULL, NULL, NULL );

   return hb_arrayClone( s_pError );
}
示例#25
0
文件: task.c 项目: JamesLinus/core
/* (try to) lock given mutex */
int hb_taskLock( void ** pMutexPtr, unsigned long ulMilliSec )
{
   PHB_TASKMTX pMutex;

   if( s_iTaskID == 0 )
      return 0;

   if( *pMutexPtr == NULL )
      *pMutexPtr = ( void * ) hb_taskMutexNew();

   pMutex = ( PHB_TASKMTX ) *pMutexPtr;
   if( pMutex->count == 0 )
   {
      s_currTask->locked++;
      pMutex->task = s_currTask;
      return ++pMutex->count;
   }
   else if( pMutex->task == s_currTask )
   {
      return ++pMutex->count;
   }

   if( ulMilliSec )
   {
      PHB_TASKINFO * pLockers = &pMutex->lockers;

      while( *pLockers )
         pLockers = &( *pLockers )->pBlockNext;
      *pLockers = s_currTask;
      s_currTask->pBlockNext = NULL;
      s_currTask->locking = pMutex;

      hb_taskSleep( ulMilliSec );

      if( s_currTask->locking )
      {
         pLockers = &pMutex->lockers;
         while( *pLockers )
         {
            if( *pLockers == s_currTask )
            {
               *pLockers = s_currTask->pBlockNext;
               s_currTask->locking = NULL;
               break;
            }
            else
               pLockers = &( *pLockers )->pBlockNext;
         }
#ifdef HB_TASK_DEBUG
         if( s_currTask->locking )
            hb_errInternal( HB_EI_ERRUNRECOV, "TaskLock: dummy lock", NULL, NULL );
#endif
      }
   }

   return pMutex->task == s_currTask ? pMutex->count : 0;
}
示例#26
0
static void hb_mysqldd_init( void * cargo )
{
   HB_SYMBOL_UNUSED( cargo );

   if( ! hb_sddRegister( &s_mysqldd ) ||
       ( sizeof( MYSQL_ROW_OFFSET ) != sizeof( void * ) ) )
   {
      hb_errInternal( HB_EI_RDDINVALID, NULL, NULL, NULL );
   }
}
示例#27
0
文件: core.c 项目: AmericoBalboa/core
static void hb_sqlt3dd_init( void * cargo )
{
   HB_SYMBOL_UNUSED( cargo );

#if SQLITE_VERSION_NUMBER >= 3006000
   sqlite3_initialize();
#endif

   if( ! hb_sddRegister( &s_sqlt3dd ) )
      hb_errInternal( HB_EI_RDDINVALID, NULL, NULL, NULL );
}
示例#28
0
文件: console.c 项目: CsBela/core
void hb_conInit( void )
{
   HB_TRACE( HB_TR_DEBUG, ( "hb_conInit()" ) );

#if ! defined( HB_OS_WIN )
   /* On Windows file handles with numbers 0, 1, 2 are
      transalted inside filesys to:
      GetStdHandle( STD_INPUT_HANDLE ), GetStdHandle( STD_OUTPUT_HANDLE ),
      GetStdHandle( STD_ERROR_HANDLE ) */

   s_hFilenoStdin  = fileno( stdin );
   s_hFilenoStdout = fileno( stdout );
   s_hFilenoStderr = fileno( stderr );

#endif

#ifdef HB_CLP_UNDOC
   {
      /* Undocumented CA-Cl*pper switch //STDERR:x */
      int iStderr = hb_cmdargNum( "STDERR" );

      if( iStderr == 0 || iStderr == 1 )  /* //STDERR with no parameter or 0 */
         s_hFilenoStderr = s_hFilenoStdout;
      /* disabled in default builds. It's not multiplatform and very
       * dangerous because it can redirect error messages to data files
       * [druzus]
       */
#ifdef HB_CLP_STRICT
      else if( iStderr > 0 ) /* //STDERR:x */
         s_hFilenoStderr = ( HB_FHANDLE ) iStderr;
#endif
   }
#endif

   /*
    * Some compilers open stdout and stderr in text mode, but
    * Harbour needs them to be open in binary mode.
    */
   hb_fsSetDevMode( s_hFilenoStdin,  FD_BINARY );
   hb_fsSetDevMode( s_hFilenoStdout, FD_BINARY );
   hb_fsSetDevMode( s_hFilenoStderr, FD_BINARY );

   if( hb_gtInit( s_hFilenoStdin, s_hFilenoStdout, s_hFilenoStderr ) != HB_SUCCESS )
      hb_errInternal( 9995, "Harbour terminal (GT) initialization failure", NULL, NULL );

   if( hb_cmdargCheck( "INFO" ) )
   {
      hb_conOutErr( hb_gtVersion( 1 ), 0 );
      hb_conOutErr( hb_conNewLine(), 0 );
   }
}
示例#29
0
文件: task.c 项目: JamesLinus/core
void hb_taskDestroyCond( void ** pCondPtr )
{
   PHB_TASKCOND pCond = ( PHB_TASKCOND ) *pCondPtr;

   if( pCond )
   {
      PHB_TASKCOND * pCondLst = &s_condList;

      while( *pCondLst )
      {
         if( *pCondLst == pCond )
         {
            *pCondLst = pCond->next;
            if( pCond->waiters )
               hb_errInternal( HB_EI_ERRUNRECOV, "TaskDestroyCond: waiters", NULL, NULL );
            hb_xfree( pCond );
            return;
         }
         pCondLst = &( *pCondLst )->next;
      }
      hb_errInternal( HB_EI_ERRUNRECOV, "TaskDestroyCond: not a cond", NULL, NULL );
   }
}
示例#30
0
void * hb_xgrab( HB_SIZE nSize )        /* allocates fixed memory, exits on failure */
{
   void * pMem;

   if( nSize == 0 )
      hb_errInternal( HB_EI_XGRABNULLSIZE, "hb_xgrab requested to allocate zero bytes", NULL, NULL );

#ifdef HB_FM_STATISTICS
   pMem = malloc( nSize + HB_MEMINFO_SIZE + sizeof( HB_U32 ) );
   if( pMem )
   {
      if( s_pMemBlocks )
         s_pMemBlocks->pPrevBlock = ( PHB_MEMINFO ) pMem;
      ( ( PHB_MEMINFO ) pMem )->pNextBlock = s_pMemBlocks;
      ( ( PHB_MEMINFO ) pMem )->pPrevBlock = NULL;
      s_pMemBlocks = ( PHB_MEMINFO ) pMem;
      ( ( PHB_MEMINFO ) pMem )->nSize = nSize;
      ( ( PHB_MEMINFO ) pMem )->Signature = HB_MEMINFO_SIGNATURE;
      HB_PUT_LE_UINT32( ( ( HB_BYTE * ) pMem ) + HB_MEMINFO_SIZE + nSize, HB_MEMINFO_SIGNATURE );

      s_nMemoryConsumed += nSize;
      if( s_nMemoryMaxConsumed < s_nMemoryConsumed )
         s_nMemoryMaxConsumed = s_nMemoryConsumed;
      s_nMemoryBlocks++;
      if( s_nMemoryMaxBlocks < s_nMemoryBlocks )
         s_nMemoryMaxBlocks = s_nMemoryBlocks;
      pMem = ( HB_BYTE * ) pMem + HB_MEMINFO_SIZE;
   }
   else
#else
   pMem = malloc( nSize );
   if( ! pMem )
#endif
      hb_errInternal( HB_EI_XGRABALLOC, "hb_xgrab can't allocate memory", NULL, NULL );

   return pMem;
}