18 #import <Cocoa/Cocoa.h>
33 - (bool) shouldExecuteProc;
65 @property(readonly) __weak NSRunLoop* runLoop;
71 static NSMutableDictionary* additionsDictionary;
73 - (int) numberOfAdditions {
return [additionsDictionary count]; }
77 if (
self = [super init])
88 return [procAdditions objectForKey:[NSNumber valueWithPointer:proc]];
93 auto key = [NSNumber valueWithPointer:proc];
98 [procAdditions removeObjectForKey:key];
109 timerInterval ? [[
SCHTimer alloc] initWithProc:proc] :
114 [procAdditions setObject:addition forKey:[NSNumber valueWithPointer:proc]];
124 auto current = [NSRunLoop currentRunLoop];
125 if (current != [NSRunLoop mainRunLoop])
128 [procAdditions enumerateKeysAndObjectsUsingBlock:
129 ^void (id key, SCHAddition* obj, BOOL* stop) { [obj registerAt:self]; }];
141 auto key = [NSNumber valueWithPointer:additions.scheduler];
142 @
synchronized (additionsDictionary)
144 [additionsDictionary removeObjectForKey:key];
150 static dispatch_once_t onceToken;
151 dispatch_once(&onceToken,
152 ^{ additionsDictionary = [NSMutableDictionary new]; });
153 auto key = [NSNumber valueWithPointer:scheduler];
154 @
synchronized (additionsDictionary)
156 SCHAdditions* additions = [additionsDictionary objectForKey:key];
159 additions = [[
SCHAdditions alloc] initWithScheduler:scheduler];
160 [additionsDictionary setObject:additions forKey:key];
171 if (
self = [super init])
183 return s && !
s.scheduler->IsInManualLoop();
195 [schedulerAdditions changed:self];
202 if (
self = [super init])
209 - (void) run:(
id) sender
217 [
super registerAt:_additions];
218 auto loop = _additions.
runLoop;
219 timer = [NSTimer timerWithTimeInterval:proc->TimerInterval()/1000.0 target:self selector:@selector(run:) userInfo:nil repeats:YES];
220 [loop addTimer:timer forMode:NSDefaultRunLoopMode];
226 [
super unregisterFrom:_additions];
231 void callback (CFSocketRef
s, CFSocketCallBackType
type, CFDataRef address,
const void *data,
void *info)
234 pollfd p = {.fd=CFSocketGetNative(
s)};
240 [
super registerAt:_additions];
241 vector<struct pollfd> vecs;
243 CFSocketContext ctx =
245 .info = (__bridge
void*)
self,
251 auto socket = CFSocketCreateWithNative(NULL,
252 p.fd, kCFSocketReadCallBack,
255 auto runLoopSource = CFSocketCreateRunLoopSource(NULL, socket, 0);
256 CFRunLoopAddSource([_additions.
runLoop getCFRunLoop], runLoopSource, kCFRunLoopDefaultMode);
262 auto runLoop = [_additions.runLoop getCFRunLoop];
265 CFRunLoopRemoveSource(runLoop, r.first, kCFRunLoopDefaultMode);
266 CFSocketDisableCallBacks(r.second, kCFSocketReadCallBack|kCFSocketWriteCallBack);
267 CFRunLoopSourceInvalidate(r.first);
272 [
super unregisterFrom:_additions];
289 [x removeAdditionForProc:pProc];
290 if ([x numberOfAdditions] == 0)
void Added(StdSchedulerProc *pProc)
void StartOnCurrentThread()
void Removing(StdSchedulerProc *pProc)
void Changed(StdSchedulerProc *pProc)
virtual uint32_t TimerInterval()
virtual void GetFDs(std::vector< struct pollfd > &)
virtual bool Execute(int iTimeout=-1, pollfd *readyfds=nullptr)=0
void unregisterFrom:(SCHAdditions *_additions)
__weak SCHAdditions * schedulerAdditions
void registerAt:(SCHAdditions *_additions)
SCHAddition * additionForProc:(StdSchedulerProc *proc)
__weak NSRunLoop * runLoop
SCHAddition * assignAdditionForProc:(StdSchedulerProc *proc)
NSMutableDictionary * procAdditions
SCHAdditions * requestAdditionsForScheduler:(StdScheduler *scheduler)
list< pair< CFRunLoopSourceRef, CFSocketRef > > socketSources