Skip to content

Commit 19e8a91

Browse files
author
Your Name
committed
* make MulleObjCTAOKnownThreadSafeMethods the default for -mulleTAOStrategy for less friction (for now)
* turn MulleAutoLockingObject into a protolclass fix some tests
1 parent b27ebd8 commit 19e8a91

File tree

14 files changed

+91
-24
lines changed

14 files changed

+91
-24
lines changed

.github/workflows/mulle-sde-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535

3636
- uses: actions/checkout@v4
3737

38-
- uses: mulle-sde/github-ci@v1
38+
- uses: mulle-sde/github-ci@v2
3939

4040
- uses: mulle-cc/github-ci@v5
4141

src/class/MulleObject.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@
4747
// of MulleObject will appear to be broken. This is basically the main
4848
// trick MulleAutolockingObject uses and it can't be avoided.
4949
//
50-
@protocol MulleAutolockingObject
51-
@end
50+
PROTOCOLCLASS_INTERFACE0( MulleAutolockingObject)
51+
PROTOCOLCLASS_END()
52+
5253

5354
#define MulleAutolockingObjectProtocols MulleObjCThreadSafe, MulleAutolockingObject
5455

src/class/MulleObject.m

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@
1010
#import "MulleObject-Private.h"
1111

1212

13+
PROTOCOLCLASS_IMPLEMENTATION( MulleAutolockingObject)
14+
15+
- (MulleObjCTAOStrategy) mulleTAOStrategy
16+
{
17+
return( MulleObjCTAOKnownThreadSafe);
18+
}
19+
20+
PROTOCOLCLASS_END()
21+
22+
23+
1324
@implementation MulleObject
1425

