Просмотр исходного кода

Merge pull request #22 from jwilberding/master

Updates for better building
Seth Falcon 11 лет назад
Родитель
Сommit
fee0aa40a0
6 измененных файлов с 104 добавлено и 21 удалено
  1. 11 1
      .travis.yml
  2. 65 10
      Makefile
  3. 3 0
      cover.spec
  4. 11 1
      rebar.config
  5. 5 5
      src/pooler.erl
  6. 9 4
      src/pooler.hrl

+ 11 - 1
.travis.yml

@@ -1,5 +1,15 @@
 language: erlang
 otp_release:
-  - 17.0-rc1
+  - 17.0
   - R16B03-1
+  - R16B03
+  - R16B02
+  - R16B01
+  - R16B
   - R15B03
+  - R15B02
+  - R15B01
+  - R15B
+  - R14B04
+  - R14B03
+  - R14B02

+ 65 - 10
Makefile

@@ -1,25 +1,80 @@
+ERLFLAGS= -pa $(CURDIR)/.eunit -pa $(CURDIR)/ebin -pa $(CURDIR)/deps/*/ebin
+
+DEPS_PLT=$(CURDIR)/.deps_plt
+
+# =============================================================================
+# Verify that the programs we need to run are installed on this system
+# =============================================================================
+ERL = $(shell which erl)
+
+ifeq ($(ERL),)
+$(error "Erlang not available on this system")
+endif
+
+REBAR=$(shell which rebar)
+
+# If building on travis, use the rebar in the current directory
+ifeq ($(TRAVIS),true)
+REBAR=$(CURDIR)/rebar
+endif
+
+ifeq ($(REBAR),)
+REBAR=$(CURDIR)/rebar
+endif
+
 .PHONY: all compile test dialyzer clean distclean doc
 
 all: compile test dialyzer
-	@rebar compile
 
-compile:
-	@rebar compile
+REBAR_URL=https://github.com/rebar/rebar/wiki/rebar
+$(REBAR):
+	curl -Lo rebar $(REBAR_URL) || wget $(REBAR_URL)
+	chmod a+x rebar
 
-test:
-	@rebar eunit skip_deps=true
+get-rebar: $(REBAR)
 
-dialyzer:
+compile: $(REBAR)
+	$(REBAR) compile
+
+eunit: compile clean-common-test-data
+	$(REBAR) skip_deps=true eunit
+
+ct: compile clean-common-test-data
+	mkdir -p $(CURDIR) logs
+	ct_run -pa $(CURDIR)/ebin \
+	-pa $(CURDIR)/deps/*/ebin \
+	-logdir $(CURDIR)/logs \
+	-dir $(CURDIR)/test/ \
+	-cover cover.spec
+
+test: compile dialyzer eunit ct
+
+$(DEPS_PLT): compile
+	@echo Building local erts plt at $(DEPS_PLT)
+	@echo
+	$(DIALYZER) --output_plt $(DEPS_PLT) --build_plt \
+	   --apps erts kernel stdlib -r deps
+
+dialyzer: compile $(DEPS_PLT)
 	@dialyzer -Wunderspecs -r ebin
 
 doc:
