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

14 files changed

+91
-24
lines changed

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

+1-1
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

+3-2
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

+11
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

+25-18
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

+3
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

+6
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

+1-1
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

+1-1
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

+8-1
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

+1
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;;

test/PROTOCOLCLASS/macro/CMakeLists.txt

+10
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ add_executable( macro.exe
1313
${SOURCES}
1414
)
1515

16+
get_filename_component( C_COMPILER_NAME "${CMAKE_C_COMPILER}" NAME_WE)
17+
18+
if( "${C_COMPILER_NAME}" MATCHES "mulle-cl*")
19+
if( CMAKE_BUILD_TYPE MATCHES "^Debug|^Test")
20+
target_compile_options( "macro.exe" PRIVATE -fobjc-tao)
21+
message( STATUS "TAO enabled via compiler flag")
22+
endif()
23+
endif()
24+
25+
1626
target_link_libraries( macro.exe
1727
${TEST_LIBRARIES}
1828
)

test/PROTOCOLCLASS/manual/CMakeLists.txt

+10
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ add_executable( manual.exe
1313
${SOURCES}
1414
)
1515

16+
get_filename_component( C_COMPILER_NAME "${CMAKE_C_COMPILER}" NAME_WE)
17+
18+
if( "${C_COMPILER_NAME}" MATCHES "mulle-cl*")
19+
if( CMAKE_BUILD_TYPE MATCHES "^Debug|^Test")
20+
target_compile_options( "manual.exe" PRIVATE -fobjc-tao)
21+
message( STATUS "TAO enabled via compiler flag")
22+
endif()
23+
endif()
24+
25+
1626
target_link_libraries( manual.exe
1727
${TEST_LIBRARIES}
1828
)

test/tao-mix/CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
# -DMULLE_TECHNICAL_FLAGS=-vvv \
1313
# -DCMAKE_RULE_MESSAGES=OFF \
1414
# -DTEST_LIBRARIES='-L/home/nat/.mulle/var/MulleObjC-d1c1acfc730b/dependency/Debug/lib;-Wl,--no-as-needed;...' \
15+
cmake_minimum_required(VERSION 3.15)
16+
17+
set( CMAKE_C_COMPILER_WORKS 1)
1518

1619
project( tao-mix C)
1720

test/tao-thread/CMakeLists.txt

+8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ add_executable( "${PROJECT_NAME}.exe"
2323
main.m
2424
)
2525

26+
if( "${C_COMPILER_NAME}" MATCHES "mulle-cl*")
27+
if( CMAKE_BUILD_TYPE MATCHES "^Debug|^Test")
28+
target_compile_options( "${PROJECT_NAME}.exe" PRIVATE -fobjc-tao)
29+
message( STATUS "TAO enabled via compiler flag")
30+
endif()
31+
endif()
32+
33+
2634
target_link_libraries( "${PROJECT_NAME}.exe"
2735
${TEST_LIBRARIES}
2836
)

0 commit comments

Comments
 (0)