blob: 78d4e639edee22edb2d22b5ee08cec827ae18834 [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.
*/
/**
* @author Mikhail Y. Fursov
*/
#ifndef _DRL_EM_IMPL_
#define _DRL_EM_IMPL_
#include "MTable.h"
#include "DrlProfileCollectionFramework.h"
#include "method_lookup.h"
#include "open/em.h"
#include "open/hythread_ext.h"
#include "open/em_profile_access.h"
#include "jni.h"
#include <apr_dso.h>
#include <string>
#include <set>
#include <vector>
class RChain;
class RStep;
class DrlEMImpl;
#define EM_TBS_TICK_TIMEOUT 100
typedef std::vector<RChain*> RChains;
typedef std::vector<RStep*> RSteps;
/** Recompilation step. One recompilation chain can have 1 or more recompilation steps */
class RStep {
public:
RStep(JIT_Handle _jit, const std::string& _jitName, RChain* _chain, apr_dso_handle_t* _libHandle);
virtual ~RStep(){}
JIT_Handle jit;
std::string jitName, catName;
RChain* chain;
bool loggingEnabled;
apr_dso_handle_t* libHandle;
bool (*enable_profiling)(JIT_Handle, PC_Handle, EM_JIT_PC_Role);
void (*profile_notification_callback)(JIT_Handle, PC_Handle, Method_Handle);
};
/** Recompilation chain */
class RChain {
public:
RChain(){};
virtual ~RChain(){};
bool acceptMethod(Method_Handle mh, size_t n) const { return methodTable.acceptMethod(mh, n);}
bool addMethodFilter(const std::string& filterString) {return methodTable.addMethodFilter(filterString);}
RSteps steps;
MTable methodTable;
};
class DrlEMFactory {
public:
//EM interface impl:
static DrlEMImpl* createAndInitEMInstance();
static DrlEMImpl* getEMInstance();
static void deinitEMInstance();
private:
static DrlEMImpl* emInstance;
};
class DrlEMImpl : public EM_PC_Interface {
public:
DrlEMImpl();
virtual ~DrlEMImpl();
virtual bool init();
virtual void deinit();
virtual void executeMethod(jmethodID meth, jvalue *return_value, jvalue *args);
virtual JIT_Result compileMethod(Method_Handle method_handle);
virtual void registerCodeChunk(Method_Handle method_handle, void *code_addr,
size_t size, void *data);
virtual Method_Handle lookupCodeChunk(void *addr, Boolean is_ip_past,
void **code_addr, size_t *size, void **data);
virtual Boolean unregisterCodeChunk(void *addr);
virtual unsigned int getNumProfilerThreads() const { return tbsClients.empty() ? 0 : 1;}
virtual void classloaderUnloadingCallback(Class_Loader_Handle class_handle);
//EM_PC interface impl:
virtual void methodProfileIsReady(MethodProfile* mp);
virtual bool needTbsThreadSupport() const;
virtual void tbsTimeout();
virtual int getTbsTimeout() const;
//EM PC access interface
ProfileCollector* getProfileCollector(EM_PCTYPE type, JIT_Handle jh, EM_JIT_PC_Role jitRole) const;
private:
void initProfileAccess();
std::string readConfiguration();
void buildChains(std::string& config);
bool initJIT(const std::string& libName, apr_dso_handle_t* libHandle, RStep& step);
bool initProfileCollectors(RChain* chain, const std::string& config);
ProfileCollector* createProfileCollector(const std::string& profilerName, const std::string& config, RStep* step);
ProfileCollector* getProfileCollector(const std::string& name) const;
std::string getJITLibFromCmdLine(const std::string& jitName) const;
void deallocateResources();
JIT_Handle jh;
void (*_execute_method) (JIT_Handle jit, jmethodID method, jvalue *return_value, jvalue *args);
RChains chains;
size_t nMethodsCompiled, nMethodsRecompiled;
ProfileCollectors collectors;
TbsClients tbsClients;
EM_ProfileAccessInterface profileAccessInterface;
U_32 tick;
osmutex_t recompilationLock;
std::set<Method_Profile_Handle> methodsInRecompile;
Method_Lookup_Table method_lookup_table;
};
#endif