Author: rfm
Date: Tue Jun 21 18:14:22 2016
New Revision: 39898
URL: http://svn.gna.org/viewcvs/gnustep?rev=39898&view=rev
Log:
Alter to allow notifications to be sent to observers asynchronously
Modified:
libs/sqlclient/trunk/Postgres.m
Modified: libs/sqlclient/trunk/Postgres.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/sqlclient/trunk/Postgres.m?rev=39898&r1=39897&r2=39898&view=diff
==============================================================================
--- libs/sqlclient/trunk/Postgres.m (original)
+++ libs/sqlclient/trunk/Postgres.m Tue Jun 21 18:14:22 2016
@@ -39,6 +39,7 @@
#import <Foundation/NSNotificationQueue.h>
#import <Foundation/NSNull.h>
#import <Foundation/NSProcessInfo.h>
+#import <Foundation/NSRunLoop.h>
#import <Foundation/NSString.h>
#import <Foundation/NSThread.h>
#import <Foundation/NSTimeZone.h>
@@ -61,14 +62,25 @@
- (NSDate*) dbToDateFromBuffer: (char*)b length: (int)l;
@end
+#if defined(GNUSTEP_BASE_LIBRARY) && !defined(__MINGW__)
+@interface SQLClientPostgres (RunLoop) <RunLoopEvents>
+- (void) receivedEvent: (void*)data
+ type: (RunLoopEventType)type
+ extra: (void*)extra
+ forMode: (NSString*)mode;
+@end
+#endif
+
typedef struct {
PGconn *_connection;
int _backendPID;
+ NSRunLoop *_runLoop;
} ConnectionInfo;
#define cInfo ((ConnectionInfo*)(self->extra))
#define backendPID (cInfo->_backendPID)
#define connection (cInfo->_connection)
+#define runLoop (cInfo->_runLoop)
static NSDate *future = nil;
static NSNull *null = nil;
@@ -497,6 +509,16 @@
{
if (extra != 0 && connection != 0)
{
+#if defined(GNUSTEP_BASE_LIBRARY) && !defined(__MINGW__)
+ if (runLoop != nil)
+ {
+ [runLoop removeEvent: (void*)(uintptr_t)PQsocket(connection)
+ type: ET_RDESC
+ forMode: NSDefaultRunLoopMode
+ all: YES];
+ DESTROY(runLoop);
+ }
+#endif
NS_DURING
{
if ([self isInTransaction] == YES)
@@ -707,6 +729,16 @@
- (void) backendListen: (NSString*)name
{
[self execute: @"LISTEN ", name, nil];
+#if defined(GNUSTEP_BASE_LIBRARY) && !defined(__MINGW__)
+ if (nil == runLoop && 0 != connection)
+ {
+ ASSIGN(runLoop, [NSRunLoop currentRunLoop]);
+ [runLoop addEvent: (void*)(uintptr_t)PQsocket(connection)
+ type: ET_RDESC
+ watcher: self
+ forMode: NSDefaultRunLoopMode];
+ }
+#endif
}
- (void) backendNotify: (NSString*)name payload: (NSString*)more
@@ -1176,6 +1208,16 @@
- (void) backendUnlisten: (NSString*)name
{
+#if defined(GNUSTEP_BASE_LIBRARY) && !defined(__MINGW__)
+ if (runLoop != nil)
+ {
+ [runLoop removeEvent: (void*)(uintptr_t)PQsocket(connection)
+ type: ET_RDESC
+ forMode: NSDefaultRunLoopMode
+ all: YES];
+ DESTROY(runLoop);
+ }
+#endif
[self execute: @"UNLISTEN ", name, nil];
}
@@ -1619,3 +1661,18 @@
@end
+#if defined(GNUSTEP_BASE_LIBRARY) && !defined(__MINGW__)
+@implementation SQLClientPostgres (RunLoop)
+- (void) receivedEvent: (void*)data
+ type: (RunLoopEventType)type
+ extra: (void*)extra
+ forMode: (NSString*)mode
+{
+ if (0 != connection)
+ {
+ PQconsumeInput(connection);
+ [self _checkNotifications];
+ }
+}
+@end
+#endif
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs