4
4
"context"
5
5
"fmt"
6
6
"image"
7
+ "sync"
7
8
8
9
"github.com/pkg/errors"
9
10
"go.opencensus.io/trace"
@@ -22,9 +23,11 @@ import (
22
23
// serviceServer implements the CameraService from camera.proto.
23
24
type serviceServer struct {
24
25
pb.UnimplementedCameraServiceServer
25
- coll resource.APIResourceCollection [Camera ]
26
- imgTypes map [string ]ImageType
27
- logger logging.Logger
26
+ coll resource.APIResourceCollection [Camera ]
27
+
28
+ imgTypesMu sync.RWMutex
29
+ imgTypes map [string ]ImageType
30
+ logger logging.Logger
28
31
}
29
32
30
33
// NewRPCServiceServer constructs an camera gRPC service server.
@@ -54,16 +57,22 @@ func (s *serviceServer) GetImage(
54
57
55
58
// Determine the mimeType we should try to use based on camera properties
56
59
if req .MimeType == "" {
57
- if _ , ok := s .imgTypes [req .Name ]; ! ok {
60
+ s .imgTypesMu .RLock ()
61
+ imgType , ok := s .imgTypes [req .Name ]
62
+ s .imgTypesMu .RUnlock ()
63
+ if ! ok {
58
64
props , err := cam .Properties (ctx )
59
65
if err != nil {
60
66
s .logger .CWarnf (ctx , "camera properties not found for %s, assuming color images: %v" , req .Name , err )
61
- s . imgTypes [ req . Name ] = ColorStream
67
+ imgType = ColorStream
62
68
} else {
63
- s . imgTypes [ req . Name ] = props .ImageType
69
+ imgType = props .ImageType
64
70
}
71
+ s .imgTypesMu .Lock ()
72
+ s .imgTypes [req .Name ] = imgType
73
+ s .imgTypesMu .Unlock ()
65
74
}
66
- switch s . imgTypes [ req . Name ] {
75
+ switch imgType {
67
76
case ColorStream , UnspecifiedStream :
68
77
req .MimeType = utils .MimeTypeJPEG
69
78
case DepthStream :
0 commit comments