diff options
| author | Ruben <ruben.nellen@gmail.com> | 2016-10-12 13:09:02 +0200 | 
|---|---|---|
| committer | Kurt Jung <kurt.w.jung@gmail.com> | 2016-10-12 07:09:02 -0400 | 
| commit | a8ed28c5f45a8bb6c60cdc76464c34ccecf7b7a7 (patch) | |
| tree | 30e591d2a36ee6988e6196410df74182b6e5c257 /contrib/barcode | |
| parent | 34e60518f28a6283996284f9b909bc9515c67c79 (diff) | |
added mutex to barcode cache (#85)
to prevent race condition
Diffstat (limited to 'contrib/barcode')
| -rw-r--r-- | contrib/barcode/barcode.go | 21 | 
1 files changed, 15 insertions, 6 deletions
| diff --git a/contrib/barcode/barcode.go b/contrib/barcode/barcode.go index b2ba2c2..8fb371e 100644 --- a/contrib/barcode/barcode.go +++ b/contrib/barcode/barcode.go @@ -23,7 +23,7 @@ import (  	"image/jpeg"  	"io"  	"strconv" - +	"sync"  	"github.com/boombuler/barcode"  	"github.com/boombuler/barcode/codabar"  	"github.com/boombuler/barcode/code128" @@ -38,7 +38,11 @@ import (  // barcodes represents the barcodes that have been registered through this  // package. They will later be used to be scaled and put on the page. -var barcodes map[string]barcode.Barcode +// RubenN: made this a struct with a mutex to prevent race condition +var barcodes struct { +	sync.Mutex +	cache map[string]barcode.Barcode +}  // barcodePdf is a partial PDF implementation that only implements a subset of  // functions that are required to add the barcode to the PDF. @@ -56,7 +60,9 @@ type barcodePdf interface {  //  // Positioning with x, y and flow is inherited from Fpdf.Image().  func Barcode(pdf barcodePdf, code string, x, y, w, h float64, flow bool) { -	unscaled, ok := barcodes[code] +	barcodes.Lock() +	unscaled, ok := barcodes.cache[code] +	barcodes.Unlock()  	if !ok {  		err := errors.New("Barcode not found") @@ -92,12 +98,15 @@ func Barcode(pdf barcodePdf, code string, x, y, w, h float64, flow bool) {  // Register registers a barcode but does not put it on the page. Use Barcode()  // with the same code to put the barcode on the PDF page.  func Register(bcode barcode.Barcode) string { -	if len(barcodes) == 0 { -		barcodes = make(map[string]barcode.Barcode) +	barcodes.Lock() +	if len(barcodes.cache) == 0 { +		barcodes.cache = make(map[string]barcode.Barcode)  	}  	key := barcodeKey(bcode) -	barcodes[key] = bcode +	barcodes.cache[key] = bcode +	barcodes.Unlock() +  	return key  } | 
