mirror of https://github.com/v2ray/v2ray-core
				
				
				
			injectable clock
							parent
							
								
									c3dce11c4e
								
							
						
					
					
						commit
						9cd0e90e99
					
				|  | @ -0,0 +1,59 @@ | |||
| package core | ||||
| 
 | ||||
| import ( | ||||
| 	"sync" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Clock is a V2Ray feature that returns current time.
 | ||||
| type Clock interface { | ||||
| 	Feature | ||||
| 
 | ||||
| 	// Now returns current time.
 | ||||
| 	Now() time.Time | ||||
| } | ||||
| 
 | ||||
| type syncClock struct { | ||||
| 	sync.RWMutex | ||||
| 	Clock | ||||
| } | ||||
| 
 | ||||
| func (c *syncClock) Now() time.Time { | ||||
| 	c.RLock() | ||||
| 	defer c.RUnlock() | ||||
| 
 | ||||
| 	if c.Clock == nil { | ||||
| 		return time.Now() | ||||
| 	} | ||||
| 
 | ||||
| 	return c.Clock.Now() | ||||
| } | ||||
| 
 | ||||
| func (c *syncClock) Start() error { | ||||
| 	c.RLock() | ||||
| 	defer c.RUnlock() | ||||
| 
 | ||||
| 	if c.Clock == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	return c.Clock.Start() | ||||
| } | ||||
| 
 | ||||
| func (c *syncClock) Close() { | ||||
| 	c.RLock() | ||||
| 	defer c.RUnlock() | ||||
| 
 | ||||
| 	if c.Clock == nil { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	c.Clock.Close() | ||||
| } | ||||
| 
 | ||||
| func (c *syncClock) Set(clock Clock) { | ||||
| 	c.Lock() | ||||
| 	defer c.Unlock() | ||||
| 
 | ||||
| 	c.Clock = clock | ||||
| } | ||||
							
								
								
									
										6
									
								
								v2ray.go
								
								
								
								
							
							
						
						
									
										6
									
								
								v2ray.go
								
								
								
								
							|  | @ -27,6 +27,7 @@ type Instance struct { | |||
| 	router        syncRouter | ||||
| 	ihm           syncInboundHandlerManager | ||||
| 	ohm           syncOutboundHandlerManager | ||||
| 	clock         syncClock | ||||
| 
 | ||||
| 	features []Feature | ||||
| 	id       uuid.UUID | ||||
|  | @ -163,3 +164,8 @@ func (s *Instance) InboundHandlerManager() InboundHandlerManager { | |||
| func (s *Instance) OutboundHandlerManager() OutboundHandlerManager { | ||||
| 	return &(s.ohm) | ||||
| } | ||||
| 
 | ||||
| // Clock returns the Clock used by this Instance. The returned Clock is always functional.
 | ||||
| func (s *Instance) Clock() Clock { | ||||
| 	return &(s.clock) | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Darien Raymond
						Darien Raymond