-	@rebar doc skip_deps=true
+	$(REBAR) doc skip_deps=true
+
+clean-common-test-data:
+# We have to do this because of the unique way we generate test
+# data. Without this rebar eunit gets very confused
+	- rm -rf $(CURDIR)/test/*_SUITE_data
 
-clean:
-	@rebar clean
+clean: clean-common-test-data $(REBAR)
+	- rm -rf $(CURDIR)/test/*.beam
+	- rm -rf $(CURDIR)/logs
+	- rm -rf $(CURDIR)/ebin
+	$(REBAR) skip_deps=true clean
 
 distclean: clean
-	@rebar delete-deps
+	- rm -rf $(DEPS_PLT)
+	$(REBAR) delete-deps
 
 demo_shell: compile test
 	@erl -pa .eunit ebin -config pooler-example -s pooler manual_start

+ 3 - 0
cover.spec

@@ -0,0 +1,3 @@
+%% -*- mode: Erlang; fill-column: 80; comment-column: 75; -*-
+{incl_app, pooler}.
+{level, details}.

+ 11 - 1
rebar.config

@@ -4,5 +4,15 @@
 %% Type spec dict() is deprecated in R17 to be removed in R18 in
 %% preference for dict:dict(). But the fix is not compatible with <=
 %% R16.
-{erl_opts, [nowarn_deprecated_type]}.
+%% Compiler Options ============================================================
+{erl_opts,
+    [{platform_define, "^[0-9]+", namespaced_types},
+     debug_info,
+     warnings_as_errors,
+     inline]}.
+
+%% EUnit =======================================================================
+{eunit_opts,
+ [{report, {eunit_surefire, [{dir, "."}]}}]}.
 {cover_enabled, true}.
+{cover_print_enabled, true}.

+ 5 - 5
src/pooler.erl

@@ -537,7 +537,7 @@ clean_group_table(MemberPid, #pool{group = _GroupName}) ->
 % If `Pid' is the last element in `CPid's pid list, then the `CPid'
 % entry is removed entirely.
 %
--spec cpmap_remove(pid(), pid() | free, dict()) -> dict().
+-spec cpmap_remove(pid(), pid() | free, p_dict()) -> p_dict().
 cpmap_remove(_Pid, free, CPMap) ->
     CPMap;
 cpmap_remove(Pid, CPid, CPMap) ->
@@ -594,18 +594,18 @@ remove_pid(Pid, Pool) ->
     end.
 
 -spec store_all_members(pid(),
-                        {reference(), free | pid(), {_, _, _}}, dict()) -> dict().
+                        {reference(), free | pid(), {_, _, _}}, p_dict()) -> p_dict().
 store_all_members(Pid, Val = {_MRef, _CPid, _Time}, AllMembers) ->
     dict:store(Pid, Val, AllMembers).
 
--spec set_cpid_for_member(pid(), pid(), dict()) -> dict().
+-spec set_cpid_for_member(pid(), pid(), p_dict()) -> p_dict().
 set_cpid_for_member(MemberPid, CPid, AllMembers) ->
     dict:update(MemberPid,
                 fun({MRef, free, Time = {_, _, _}}) ->
                         {MRef, CPid, Time}
                 end, AllMembers).
 
--spec add_member_to_consumer(pid(), pid(), dict()) -> dict().
+-spec add_member_to_consumer(pid(), pid(), p_dict()) -> p_dict().
 add_member_to_consumer(MemberPid, CPid, CPMap) ->
     %% we can't use dict:update here because we need to create the
     %% monitor if we aren't already tracking this consumer.
@@ -660,7 +660,7 @@ schedule_cull(PoolName, Delay) ->
     %% automatic cancelling
     erlang:send_after(DelayMillis, PoolName, cull_pool).
 
--spec member_info([pid()], dict()) -> [{pid(), member_info()}].
+-spec member_info([pid()], p_dict()) -> [{pid(), member_info()}].
 member_info(Pids, AllMembers) ->
     [ {P, dict:fetch(P, AllMembers)} || P <- Pids ].
 

+ 9 - 4
src/pooler.hrl

@@ -9,6 +9,12 @@
 -type time_unit() :: min | sec | ms | mu.
 -type time_spec() :: {non_neg_integer(), time_unit()}.
 
+-ifdef(namespaced_types).
+-type p_dict() :: dict:dict().
+-else.
+-type p_dict() :: dict().
+-endif.
+
 -record(pool, {
           name             :: atom(),
           group            :: atom(),
@@ -46,13 +52,14 @@
           %% Status is either 'free' or the consumer pid, and Time is
           %% an Erlang timestamp that records when the member became
           %% free.
-          all_members = dict:new()     :: dict(),
+
+          all_members = dict:new()     :: p_dict(),
 
           %% Maps consumer pid to a tuple of the form:
           %% {MonitorRef, MemberList} where MonitorRef is a monitor
           %% reference for the consumer and MemberList is a list of
           %% members being consumed.
-          consumer_to_pid = dict:new() :: dict(),
+          consumer_to_pid = dict:new() :: p_dict(),
 
           %% A list of `{References, Timestamp}' tuples representing
           %% new member start requests that are in-flight. The
@@ -72,5 +79,3 @@
 
 -define(gv(X, Y), proplists:get_value(X, Y)).
 -define(gv(X, Y, D), proplists:get_value(X, Y, D)).
-
-