Ignore:
Timestamp:
05/05/17 16:51:58 (7 years ago)
Author:
yushan
Message:

yacc parser in critical section

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/branch_yushan/src/parse_expr/yacc_parser.yacc

    r1037 r1127  
    1515} 
    1616 
    17   IFilterExprNode* parsed; 
    18   std::string globalInputText; 
    19   size_t globalReadOffset = 0; 
    20  
     17  static IFilterExprNode* parsed; 
     18  static std::string globalInputText; 
     19  static std::string *globalInputText_ptr = 0; 
     20  static size_t globalReadOffset = 0; 
     21  #pragma omp threadprivate(parsed, globalInputText_ptr, globalReadOffset) 
     22   
    2123  int readInputForLexer(char* buffer, size_t* numBytesRead, size_t maxBytesToRead) 
    2224  { 
     25    if(globalInputText_ptr == 0) globalInputText_ptr = new std::string; 
    2326    size_t numBytesToRead = maxBytesToRead; 
    24     size_t bytesRemaining = globalInputText.length()-globalReadOffset; 
     27    //size_t bytesRemaining = globalInputText.length()-globalReadOffset; 
     28    size_t bytesRemaining = (*globalInputText_ptr).length()-globalReadOffset; 
    2529    size_t i; 
    2630    if (numBytesToRead > bytesRemaining) numBytesToRead = bytesRemaining; 
    27     for (i = 0; i < numBytesToRead; i++) buffer[i] = globalInputText.c_str()[globalReadOffset + i]; 
     31    //for (i = 0; i < numBytesToRead; i++) buffer[i] = globalInputText.c_str()[globalReadOffset + i]; 
     32    for (i = 0; i < numBytesToRead; i++) buffer[i] = (*globalInputText_ptr).c_str()[globalReadOffset + i]; 
    2833    *numBytesRead = numBytesToRead; 
    2934    globalReadOffset += numBytesToRead; 
     
    131136  IFilterExprNode* parseExpr(const string& strExpr) 
    132137  { 
    133     globalInputText = strExpr; 
    134     globalReadOffset = 0; 
    135     yyparse(); 
     138    #pragma omp critical (_parser) 
     139    { 
     140      //globalInputText = strExpr; 
     141      if(globalInputText_ptr == 0) globalInputText_ptr = new std::string; 
     142      (*globalInputText_ptr).assign (strExpr); 
     143      globalReadOffset = 0; 
     144      yyparse(); 
     145    } 
    136146    return parsed; 
    137147  } 
Note: See TracChangeset for help on using the changeset viewer.