Fixed build issues and added more cases to allcalls.h. I'm going to fix the lack of idnent on the diff()s before continuing.

This commit is contained in:
Pietro Gagliardi 2019-05-28 22:53:40 -04:00
parent d0dd91d8d8
commit cceae4845e
4 changed files with 26 additions and 5 deletions

View File

@ -1,5 +1,4 @@
// 20 april 2019 // 20 april 2019
#import <stdlib.h>
#import "uipriv_darwin.h" #import "uipriv_darwin.h"
@interface uiprivApplication : NSApplication @interface uiprivApplication : NSApplication
@ -50,11 +49,10 @@ const char **uiprivSysInitErrors(void)
} }
static pthread_t mainThread; static pthread_t mainThread;
static BOOL initialized = NO; // TODO deduplicate this from common/init.c
int uiprivSysInit(void *options, uiInitError *err) int uiprivSysInit(void *options, uiInitError *err)
{ {
int lockerr;
uiprivApp = [uiprivApplication sharedApplication]; uiprivApp = [uiprivApplication sharedApplication];
if (![NSApp isKindOfClass:[uiprivApplication class]]) if (![NSApp isKindOfClass:[uiprivApplication class]])
return uiprivInitReturnError(err, errNSAppAlreadyInitialized); return uiprivInitReturnError(err, errNSAppAlreadyInitialized);
@ -67,16 +65,21 @@ int uiprivSysInit(void *options, uiInitError *err)
[uiprivApp setDelegate:uiprivAppDelegate]; [uiprivApp setDelegate:uiprivAppDelegate];
mainThread = pthread_self(); mainThread = pthread_self();
initialized = YES;
return 1; return 1;
} }
void uiMain(void) void uiMain(void)
{ {
if (!uiprivCheckInitializedAndThread())
return;
[uiprivApp run]; [uiprivApp run];
} }
void uiQuit(void) void uiQuit(void)
{ {
if (!uiprivCheckInitializedAndThread())
return;
@autoreleasepool { @autoreleasepool {
NSEvent *e; NSEvent *e;
@ -99,6 +102,10 @@ void uiQuit(void)
// thanks to mikeash in irc.freenode.net/#macdev for suggesting the use of Grand Central Dispatch for this // thanks to mikeash in irc.freenode.net/#macdev for suggesting the use of Grand Central Dispatch for this
void uiQueueMain(void (*f)(void *data), void *data) void uiQueueMain(void (*f)(void *data), void *data)
{ {
if (!initialized) {
uiprivProgrammerError(uiprivProgrammerErrorNotInitialized, uiprivFunc);
return;
}
// dispatch_get_main_queue() is a serial queue so it will not execute multiple uiQueueMain() functions concurrently // dispatch_get_main_queue() is a serial queue so it will not execute multiple uiQueueMain() functions concurrently
// the signature of f matches dispatch_function_t // the signature of f matches dispatch_function_t
dispatch_async_f(dispatch_get_main_queue(), data, f); dispatch_async_f(dispatch_get_main_queue(), data, f);

View File

@ -4,6 +4,8 @@
#define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_8 #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_8
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#import <dlfcn.h> // see future.m #import <dlfcn.h> // see future.m
#import <pthread.h>
#import <stdlib.h>
#import "../ui.h" #import "../ui.h"
#import "../ui_darwin.h" #import "../ui_darwin.h"
#import "../common/uipriv.h" #import "../common/uipriv.h"

View File

@ -1,3 +1,13 @@
// 28 may 2019 // 28 may 2019
// This file should NOT have include guards as it is intended to be included more than once; see noinitwrongthread.c for details. // This file should NOT have include guards as it is intended to be included more than once; see noinitwrongthread.c for details.
allcallsCase(uiMain, /* no arguments */)
allcallsCase(uiQuit, /* no arguments */)
allcallsCase(uiNewEvent, NULL)
allcallsCase(uiEventAddHandler, NULL, NULL, NULL, NULL)
allcallsCase(uiEventDeleteHandler, NULL, 0)
allcallsCase(uiEventFire, NULL, NULL, NULL)
allcallsCase(uiEventHandlerBlocked, NULL, 0)
allcallsCase(uiEventSetHandlerBlocked, NULL, 0, false)

View File

@ -1,4 +1,6 @@
// 28 may 2019 // 28 may 2019
#include <stdlib.h>
#include "lib/thread.h"
#include "test.h" #include "test.h"
struct errorCase { struct errorCase {
@ -68,7 +70,7 @@ static void freeCases(struct errorCase *first)
static void reportCases(testingT *t, struct errorCase *p) static void reportCases(testingT *t, struct errorCase *p)
{ {
while (p != NULL) { while (p != NULL) {
testingTLogf(t, "*** %s", t->name); testingTLogf(t, "*** %s", p->name);
if (!p->caught) { if (!p->caught) {
testingTErrorf(t, "%s did not throw a programmer error; should have", p->name); testingTErrorf(t, "%s did not throw a programmer error; should have", p->name);
p = p->next; p = p->next;
@ -91,7 +93,7 @@ static void reportCases(testingT *t, struct errorCase *p)
return first; \ return first; \
current->name = #f "()"; \ current->name = #f "()"; \
current->msgWant = "attempt to call " #f "() " allcallsMsgSuffix; \ current->msgWant = "attempt to call " #f "() " allcallsMsgSuffix; \
f(__VA_LIST__); \ f(__VA_ARGS__); \
if (first == NULL) \ if (first == NULL) \
first = current; \ first = current; \
if (last != NULL) \ if (last != NULL) \