Add atomicity to whereever needed.



git-svn-id: http://sfntly.googlecode.com/svn/trunk/cpp/src@89 672e30a5-4c29-85ac-ac6d-611c735e0a51
diff --git a/sfntly/data/readable_font_data.cc b/sfntly/data/readable_font_data.cc
index ec67757..fb083cb 100644
--- a/sfntly/data/readable_font_data.cc
+++ b/sfntly/data/readable_font_data.cc
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-#include "sfntly/data/memory_byte_array.h"
 #include "sfntly/data/readable_font_data.h"
 
 #include <stdio.h>
 
+#include "sfntly/data/memory_byte_array.h"
 #include "sfntly/data/writable_font_data.h"
 #include "sfntly/port/exception_type.h"
 
@@ -45,7 +45,7 @@
 }
 
 int64_t ReadableFontData::Checksum() {
-  // TODO(arthurhsu): IMPLEMENT: atomicity
+  AutoLock lock(checksum_lock_);
   if (!checksum_set_) {
     ComputeChecksum();
   }
diff --git a/sfntly/data/readable_font_data.h b/sfntly/data/readable_font_data.h
index a0d341f..c5833e8 100644
--- a/sfntly/data/readable_font_data.h
+++ b/sfntly/data/readable_font_data.h
@@ -17,8 +17,8 @@
 #ifndef SFNTLY_CPP_SRC_SFNTLY_DATA_READABLE_FONT_DATA_H_
 #define SFNTLY_CPP_SRC_SFNTLY_DATA_READABLE_FONT_DATA_H_
 
-#include "sfntly/port/refcount.h"
 #include "sfntly/data/font_data.h"
+#include "sfntly/port/lock.h"
 
 namespace sfntly {
 
@@ -290,7 +290,8 @@
   // @return the checksum for the total range
   int64_t ComputeCheckSum(int32_t low_bound, int32_t high_bound);
 
-  bool checksum_set_;  // TODO(arthurhsu): IMPLEMENT: must be set atomically.
+  Lock checksum_lock_;
+  bool checksum_set_;
   int64_t checksum_;
   IntegerList checksum_range_;
 };
diff --git a/sfntly/table/bitmap/bitmap_size_table.cc b/sfntly/table/bitmap/bitmap_size_table.cc
index 2b5b9bb..00488ea 100644
--- a/sfntly/table/bitmap/bitmap_size_table.cc
+++ b/sfntly/table/bitmap/bitmap_size_table.cc
@@ -134,6 +134,7 @@
 }
 
 IndexSubTableList* BitmapSizeTable::GetIndexSubTableList() {
+  AutoLock lock(atomic_subtables_lock_);
   if (atomic_subtables.empty()) {
     for (int32_t i = 0; i < NumberOfIndexSubTables(); ++i) {
       IndexSubTablePtr table;
diff --git a/sfntly/table/bitmap/bitmap_size_table.h b/sfntly/table/bitmap/bitmap_size_table.h
index 3b8e30c..ee58bca 100644
--- a/sfntly/table/bitmap/bitmap_size_table.h
+++ b/sfntly/table/bitmap/bitmap_size_table.h
@@ -19,6 +19,7 @@
 
 #include <vector>
 
+#include "sfntly/port/lock.h"
 #include "sfntly/table/bitmap/index_sub_table.h"
 
 namespace sfntly {
@@ -58,6 +59,7 @@
   IndexSubTableList* GetIndexSubTableList();
 
   ReadableFontDataPtr master_data_;
+  Lock atomic_subtables_lock_;
   IndexSubTableList atomic_subtables;
 };
 typedef Ptr<BitmapSizeTable> BitmapSizeTablePtr;
diff --git a/sfntly/table/bitmap/eblc_table.cc b/sfntly/table/bitmap/eblc_table.cc
index a198c10..decbadf 100644
--- a/sfntly/table/bitmap/eblc_table.cc
+++ b/sfntly/table/bitmap/eblc_table.cc
@@ -48,7 +48,7 @@
 }
 
 BitmapSizeTableList* EblcTable::GetBitmapSizeTableList() {
-  // TODO(arthurhsu): thread locking.
+  AutoLock lock(bitmap_size_table_lock_);
   if (bitmap_size_table_.empty()) {
     CreateBitmapSizeTable(data_, NumSizes(), &bitmap_size_table_);
   }
diff --git a/sfntly/table/bitmap/eblc_table.h b/sfntly/table/bitmap/eblc_table.h
index bf7cb15..84831ef 100644
--- a/sfntly/table/bitmap/eblc_table.h
+++ b/sfntly/table/bitmap/eblc_table.h
@@ -17,6 +17,7 @@
 #ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBLC_TABLE_H_
 #define SFNTLY_CPP_SRC_SFNTLY_TABLE_BITMAP_EBLC_TABLE_H_
 
+#include "sfntly/port/lock.h"
 #include "sfntly/table/bitmap/bitmap_glyph.h"
 #include "sfntly/table/bitmap/bitmap_size_table.h"
 #include "sfntly/table/subtable_container_table.h"
@@ -145,7 +146,7 @@
                                     int32_t num_sizes,
                                     BitmapSizeTableList* output);
 
-  // TODO(arthurhsu): this table must be accessed atomically.
+  Lock bitmap_size_table_lock_;
   BitmapSizeTableList bitmap_size_table_;
 };
 typedef Ptr<EblcTable> EblcTablePtr;