/* * Copyright (C) 2014 Indeed Inc. * * Licensed 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. */ package com.indeed.imhotep.local; import com.indeed.util.core.nativelibs.NativeLibraryUtils; import com.indeed.util.mmap.DirectMemory; import org.apache.log4j.Logger; import sun.misc.Unsafe; import java.lang.reflect.Field; /** * @author jplaisance */ public final class NativeMetricRegroupInternals { private static final Logger log = Logger.getLogger(NativeMetricRegroupInternals.class); private static final Unsafe UNSAFE; private static final long INT_ARRAY_BASE_OFFSET; static { try { NativeLibraryUtils.loadLibrary("metricregroup", "1.0.1"); final Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); UNSAFE = (Unsafe)theUnsafe.get(null); INT_ARRAY_BASE_OFFSET = UNSAFE.arrayBaseOffset(int[].class); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } public static void calculateGroups(final int min, final int max, final long magicNumber, final int numBuckets, final int n, int[] valBuf, int[] docGroupBuffer, DirectMemory nativeValBuf, DirectMemory nativeDocGroupBuffer) { final long valBufAddress = nativeValBuf.getAddress(); UNSAFE.copyMemory(valBuf, INT_ARRAY_BASE_OFFSET, null, valBufAddress, 4*n); final long docGroupBufferAddress = nativeDocGroupBuffer.getAddress(); calculateGroups(min, max, magicNumber, numBuckets, n, valBufAddress, docGroupBufferAddress); UNSAFE.copyMemory(null, docGroupBufferAddress, docGroupBuffer, INT_ARRAY_BASE_OFFSET, 4*n); } public static native long getMagicNumber(int divisor); public static native void calculateGroups(final int min, final int max, final long magicNumber, final int numBuckets, final int n, long nativeValBufAddress, long nativeDocGroupBufferAddress); }