// **********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
// **********************************************************************
#include "CmpProcess.h"
#include "ComRtUtils.h"
#include "nsk/nskport.h"
#include "seabed/ms.h"
#include "seabed/fs.h"
#include <cstdlib>

// -----------------------------------------------------------------------
// Methods for class CmpProcess
// -----------------------------------------------------------------------

/************************************************************************
constructor CmpProcess

 Get some basic information about this process and setup the class.
 The process info gathered below only needs to happen once.

************************************************************************/
CmpProcess::CmpProcess()
: nodeNum_(0), 
  pin_(0), 
  segmentNum_(0),  
  processStartTime_(0) 
{

  char programDir[100];
  short processType;
  int myCPU;
  char myNodeName[MAX_SEGMENT_NAME_LEN+1];
  Lng32  myNodeNum;
  short myNodeNameLen = MAX_SEGMENT_NAME_LEN;
  char myProcessName[PROCESSNAME_STRING_LEN];
  pid_t pid;
  if (!ComRtGetProgramInfo(programDir,100,processType,myCPU,
                          pid,myNodeNum,myNodeName,myNodeNameLen,
                          processStartTime_,myProcessName))
  {
    pin_ = pid;
    nodeNum_ = myNodeNum;
    // convert to local civil time
    processStartTime_ = CONVERTTIMESTAMP(processStartTime_,0,-1,0);
  }
}
/************************************************************************
method CmpProcess::getProcessDuration

  the number of microseconds since this process started

************************************************************************/
Int64
CmpProcess::getProcessDuration()
{
  Int64 currentTime = getCurrentTimestamp();
  return (currentTime - processStartTime_);
}
/************************************************************************
method CmpProcess::getCurrentSystemHeapSize

 Guardian procedure calls used to get the latest memory usage information
 for this process. 

************************************************************************/
Lng32
CmpProcess::getCurrentSystemHeapSize()
{
  Lng32 currentSystemHeapSize = 0;

  return currentSystemHeapSize;
}
/************************************************************************
method CmpProcess::getCompilerId

parameter:
   char *id - pass an empty buffer in and get the compiler id as output

 the compiler id is made up of:

 process start timestamp - 18 digits
 node (cpu) #            - 3 digits
 pin #                   - 5 digits


************************************************************************/
void
CmpProcess::getCompilerId(char *id, int len)
{    
  CMPASSERT( NULL != id );

  snprintf
    (id, len, "%018ld%03d%05d",
     getProcessStartTime(),        
     getNodeNum(),                      
     getPin());                       
}
