blob: 6567008884656baa6291e0310cc9567943c897d1 [file] [log] [blame]
/*
* 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.
*/
#ifndef _DECAF_LANG_SYSTEM_H_
#define _DECAF_LANG_SYSTEM_H_
#include <decaf/util/Config.h>
#include <decaf/util/Map.h>
#include <decaf/util/Properties.h>
#include <decaf/lang/Exception.h>
#include <decaf/lang/exceptions/NullPointerException.h>
#include <decaf/internal/AprPool.h>
#include <string>
namespace decaf{
namespace lang{
class Runtime;
class SystemData;
/**
* The System class provides static methods for accessing system level resources and performing
* some system dependent tasks such as looking up environment values and copying memory and arrays.
*
* @since 1.0
*/
class DECAF_API System {
private:
static SystemData* sys;
protected:
System();
public:
virtual ~System() {}
public: // Static Methods
/**
* Copies the number of elements specified by length from the source array starting at
* the given source offset specified by srcPos to the dest array starting at the given
* destination offset given by destPos.
*
* @param src
* The source array to copy from.
* @param srcPos
* The position in the array to start copying from.
* @param dest
* The destination array to copy to.
* @param destPos
* The position in the destination array to start writing at.
* @param length
* The number of elements to copy from src to dest.
*
* @throws NullPointerException if src or dest are NULL.
*/
static void arraycopy( const char* src, std::size_t srcPos,
char* dest, std::size_t destPos, std::size_t length );
/**
* Copies the number of elements specified by length from the source array starting at
* the given source offset specified by srcPos to the dest array starting at the given
* destination offset given by destPos.
*
* @param src
* The source array to copy from.
* @param srcPos
* The position in the array to start copying from.
* @param dest
* The destination array to copy to.
* @param destPos
* The position in the destination array to start writing at.
* @param length
* The number of elements to copy from src to dest.
*
* @throws NullPointerException if src or dest are NULL.
*/
static void arraycopy( const unsigned char* src, std::size_t srcPos,
unsigned char* dest, std::size_t destPos, std::size_t length );
/**
* Copies the number of elements specified by length from the source array starting at
* the given source offset specified by srcPos to the dest array starting at the given
* destination offset given by destPos.
*
* @param src
* The source array to copy from.
* @param srcPos
* The position in the array to start copying from.
* @param dest
* The destination array to copy to.
* @param destPos
* The position in the destination array to start writing at.
* @param length
* The number of elements to copy from src to dest.
*
* @throws NullPointerException if src or dest are NULL.
*/
static void arraycopy( const short* src, std::size_t srcPos,
short* dest, std::size_t destPos, std::size_t length );
/**
* Copies the number of elements specified by length from the source array starting at
* the given source offset specified by srcPos to the dest array starting at the given
* destination offset given by destPos.
*
* @param src
* The source array to copy from.
* @param srcPos
* The position in the array to start copying from.
* @param dest
* The destination array to copy to.
* @param destPos
* The position in the destination array to start writing at.
* @param length
* The number of elements to copy from src to dest.
*
* @throws NullPointerException if src or dest are NULL.
*/
static void arraycopy( const int* src, std::size_t srcPos,
int* dest, std::size_t destPos, std::size_t length );
/**
* Copies the number of elements specified by length from the source array starting at
* the given source offset specified by srcPos to the dest array starting at the given
* destination offset given by destPos.
*
* @param src
* The source array to copy from.
* @param srcPos
* The position in the array to start copying from.
* @param dest
* The destination array to copy to.
* @param destPos
* The position in the destination array to start writing at.
* @param length
* The number of elements to copy from src to dest.
*
* @throws NullPointerException if src or dest are NULL.
*/
static void arraycopy( const long long* src, std::size_t srcPos,
long long* dest, std::size_t destPos, std::size_t length );
/**
* Copies the number of elements specified by length from the source array starting at
* the given source offset specified by srcPos to the dest array starting at the given
* destination offset given by destPos.
*
* @param src
* The source array to copy from.
* @param srcPos
* The position in the array to start copying from.
* @param dest
* The destination array to copy to.
* @param destPos
* The position in the destination array to start writing at.
* @param length
* The number of elements to copy from src to dest.
*
* @throws NullPointerException if src or dest are NULL.
*/
static void arraycopy( const float* src, std::size_t srcPos,
float* dest, std::size_t destPos, std::size_t length );
/**
* Copies the number of elements specified by length from the source array starting at
* the given source offset specified by srcPos to the dest array starting at the given
* destination offset given by destPos.
*
* @param src
* The source array to copy from.
* @param srcPos
* The position in the array to start copying from.
* @param dest
* The destination array to copy to.
* @param destPos
* The position in the destination array to start writing at.
* @param length
* The number of elements to copy from src to dest.
*
* @throws NullPointerException if src or dest are NULL.
*/
static void arraycopy( const double* src, std::size_t srcPos,
double* dest, std::size_t destPos, std::size_t length );
/**
* Copies the number of elements specified by length from the source array starting at
* the given source offset specified by srcPos to the dest array starting at the given
* destination offset given by destPos.
*
* @param src
* The source array to copy from.
* @param srcPos
* The position in the array to start copying from.
* @param dest
* The destination array to copy to.
* @param destPos
* The position in the destination array to start writing at.
* @param length
* The number of elements to copy from src to dest.
*
* @throws NullPointerException if src or dest are NULL.
*/
template< typename E >
static void arraycopy( const E* src, std::size_t srcPos,
E* dest, std::size_t destPos, std::size_t length ) {
if( src == NULL ) {
throw decaf::lang::exceptions::NullPointerException(
__FILE__, __LINE__, "Given Source Pointer was null." );
}
if( src == NULL ) {
throw decaf::lang::exceptions::NullPointerException(
__FILE__, __LINE__, "Given Source Pointer was null." );
}
for( std::size_t i = 0; i < length; ++i ) {
dest[destPos+i] = src[srcPos+i];
}
}
/**
* Enumerates the system environment and returns a map of env variable
* names to the string values they hold.
*
* @return A Map of all environment variables.
*
* @throw Exception if an error occurs while getting the Environment Map.
*/
static const util::Map<std::string, std::string>& getenv();
/**
* Reads an environment value from the system and returns it as a
* string object
*
* @param name
* The environment variable to read.
*
* @return a string with the value from the variables or ""
*
* @throws an Exception if an error occurs while reading the Env.
*/
static std::string getenv( const std::string& name );
/**
* Clears a set environment value if one is set.
*
* @param name
* The environment variables to clear.
*
* @throws an Exception if an error occurs while reading the environment.
*/
static void unsetenv( const std::string& name );
/**
* Sets the specified system property to the value given.
*
* @param name
* The name of the environment variables to set.
* @param value
* The value to assign to name.
*
* @throws an Exception if an error occurs when setting the environment variable.
*/
static void setenv( const std::string& name, const std::string& value );
/**
* Returns the current time in milliseconds. Note that while the unit of time of
* the return value is a millisecond, the granularity of the value depends on the
* underlying operating system and may be larger. For example, many operating
* systems measure time in units of tens of milliseconds.
*
* See the description of the class Date for a discussion of slight discrepancies
* that may arise between "computer time" and coordinated universal time (UTC).
*
* @return the difference, measured in milliseconds, between the current time
* and midnight, January 1, 1970 UTC.
*/
static long long currentTimeMillis();
/**
* Returns the current value of the most precise available system timer, in
* nanoseconds.
*
* This method can only be used to measure elapsed time and is not related to
* any other notion of system or wall-clock time. The value returned represents
* nanoseconds since some fixed but arbitrary time (perhaps in the future, so
* values may be negative). This method provides nanosecond precision, but not
* necessarily nanosecond accuracy. No guarantees are made about how frequently
* values change. Differences in successive calls that span greater than
* approximately 292 years (263 nanoseconds) will not accurately compute elapsed
* time due to numerical overflow.
*
* For example, to measure how long some code takes to execute:
*
* long long startTime = System::nanoTime();
* // ... the code being measured ...
* long long estimatedTime = System::nanoTime() - startTime;
*
* @return
* The current value of the system timer, in nanoseconds.
*/
static long long nanoTime();
/**
* Returns the number of processors available for execution of Decaf Threads.
*
* This value may change during a particular execution of a Decaf based application. Applications
* that are sensitive to the number of available processors should therefore occasionally poll
* this property and adjust their resource usage appropriately.
*
* @return the number of available processors.
*/
static int availableProcessors();
/**
* Gets the Properties object that holds the Properties accessed from calls to
* getProperty and setProperty.
*
* If the Properties has not yet been created or are not yet initialized then they
* will be on the first call to a Properties accessor.
*
* @return a reference to the static system Properties object.
*/
static decaf::util::Properties& getProperties();
/**
* Gets the specified System property if set, otherwise returns an empty string.
*
* If the Properties has not yet been created or are not yet initialized then they
* will be on the first call to a Properties accessor.
* @param key
* The key name of the desired system property to retrieve.
*
* @return an empty string if the named property is not set, otherwise returns the value.
*
* @throws IllegalArgumentException if key is an empty string.
*/
static std::string getProperty( const std::string& key );
/**
* Gets the specified System property if set, otherwise returns the specified default value.
*
* If the Properties has not yet been created or are not yet initialized then they
* will be on the first call to a Properties accessor.
*
* @param key
* The key name of the desired system property to retrieve.
* @param defaultValue
* The default value to return if the key is not set in the System properties.
*
* @return the value of the named system property or the defaultValue if the property isn't set..
*
* @throws IllegalArgumentException if key is an empty string.
*/
static std::string getProperty( const std::string& key, const std::string& defaultValue );
/**
* Sets the System Property to the specified value.
*
* @param key
* The key name of the system property to set to the given value.
* @param value
* The value to assign to the key.
*
* @return the previous value of the property named by key if there was one, otherwise
* returns an empty string.
*
* @throws IllegalArgumentException if key is an empty string.
*/
static std::string setProperty( const std::string& key, const std::string& value );
/**
* Clear any value associated with the system property specified.
*
* @param key
* The key name of the system property to clear.
*
* @return the previous value of the property named by key if there was one, otherwise
* returns an empty string.
*
* @throws IllegalArgumentException if key is an empty string.
*/
static std::string clearProperty( const std::string& key );
private:
/**
* Enumerates the environment and return an array of strings
* with the values. Caller owns the array. The array is terminated
* by an element that holds the value NULL
*
* @return a vector of environment name / value pairs.
*/
static std::vector< std::string > getEnvArray();
/**
* Gets the one and only APR Pool instance
*
* @return a reference to the global APR Pool.
*/
static internal::AprPool& getAprPool();
private:
friend class decaf::lang::Runtime;
static void initSystem( int argc, char **argv );
static void shutdownSystem();
};
}}
#endif /*_DECAF_LANG_SYSTEM_H_*/