Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial version of thread_safe gem.

  • Loading branch information...
commit bb5003d7ff799fccd5e184eec8fc823a894d5d9d 0 parents
@headius authored
17 .gitignore
@@ -0,0 +1,17 @@
+*.gem
+*.rbc
+.bundle
+.config
+.yardoc
+Gemfile.lock
+InstalledFiles
+_yardoc
+coverage
+doc/
+lib/bundler/man
+pkg
+rdoc
+spec/reports
+test/tmp
+test/version_tmp
+tmp
4 Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in thread_safe.gemspec
+gemspec
144 LICENSE
@@ -0,0 +1,144 @@
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as
+defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that
+is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that
+control, are controlled by, or are under common control with that entity. For the purposes
+of this definition, "control" means (i) the power, direct or indirect, to cause the
+direction or management of such entity, whether by contract or otherwise, or (ii) ownership
+of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of
+such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by
+this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not
+limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of
+a Source form, including but not limited to compiled object code, generated documentation,
+and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available
+under the License, as indicated by a copyright notice that is included in or attached to the
+work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on
+(or derived from) the Work and for which the editorial revisions, annotations, elaborations,
+or other modifications represent, as a whole, an original work of authorship. For the
+purposes of this License, Derivative Works shall not include works that remain separable
+from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works
+thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work
+and any modifications or additions to that Work or Derivative Works thereof, that is
+intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by
+an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the
+purposes of this definition, "submitted" means any form of electronic, verbal, or written
+communication sent to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and issue tracking
+systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and
+improving the Work, but excluding communication that is conspicuously marked or otherwise
+designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a
+Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each
+Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
+royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such Derivative
+Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each
+Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
+royalty-free, irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license
+applies only to those patent claims licensable by such Contributor that are necessarily
+infringed by their Contribution(s) alone or by combination of their Contribution(s) with the
+Work to which such Contribution(s) was submitted. If You institute patent litigation against
+any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or
+a Contribution incorporated within the Work constitutes direct or contributory patent
+infringement, then any patent licenses granted to You under this License for that Work shall
+terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works
+thereof in any medium, with or without modifications, and in Source or Object form, provided
+that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of this License;
+and
+
+You must cause any modified files to carry prominent notices stating that You changed the
+files; and
+
+You must retain, in the Source form of any Derivative Works that You distribute, all
+copyright, patent, trademark, and attribution notices from the Source form of the Work,
+excluding those notices that do not pertain to any part of the Derivative Works; and
+
+If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative
+Works that You distribute must include a readable copy of the attribution notices contained
+within such NOTICE file, excluding those notices that do not pertain to any part of the
+Derivative Works, in at least one of the following places: within a NOTICE text file
+distributed as part of the Derivative Works; within the Source form or documentation, if
+provided along with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of the NOTICE
+file are for informational purposes only and do not modify the License. You may add Your own
+attribution notices within Derivative Works that You distribute, alongside or as an addendum
+to the NOTICE text from the Work, provided that such additional attribution notices cannot
+be construed as modifying the License. You may add Your own copyright statement to Your
+modifications and may provide additional or different license terms and conditions for use,
+reproduction, or distribution of Your modifications, or for any such Derivative Works as a
+whole, provided Your use, reproduction, and distribution of the Work otherwise complies with
+the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution
+intentionally submitted for inclusion in the Work by You to the Licensor shall be under the
+terms and conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of any
+separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for reasonable and
+customary use in describing the origin of the Work and reproducing the content of the NOTICE
+file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing,
+Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS"
+BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including,
+without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for
+determining the appropriateness of using or redistributing the Work and assume any risks
+associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort
+(including negligence), contract, or otherwise, unless required by applicable law (such as
+deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental, or
+consequential damages of any character arising as a result of this License or out of the use
+or inability to use the Work (including but not limited to damages for loss of goodwill,
+work stoppage, computer failure or malfunction, or any and all other commercial damages or
+losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative
+Works thereof, You may choose to offer, and charge a fee for, acceptance of support,
+warranty, indemnity, or other liability obligations and/or rights consistent with this
+License. However, in accepting such obligations, You may act only on Your own behalf and on
+Your sole responsibility, not on behalf of any other Contributor, and only if You agree to
+indemnify, defend, and hold each Contributor harmless for any liability incurred by, or
+claims asserted against, such Contributor by reason of your accepting any such warranty or
+additional liability.
+
+END OF TERMS AND CONDITIONS
32 README.md
@@ -0,0 +1,32 @@
+# Threadsafe
+
+A collection of thread-safe versions of common core Ruby classes.
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+ gem 'thread_safe'
+
+And then execute:
+
+ $ bundle
+
+Or install it yourself as:
+
+ $ gem install thread_safe
+
+## Usage
+
+require 'thread_safe'
+
+sa = ThreadSafe::Array.new # supports standard Array.new forms
+sh = ThreadSafe::Hash.new # supports standard Hash.new forms
+
+## Contributing
+
+1. Fork it
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Commit your changes (`git commit -am 'Added some feature'`)
+4. Push to the branch (`git push origin my-new-feature`)
+5. Create new Pull Request
10 Rakefile
@@ -0,0 +1,10 @@
+#!/usr/bin/env rake
+require "bundler/gem_tasks"
+require 'rake/testtask'
+
+task :default => :test
+
+Rake::TestTask.new :test do |t|
+ t.libs << "lib"
+ t.test_files = FileList["test/**/*.rb"]
+end
BIN  lib/.DS_Store
Binary file not shown
20 lib/thread_safe.rb
@@ -0,0 +1,20 @@
+require 'thread_safe/version'
+
+if defined?(JRUBY_VERSION)
+ require 'jruby/synchronized'
+
+ module ThreadSafe
+ class Array < ::Array
+ include JRuby::Synchronized
+ end
+
+ class Hash < ::Hash
+ include JRuby::Synchronized
+ end
+ end
+else
+ module ThreadSafe
+ Array = ::Array
+ Hash = ::Hash
+ end
+end
BIN  lib/thread_safe/.DS_Store
Binary file not shown
3  lib/thread_safe/version.rb
@@ -0,0 +1,3 @@
+module Threadsafe
+ VERSION = "0.0.1"
+end
20 test/test_array.rb
@@ -0,0 +1,20 @@
+require 'test/unit'
+require 'thread_safe'
+
+class TestArray < Test::Unit::TestCase
+ def test_concurrency
+ ary = ThreadSafe::Array.new
+ assert_nothing_raised do
+ (1..100).map do |i|
+ Thread.new do
+ 1000.times do
+ ary << i
+ ary.each {|x| x * 2}
+ ary.shift
+ ary.last
+ end
+ end
+ end.map(&:join)
+ end
+ end
+end
20 test/test_hash.rb
@@ -0,0 +1,20 @@
+require 'test/unit'
+require 'thread_safe'
+
+class TestHash < Test::Unit::TestCase
+ def test_concurrency
+ hsh = ThreadSafe::Hash.new
+ assert_nothing_raised do
+ (1..100).map do |i|
+ Thread.new do
+ 1000.times do |j|
+ hsh[i*1000+j] = i
+ hsh.each {|k,v| k + v}
+ hsh[i*1000+j]
+ hsh.delete(i*1000+j)
+ end
+ end
+ end.map(&:join)
+ end
+ end
+end
17 thread_safe.gemspec
@@ -0,0 +1,17 @@
+# -*- encoding: utf-8 -*-
+require File.expand_path('../lib/thread_safe/version', __FILE__)
+
+Gem::Specification.new do |gem|
+ gem.authors = ["Charles Oliver Nutter"]
+ gem.email = ["headius@headius.com"]
+ gem.description = %q{Thread-safe collections and utilities for Ruby}
+ gem.summary = %q{A collection of data structures and utilities to make thread-safe programming in Ruby easier}
+ gem.homepage = "https://github.com/headius/thread_safe"
+
+ gem.files = `git ls-files`.split($\)
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
+ gem.name = "thread_safe"
+ gem.require_paths = ["lib"]
+ gem.version = Threadsafe::VERSION
+end
Please sign in to comment.
Something went wrong with that request. Please try again.