blob: beeeabf4f9d3ecd225c04c6dcb7a50aeaa91a6e3 [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 _METHOD_LOOKUP_H_
#define _METHOD_LOOKUP_H_
#include "open/em.h"
#include "open/hythread_ext.h"
#include "port_mutex.h"
class Method_Lookup_Table;
class Method_Code
{
private:
friend class Method_Lookup_Table;
Method_Code(Method_Handle mh, void *ca, size_t s, void *d) :
method(mh),
code_addr(ca),
size(s),
data(d)
{
}
Method_Handle method;
void *code_addr;
size_t size;
void *data;
};
class Method_Lookup_Table
{
public:
Method_Lookup_Table();
~Method_Lookup_Table();
void add(Method_Handle method_handle, void *code_addr,
size_t size, void *data);
Method_Handle find(void *ip, Boolean is_ip_past, void **code_addr, size_t *size,
void **data);
Boolean remove(void *code_addr);
private:
void add(Method_Code *m);
Method_Code *find(void *addr, Boolean is_ip_past);
unsigned size() { return _next_free_entry; }
Method_Code *get(unsigned i);
// Resembles add, but appends the new entry m at the end of the table. The new entry must have a starting address above all entries
// in the table. This method does not acquire p_meth_addr_table_lock, so insertion must be protected by another lock or scheme.
void append_unlocked(Method_Code *m);
void unload_all();
#ifdef _DEBUG
void dump();
void verify();
#endif //_DEBUG
#ifdef VM_STATS
void print_stats();
#endif
void table_lock()
{
UNREF UDATA r = port_mutex_lock(&lock);
assert(TM_ERROR_NONE == r);
}
void table_unlock()
{
UNREF UDATA r = port_mutex_unlock(&lock);
assert(TM_ERROR_NONE == r);
}
// An iterator for methods compiled by the specific JIT.
Method_Code *get_first_method_jit(JIT_Handle *jit);
Method_Code *get_next_method_jit(Method_Code *prev_info);
// An iterator for all methods regardless of which JIT compiled them.
Method_Code *get_first_code_info();
Method_Code *get_next_code_info(Method_Code *prev_info);
Method_Code *find_deadlock_free(void *addr);
void reallocate(unsigned new_capacity);
unsigned find_index(void *addr);
unsigned _capacity;
unsigned _next_free_entry;
Method_Code **_table;
Method_Code **_cache;
osmutex_t lock;
}; //class Method_Lookup_Table
#endif //_METHOD_LOOKUP_H_