Revert "Make memorypool threadsafe "
This commit is contained in:
@@ -9,7 +9,6 @@ env:
|
|||||||
before_install:
|
before_install:
|
||||||
- sudo apt-get -qq update
|
- sudo apt-get -qq update
|
||||||
- sudo apt-get install -y libboost-test-dev
|
- sudo apt-get install -y libboost-test-dev
|
||||||
- sudo apt-get install -y libboost-thread-dev
|
|
||||||
- sudo apt-get install -y swig
|
- sudo apt-get install -y swig
|
||||||
|
|
||||||
#install:
|
#install:
|
||||||
|
|||||||
@@ -1183,10 +1183,9 @@ extern "C" {
|
|||||||
void DLLEXPORT EN_clearError(EN_ProjectHandle ph);
|
void DLLEXPORT EN_clearError(EN_ProjectHandle ph);
|
||||||
int DLLEXPORT EN_checkError(EN_ProjectHandle ph, char** msg_buffer);
|
int DLLEXPORT EN_checkError(EN_ProjectHandle ph, char** msg_buffer);
|
||||||
|
|
||||||
int DLLEXPORT EN_runproject(EN_ProjectHandle ph, const char *f1, const char *f2,
|
//int DLLEXPORT EN_epanet(EN_ProjectHandle ph, const char *f1, const char *f2,
|
||||||
const char *f3, void(*pviewprog)(char *));
|
// const char *f3, void(*pviewprog)(char *));
|
||||||
|
int DLLEXPORT EN_init(EN_ProjectHandle *ph, char *rptFile, char *binOutFile,
|
||||||
int DLLEXPORT EN_init(EN_ProjectHandle ph, char *rptFile, char *binOutFile,
|
|
||||||
EN_FlowUnits UnitsType, EN_FormType HeadlossFormula);
|
EN_FlowUnits UnitsType, EN_FormType HeadlossFormula);
|
||||||
|
|
||||||
int DLLEXPORT EN_open(EN_ProjectHandle ph, const char *inpFile,
|
int DLLEXPORT EN_open(EN_ProjectHandle ph, const char *inpFile,
|
||||||
|
|||||||
22
src/epanet.c
22
src/epanet.c
@@ -613,28 +613,6 @@ int DLLEXPORT EN_deleteproject(EN_ProjectHandle *ph)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DLLEXPORT EN_runproject(EN_ProjectHandle ph, const char *f1, const char *f2,
|
|
||||||
const char *f3, void (*pviewprog)(char *))
|
|
||||||
{
|
|
||||||
int errcode = 0;
|
|
||||||
EN_Project *p = NULL;
|
|
||||||
|
|
||||||
ERRCODE(EN_open(ph, f1, f2, f3));
|
|
||||||
|
|
||||||
p = (EN_Project*)(ph);
|
|
||||||
p->viewprog = pviewprog;
|
|
||||||
|
|
||||||
if (p->out_files.Hydflag != USE) {
|
|
||||||
ERRCODE(EN_solveH(ph));
|
|
||||||
}
|
|
||||||
|
|
||||||
ERRCODE(EN_solveQ(ph));
|
|
||||||
ERRCODE(EN_report(ph));
|
|
||||||
|
|
||||||
EN_close(ph);
|
|
||||||
|
|
||||||
return errcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DLLEXPORT EN_init(EN_ProjectHandle ph, char *f2, char *f3,
|
int DLLEXPORT EN_init(EN_ProjectHandle ph, char *f2, char *f3,
|
||||||
EN_FlowUnits UnitsType, EN_FormType HeadlossFormula)
|
EN_FlowUnits UnitsType, EN_FormType HeadlossFormula)
|
||||||
|
|||||||
@@ -21,12 +21,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "mempool.h"
|
#include "mempool.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#define THREAD_LOCAL __declspec(thread)
|
|
||||||
#else
|
|
||||||
#define THREAD_LOCAL __thread
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** ALLOC_BLOCK_SIZE - adjust this size to suit your installation - it
|
** ALLOC_BLOCK_SIZE - adjust this size to suit your installation - it
|
||||||
** should be reasonably large otherwise you will be mallocing a lot.
|
** should be reasonably large otherwise you will be mallocing a lot.
|
||||||
@@ -60,7 +54,7 @@ typedef struct alloc_root_s
|
|||||||
** root - Pointer to the current pool.
|
** root - Pointer to the current pool.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
THREAD_LOCAL alloc_root_t *root;
|
static alloc_root_t *root;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -17,35 +17,15 @@ enable_testing()
|
|||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
|
||||||
|
|
||||||
if(UNIX)
|
#Prep ourselves for compiling boost
|
||||||
set(CMAKE_CXX_FLAGS "-std=c++11")
|
find_package(Boost REQUIRED)
|
||||||
endif(UNIX)
|
|
||||||
|
|
||||||
|
|
||||||
#Prep ourselves to link with boost
|
|
||||||
if(MSVC)
|
|
||||||
set(Boost_DEBUG OFF)
|
|
||||||
set(Boost_DETAILED_FAILURE_MSG OFF)
|
|
||||||
set(Boost_THREADAPI win32)
|
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
|
||||||
endif(MSVC)
|
|
||||||
set(Boost_THREAD_FOUND OFF)
|
|
||||||
find_package(Boost COMPONENTS thread)
|
|
||||||
include_directories (${Boost_INCLUDE_DIRS})
|
include_directories (${Boost_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
|
||||||
#Test files are in separate source directory called tests
|
#I like to keep test files in a separate source directory called test
|
||||||
file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} test_*.cpp)
|
file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} test_*.cpp)
|
||||||
|
|
||||||
|
|
||||||
# If thread library is not found skip the reentrancy test
|
|
||||||
MESSAGE( STATUS "Thread found: " ${Boost_THREAD_FOUND})
|
|
||||||
if(NOT ${Boost_THREAD_FOUND})
|
|
||||||
list(REMOVE_ITEM TEST_SRCS test_reent.cpp)
|
|
||||||
MESSAGE("${TEST_SRCS}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
#Run through each source
|
#Run through each source
|
||||||
foreach(testSrc ${TEST_SRCS})
|
foreach(testSrc ${TEST_SRCS})
|
||||||
#Extract the filename without an extension (NAME_WE)
|
#Extract the filename without an extension (NAME_WE)
|
||||||
|
|||||||
@@ -1,178 +0,0 @@
|
|||||||
[TITLE]
|
|
||||||
EPANET Example Network 1
|
|
||||||
A simple example of modeling chlorine decay. Both bulk and
|
|
||||||
wall reactions are included.
|
|
||||||
|
|
||||||
[JUNCTIONS]
|
|
||||||
;ID Elev Demand Pattern
|
|
||||||
10 710 0 ;
|
|
||||||
11 710 150 ;
|
|
||||||
12 700 150 ;
|
|
||||||
13 695 100 ;
|
|
||||||
21 700 150 ;
|
|
||||||
22 695 200 ;
|
|
||||||
23 690 150 ;
|
|
||||||
31 700 100 ;
|
|
||||||
32 710 100 ;
|
|
||||||
|
|
||||||
[RESERVOIRS]
|
|
||||||
;ID Head Pattern
|
|
||||||
9 800 ;
|
|
||||||
|
|
||||||
[TANKS]
|
|
||||||
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
|
|
||||||
2 850 120 100 150 50.5 0 ;
|
|
||||||
|
|
||||||
[PIPES]
|
|
||||||
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
|
|
||||||
10 10 11 10530 18 100 0 Open ;
|
|
||||||
11 11 12 5280 14 100 0 Open ;
|
|
||||||
12 12 13 5280 10 100 0 Open ;
|
|
||||||
21 21 22 5280 10 100 0 Open ;
|
|
||||||
22 22 23 5280 12 100 0 Open ;
|
|
||||||
31 31 32 5280 6 100 0 Open ;
|
|
||||||
110 2 12 200 18 100 0 Open ;
|
|
||||||
111 11 21 5280 10 100 0 Open ;
|
|
||||||
112 12 22 5280 12 100 0 Open ;
|
|
||||||
113 13 23 5280 8 100 0 Open ;
|
|
||||||
121 21 31 5280 8 100 0 Open ;
|
|
||||||
122 22 32 5280 6 100 0 Open ;
|
|
||||||
|
|
||||||
[PUMPS]
|
|
||||||
;ID Node1 Node2 Parameters
|
|
||||||
9 9 10 HEAD 1 ;
|
|
||||||
|
|
||||||
[VALVES]
|
|
||||||
;ID Node1 Node2 Diameter Type Setting MinorLoss
|
|
||||||
|
|
||||||
[TAGS]
|
|
||||||
|
|
||||||
[DEMANDS]
|
|
||||||
;Junction Demand Pattern Category
|
|
||||||
|
|
||||||
[STATUS]
|
|
||||||
;ID Status/Setting
|
|
||||||
|
|
||||||
[PATTERNS]
|
|
||||||
;ID Multipliers
|
|
||||||
;Demand Pattern
|
|
||||||
1 1.0 1.2 1.4 1.6 1.4 1.2
|
|
||||||
1 1.0 0.8 0.6 0.4 0.6 0.8
|
|
||||||
|
|
||||||
[CURVES]
|
|
||||||
;ID X-Value Y-Value
|
|
||||||
;PUMP: Pump Curve for Pump 9
|
|
||||||
1 1500 250
|
|
||||||
|
|
||||||
[CONTROLS]
|
|
||||||
LINK 9 OPEN IF NODE 2 BELOW 110
|
|
||||||
LINK 9 CLOSED IF NODE 2 ABOVE 140
|
|
||||||
|
|
||||||
|
|
||||||
[RULES]
|
|
||||||
|
|
||||||
[ENERGY]
|
|
||||||
Global Efficiency 75
|
|
||||||
Global Price 0.0
|
|
||||||
Demand Charge 0.0
|
|
||||||
|
|
||||||
[EMITTERS]
|
|
||||||
;Junction Coefficient
|
|
||||||
|
|
||||||
[QUALITY]
|
|
||||||
;Node InitQual
|
|
||||||
10 0.5
|
|
||||||
11 0.5
|
|
||||||
12 0.5
|
|
||||||
13 0.5
|
|
||||||
21 0.5
|
|
||||||
22 0.5
|
|
||||||
23 0.5
|
|
||||||
31 0.5
|
|
||||||
32 0.5
|
|
||||||
9 1.0
|
|
||||||
2 1.0
|
|
||||||
|
|
||||||
[SOURCES]
|
|
||||||
;Node Type Quality Pattern
|
|
||||||
|
|
||||||
[REACTIONS]
|
|
||||||
;Type Pipe/Tank Coefficient
|
|
||||||
|
|
||||||
|
|
||||||
[REACTIONS]
|
|
||||||
Order Bulk 1
|
|
||||||
Order Tank 1
|
|
||||||
Order Wall 1
|
|
||||||
Global Bulk -.5
|
|
||||||
Global Wall -1
|
|
||||||
Limiting Potential 0.0
|
|
||||||
Roughness Correlation 0.0
|
|
||||||
|
|
||||||
[MIXING]
|
|
||||||
;Tank Model
|
|
||||||
|
|
||||||
[TIMES]
|
|
||||||
Duration 24:00
|
|
||||||
Hydraulic Timestep 1:00
|
|
||||||
Quality Timestep 0:05
|
|
||||||
Pattern Timestep 2:00
|
|
||||||
Pattern Start 0:00
|
|
||||||
Report Timestep 1:00
|
|
||||||
Report Start 0:00
|
|
||||||
Start ClockTime 12 am
|
|
||||||
Statistic None
|
|
||||||
|
|
||||||
[REPORT]
|
|
||||||
Status Yes
|
|
||||||
Summary No
|
|
||||||
Page 0
|
|
||||||
|
|
||||||
[OPTIONS]
|
|
||||||
Units GPM
|
|
||||||
Headloss H-W
|
|
||||||
Specific Gravity 1.0
|
|
||||||
Viscosity 1.0
|
|
||||||
Trials 40
|
|
||||||
Accuracy 0.001
|
|
||||||
CHECKFREQ 2
|
|
||||||
MAXCHECK 10
|
|
||||||
DAMPLIMIT 0
|
|
||||||
Unbalanced Continue 10
|
|
||||||
Pattern 1
|
|
||||||
Demand Multiplier 1.0
|
|
||||||
Emitter Exponent 0.5
|
|
||||||
Quality Chlorine mg/L
|
|
||||||
Diffusivity 1.0
|
|
||||||
Tolerance 0.01
|
|
||||||
|
|
||||||
[COORDINATES]
|
|
||||||
;Node X-Coord Y-Coord
|
|
||||||
10 20.00 70.00
|
|
||||||
11 30.00 70.00
|
|
||||||
12 50.00 70.00
|
|
||||||
13 70.00 70.00
|
|
||||||
21 30.00 40.00
|
|
||||||
22 50.00 40.00
|
|
||||||
23 70.00 40.00
|
|
||||||
31 30.00 10.00
|
|
||||||
32 50.00 10.00
|
|
||||||
9 10.00 70.00
|
|
||||||
2 50.00 90.00
|
|
||||||
|
|
||||||
[VERTICES]
|
|
||||||
;Link X-Coord Y-Coord
|
|
||||||
|
|
||||||
[LABELS]
|
|
||||||
;X-Coord Y-Coord Label & Anchor Node
|
|
||||||
6.99 73.63 "Source"
|
|
||||||
13.48 68.13 "Pump"
|
|
||||||
43.85 91.21 "Tank"
|
|
||||||
|
|
||||||
[BACKDROP]
|
|
||||||
DIMENSIONS 7.00 6.00 73.00 94.00
|
|
||||||
UNITS None
|
|
||||||
FILE
|
|
||||||
OFFSET 0.00 0.00
|
|
||||||
|
|
||||||
[END]
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
[TITLE]
|
|
||||||
EPANET Example Network 1
|
|
||||||
A simple example of modeling chlorine decay. Both bulk and
|
|
||||||
wall reactions are included.
|
|
||||||
|
|
||||||
[JUNCTIONS]
|
|
||||||
;ID Elev Demand Pattern
|
|
||||||
10 710 0 ;
|
|
||||||
11 710 150 ;
|
|
||||||
12 700 150 ;
|
|
||||||
13 695 100 ;
|
|
||||||
21 700 150 ;
|
|
||||||
22 695 200 ;
|
|
||||||
23 690 150 ;
|
|
||||||
31 700 100 ;
|
|
||||||
32 710 100 ;
|
|
||||||
|
|
||||||
[RESERVOIRS]
|
|
||||||
;ID Head Pattern
|
|
||||||
9 800 ;
|
|
||||||
|
|
||||||
[TANKS]
|
|
||||||
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
|
|
||||||
2 850 120 100 150 50.5 0 ;
|
|
||||||
|
|
||||||
[PIPES]
|
|
||||||
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
|
|
||||||
10 10 11 10530 18 100 0 Open ;
|
|
||||||
11 11 12 5280 14 100 0 Open ;
|
|
||||||
12 12 13 5280 10 100 0 Open ;
|
|
||||||
21 21 22 5280 10 100 0 Open ;
|
|
||||||
22 22 23 5280 12 100 0 Open ;
|
|
||||||
31 31 32 5280 6 100 0 Open ;
|
|
||||||
110 2 12 200 18 100 0 Open ;
|
|
||||||
111 11 21 5280 10 100 0 Open ;
|
|
||||||
112 12 22 5280 12 100 0 Open ;
|
|
||||||
113 13 23 5280 8 100 0 Open ;
|
|
||||||
121 21 31 5280 8 100 0 Open ;
|
|
||||||
122 22 32 5280 6 100 0 Open ;
|
|
||||||
|
|
||||||
[PUMPS]
|
|
||||||
;ID Node1 Node2 Parameters
|
|
||||||
9 9 10 HEAD 1 ;
|
|
||||||
|
|
||||||
[VALVES]
|
|
||||||
;ID Node1 Node2 Diameter Type Setting MinorLoss
|
|
||||||
|
|
||||||
[TAGS]
|
|
||||||
|
|
||||||
[DEMANDS]
|
|
||||||
;Junction Demand Pattern Category
|
|
||||||
|
|
||||||
[STATUS]
|
|
||||||
;ID Status/Setting
|
|
||||||
|
|
||||||
[PATTERNS]
|
|
||||||
;ID Multipliers
|
|
||||||
;Demand Pattern
|
|
||||||
1 1.0 1.2 1.4 1.6 1.4 1.2
|
|
||||||
1 1.0 0.8 0.6 0.4 0.6 0.8
|
|
||||||
|
|
||||||
[CURVES]
|
|
||||||
;ID X-Value Y-Value
|
|
||||||
;PUMP: Pump Curve for Pump 9
|
|
||||||
1 1500 250
|
|
||||||
|
|
||||||
[CONTROLS]
|
|
||||||
LINK 9 OPEN IF NODE 2 BELOW 110
|
|
||||||
LINK 9 CLOSED IF NODE 2 ABOVE 140
|
|
||||||
|
|
||||||
|
|
||||||
[RULES]
|
|
||||||
|
|
||||||
[ENERGY]
|
|
||||||
Global Efficiency 75
|
|
||||||
Global Price 0.0
|
|
||||||
Demand Charge 0.0
|
|
||||||
|
|
||||||
[EMITTERS]
|
|
||||||
;Junction Coefficient
|
|
||||||
|
|
||||||
[QUALITY]
|
|
||||||
;Node InitQual
|
|
||||||
10 0.5
|
|
||||||
11 0.5
|
|
||||||
12 0.5
|
|
||||||
13 0.5
|
|
||||||
21 0.5
|
|
||||||
22 0.5
|
|
||||||
23 0.5
|
|
||||||
31 0.5
|
|
||||||
32 0.5
|
|
||||||
9 1.0
|
|
||||||
2 1.0
|
|
||||||
|
|
||||||
[SOURCES]
|
|
||||||
;Node Type Quality Pattern
|
|
||||||
|
|
||||||
[REACTIONS]
|
|
||||||
;Type Pipe/Tank Coefficient
|
|
||||||
|
|
||||||
|
|
||||||
[REACTIONS]
|
|
||||||
Order Bulk 1
|
|
||||||
Order Tank 1
|
|
||||||
Order Wall 1
|
|
||||||
Global Bulk -.5
|
|
||||||
Global Wall -1
|
|
||||||
Limiting Potential 0.0
|
|
||||||
Roughness Correlation 0.0
|
|
||||||
|
|
||||||
[MIXING]
|
|
||||||
;Tank Model
|
|
||||||
|
|
||||||
[TIMES]
|
|
||||||
Duration 24:00
|
|
||||||
Hydraulic Timestep 1:00
|
|
||||||
Quality Timestep 0:05
|
|
||||||
Pattern Timestep 2:00
|
|
||||||
Pattern Start 0:00
|
|
||||||
Report Timestep 1:00
|
|
||||||
Report Start 0:00
|
|
||||||
Start ClockTime 12 am
|
|
||||||
Statistic None
|
|
||||||
|
|
||||||
[REPORT]
|
|
||||||
Status Yes
|
|
||||||
Summary No
|
|
||||||
Page 0
|
|
||||||
|
|
||||||
[OPTIONS]
|
|
||||||
Units GPM
|
|
||||||
Headloss H-W
|
|
||||||
Specific Gravity 1.0
|
|
||||||
Viscosity 1.0
|
|
||||||
Trials 40
|
|
||||||
Accuracy 0.001
|
|
||||||
CHECKFREQ 2
|
|
||||||
MAXCHECK 10
|
|
||||||
DAMPLIMIT 0
|
|
||||||
Unbalanced Continue 10
|
|
||||||
Pattern 1
|
|
||||||
Demand Multiplier 1.0
|
|
||||||
Emitter Exponent 0.5
|
|
||||||
Quality Chlorine mg/L
|
|
||||||
Diffusivity 1.0
|
|
||||||
Tolerance 0.01
|
|
||||||
|
|
||||||
[COORDINATES]
|
|
||||||
;Node X-Coord Y-Coord
|
|
||||||
10 20.00 70.00
|
|
||||||
11 30.00 70.00
|
|
||||||
12 50.00 70.00
|
|
||||||
13 70.00 70.00
|
|
||||||
21 30.00 40.00
|
|
||||||
22 50.00 40.00
|
|
||||||
23 70.00 40.00
|
|
||||||
31 30.00 10.00
|
|
||||||
32 50.00 10.00
|
|
||||||
9 10.00 70.00
|
|
||||||
2 50.00 90.00
|
|
||||||
|
|
||||||
[VERTICES]
|
|
||||||
;Link X-Coord Y-Coord
|
|
||||||
|
|
||||||
[LABELS]
|
|
||||||
;X-Coord Y-Coord Label & Anchor Node
|
|
||||||
6.99 73.63 "Source"
|
|
||||||
13.48 68.13 "Pump"
|
|
||||||
43.85 91.21 "Tank"
|
|
||||||
|
|
||||||
[BACKDROP]
|
|
||||||
DIMENSIONS 7.00 6.00 73.00 94.00
|
|
||||||
UNITS None
|
|
||||||
FILE
|
|
||||||
OFFSET 0.00 0.00
|
|
||||||
|
|
||||||
[END]
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
* test_reent.cpp
|
|
||||||
*
|
|
||||||
* Created: 8/30/2018
|
|
||||||
* Author: Michael E. Tryby
|
|
||||||
* US EPA - ORD/NRMRL
|
|
||||||
*
|
|
||||||
* Unit testing for EPANET Output API.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <boost/thread.hpp>
|
|
||||||
|
|
||||||
#include "epanet2.h"
|
|
||||||
|
|
||||||
#define NUM_THREADS 2
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
void epanet_thread(long i)
|
|
||||||
{
|
|
||||||
int errorcode = 0;
|
|
||||||
EN_ProjectHandle ph;
|
|
||||||
|
|
||||||
string prefix = "example_";
|
|
||||||
string suffix = ".inp";
|
|
||||||
string input = prefix + to_string(static_cast<long long>(i)) + suffix;
|
|
||||||
|
|
||||||
suffix = ".rpt";
|
|
||||||
string report = prefix + to_string(static_cast<long long>(i)) + suffix;
|
|
||||||
|
|
||||||
suffix = ".out";
|
|
||||||
string output = prefix + to_string(static_cast<long long>(i)) + suffix;
|
|
||||||
|
|
||||||
printf("Thread #%ld starting EPANET ...\n", i);
|
|
||||||
|
|
||||||
EN_createproject(&ph);
|
|
||||||
errorcode = EN_runproject(ph, input.c_str(), report.c_str(), output.c_str(), NULL);
|
|
||||||
EN_deleteproject(&ph);
|
|
||||||
|
|
||||||
printf("Thread #%ld EPANET done. Status = %d\n", i, errorcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
long i;
|
|
||||||
boost::thread *threads[NUM_THREADS];
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_THREADS; i++) {
|
|
||||||
threads[i] = new boost::thread(epanet_thread, i);
|
|
||||||
printf("Main: creating thread %ld.\n", i);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_THREADS; i++) {
|
|
||||||
threads[i]->join();
|
|
||||||
printf("Main: joining thread %ld.\n", i);
|
|
||||||
delete threads[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Main: program completed. Exiting.\n");
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user