1526
static BOOL is_a_locking_descriptor( struct _mulle_objc_descriptor *desc,

src/class/NSThread.m

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,18 +1094,21 @@ void MulleObjCTAOLogAndFail( struct _mulle_objc_object *obj,
10941094
mulle_thread_t osThread,
10951095
struct _mulle_objc_descriptor *desc)
10961096
{
1097-
struct _mulle_objc_class *cls;
1098-
struct _mulle_objc_universe *universe;
1099-
int ismeta;
1100-
NSThread *currentThreadObject;
1101-
NSThread *osThreadObject;
1102-
char *s;
1103-
char *strategyName;
1104-
MulleObjCTAOStrategy strategy;
1105-
1106-
cls = _mulle_objc_object_get_isa( obj);
1107-
ismeta = _mulle_objc_class_is_metaclass( cls);
1108-
universe = _mulle_objc_class_get_universe( cls);
1097+
struct _mulle_objc_class *cls;
1098+
struct _mulle_objc_universe *universe;
1099+
int ismeta;
1100+
NSThread *currentThreadObject;
1101+
NSThread *osThreadObject;
1102+
char *s;
1103+
char *strategyName;
1104+
MulleObjCTAOStrategy strategy;
1105+
struct _mulle_objc_searcharguments args;
1106+
struct _mulle_objc_method *method;
1107+
mulle_objc_implementation_t imp;
1108+
1109+
cls = _mulle_objc_object_get_isa( obj);
1110+
ismeta = _mulle_objc_class_is_metaclass( cls);
1111+
universe = _mulle_objc_class_get_universe( cls);
11091112

11101113
currentThreadObject = MulleThreadGetCurrentThread();
11111114
osThreadObject = _mulle_objc_universe_lookup_threadobject_for_thread( universe, osThread); // try to retri
@@ -1129,13 +1132,17 @@ void MulleObjCTAOLogAndFail( struct _mulle_objc_object *obj,
11291132
else
11301133
mulle_buffer_sprintf( buffer, "%p ", osThread);
11311134

1132-
1133-
strategyName = NULL;
1134-
if( [(id) obj respondsToSelector:@selector( mulleTAOStrategy)])
1135+
if( ! ismeta)
11351136
{
1136-
strategy = [(id) obj mulleTAOStrategy];
1137-
strategyName = NS_ENUM_LOOKUP( MulleObjCTAOStrategy, strategy);
1138-
mulle_buffer_sprintf( buffer, "and TAO strategy %s ", strategyName ? strategyName : "None");
1137+
args = mulle_objc_searcharguments_make_default( @selector( mulleTAOStrategy));
1138+
method = mulle_objc_class_search_method( cls, &args, 0, NULL);
1139+
if( method)
1140+
{
1141+
imp = mulle_objc_method_get_implementation( method);
1142+
strategy = (uintptr_t) _mulle_objc_implementation_invoke( imp, obj, @selector( mulleTAOStrategy), obj);
1143+
strategyName = NS_ENUM_LOOKUP( MulleObjCTAOStrategy, strategy);
1144+
mulle_buffer_sprintf( buffer, "and TAO strategy %s ", strategyName ? strategyName : "None");
1145+
}
11391146
}
11401147

11411148
mulle_buffer_sprintf( buffer, "gets a %c%s call from thread ",

src/function/MulleObjCDebug.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,6 @@ void MulleObjCDotdumpMetaHierarchy( char *classname);
8585
MULLE_OBJC_GLOBAL
8686
void MulleObjCDumpObject( id object);
8787

88+
// string as help for debuggin
89+
MULLE_OBJC_GLOBAL
90+
char *MulleObjCDebugHelp;

src/function/MulleObjCDebug.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,12 @@ void MulleObjCDumpObject( id obj)
286286
}
287287

288288

289+
char *MulleObjCDebug = ""
290+
"x MulleObjCDumpObject( obj) : dump current object to stderr\n"
291+
"x MulleObjCHTMLDumpUniverse() : dump default universe to PWD\n";
292+
293+
294+
289295
#else
290296

291297
void MulleObjCHTMLDumpUniverseToDirectory( char *directory)

src/function/MulleObjCFunctions.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ static int compare_ivar_by_name( void **p_a, void **p_b, void *userinfo)
884884
}
885885

886886

887-
void MulleObjCDescribeIvars( struct mulle_buffer *buffer, id obj)
887+
void MulleObjCDescribeIvars( struct mulle_buffer *buffer, id obj)
888888
{
889889
struct _mulle_objc_infraclass *infra;
890890
struct _mulle_objc_ivar *ivar;

src/protocol/MulleObjCProtocol.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ - (id) mulleThreadSafeCopy
6666
// So ensure that the strategy is back to the default
6767
//
6868

69-
- (MulleObjCTAOStrategy) mulleTAOStrategy MULLE_OBJC_THREADSAFE_METHOD
69+
- (MulleObjCTAOStrategy) mulleTAOStrategy
7070
{
7171
return( MulleObjCTAOCallerRemovesFromCurrentPool);
7272
}

src/protocol/MulleObjCRootObject.m

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,14 @@ - (void) mulleRelinquishAccessWithTAOStrategy:(MulleObjCTAOStrategy) strategy
415415
//
416416
- (MulleObjCTAOStrategy) mulleTAOStrategy
417417
{
418-
return( MulleObjCTAOCallerRemovesFromCurrentPool);
418+
//
419+
// So this default is MulleObjCTAOKnownThreadSafeMethods, because it doesn't
420+
// break existing code. Known problematic subclasses like
421+
// NSMutableDictionary then should actually reset this to some unsafe tag.
422+
// In a future world where everything is a MulleObject, this would be unsafe
423+
// and autolocking would promote this to ThreadSafe (?)
424+
//
425+
return( MulleObjCTAOKnownThreadSafeMethods);
419426
}
420427

421428

src/reflect/objc-loader.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{ @selector( MulleAutolockingObject), MULLE_OBJC_NO_CATEGORYID }, // 6eb2f41b;MulleAutolockingObject;;
12
{ @selector( MulleDynamicObject), @selector( NSMutableCopying) }, // d9918780;MulleDynamicObject;4aa86031;NSMutableCopying
23
{ @selector( MulleDynamicObject), MULLE_OBJC_NO_CATEGORYID }, // d9918780;MulleDynamicObject;;
34
{ @selector( MulleObjCClassCluster), MULLE_OBJC_NO_CATEGORYID }, // 6ed73da1;MulleObjCClassCluster;;

0 commit comments

Comments
 (0)