Add a lock-free cache type for int->int functions

To be used for cmap and advance caching if desired.
pull/1/head
Behdad Esfahbod 13 years ago
parent bd908b4f10
commit 20fdb0f41d
  1. 2
      TODO
  2. 1
      src/Makefile.am
  3. 72
      src/hb-cache-private.hh
  4. 2
      src/hb-font.cc

@ -91,6 +91,8 @@ Tests to write:
- hb_set_t
- hb_cache_t and relatives
Optimizations:
=============

@ -19,6 +19,7 @@ HBSOURCES = \
hb-blob.cc \
hb-buffer-private.hh \
hb-buffer.cc \
hb-cache-private.hh \
hb-common.cc \
hb-fallback-shape-private.hh \
hb-fallback-shape.cc \

@ -0,0 +1,72 @@
/*
* Copyright © 2012 Google, Inc.
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_CACHE_PRIVATE_HH
#define HB_CACHE_PRIVATE_HH
#include "hb-private.hh"
/* Implements a lock-free cache for int->int functions. */
template <unsigned int key_bits, unsigned int value_bits, unsigned int cache_bits>
struct hb_cache_t
{
ASSERT_STATIC (key_bits >= cache_bits);
ASSERT_STATIC (key_bits + value_bits - cache_bits < 8 * sizeof (hb_atomic_int_t));
inline void clear (void)
{
memset (values, 255, sizeof (values));
}
inline bool get (unsigned int key, unsigned int *value)
{
unsigned int k = key & ((1<<cache_bits)-1);
unsigned int v = hb_atomic_int_get (values[k]);
if ((v >> value_bits) != (key >> cache_bits))
return false;
}
inline bool set (unsigned int key, unsigned int value)
{
if (unlikely ((key >> key_bits) || (value >> value_bits)))
return false; /* Overflows */
unsigned int k = key & ((1<<cache_bits)-1);
unsigned int v = ((key>>cache_bits)<<value_bits) | value;
hb_atomic_int_set (values[k], v);
return true;
}
private:
hb_atomic_int_t values[1<<cache_bits];
};
typedef hb_cache_t<21, 16, 8> hb_cmap_cache_t;
typedef hb_cache_t<16, 24, 8> hb_advance_cache_t;
#endif /* HB_CACHE_PRIVATE_HH */

@ -33,6 +33,8 @@
#include "hb-open-file-private.hh"
#include "hb-ot-head-table.hh"
#include "hb-cache-private.hh"
#include <string.h>

Loading…
Cancel
Save