mirror of
				git://git.code.sf.net/p/cdesktopenv/code
				synced 2025-03-09 15:50:02 +00:00 
			
		
		
		
	This reverts the patch for the job_lock and job_unlock macros. As I said in58560db7, this is very probably a workaround for an optimiser bug in certain versions of GCC, at least 2017 versions. In the version I committed, that workaround version never gets used, because you cannot use #if defined(...) to check for the presence of a compiler builtin. Thanks to Johnothan King for keeping an eye on my code and pointing that out to me. What is needed to test for the presence of a compiler builtin is a builtin macro called __has_builtin (and it *can* be tested for using #if defined...()).. This is a clang invention. It was not added to gcc until version 10, which was only released in a first stable version just over a month ago. Ref.: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66970#c14 https://gcc.gnu.org/gcc-10/ However, for gcc 10, it seems unlikely the patch is still needed. (Although it would certainly be a good idea to test that.) And for the older gcc versions that do need it, we cannot use __has_builtin, which means we need to define a dummy that always returns false, so the workaround version is never used. Ref.:58560db7 (commitcomment-39900259)And we cannot use the workaround version unconditionally either, because it would cause build failures on compilers without the __sync_fetch_and_add() and __sync_fetch_and_sub() builtins. Which means the only sensible thing left to do is to revert the patch for now. As far as I can tell at this point, for the patch to return to this upstream in a sensible manner, someone would need to: 1. Write a small C program that tests these macros and somehow checks for the presence of that optimiser bug. (This is not going to come from me; my C-fu is simply not good enough.) 2. Incorporate that into the distribution as a test for iffe. (Few know how iffe works, but it's probably not that hard as there are plenty of existing tests to use as a template.) 3. Reinsert the workaround version using the macro defined (or not) by that iffe test, so that it is only compiled in when using a compiler that actually has the bug in question. Until then, this can just continue to be an OS-specific patch for systems with GCC versions that might have that bug.
This commit is contained in:
		
							parent
							
								
									58560db768
								
							
						
					
					
						commit
						b7f48e8a10
					
				
					 1 changed files with 0 additions and 27 deletions
				
			
		| 
						 | 
					@ -149,32 +149,6 @@ extern struct jobs job;
 | 
				
			||||||
#define vmbusy()	0
 | 
					#define vmbusy()	0
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Job locking and unlocking macros
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#if defined(__sync_fetch_and_add) && defined(__sync_fetch_and_sub)
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * This version may prevent segfaults due to a GCC optimizer bug.
 | 
					 | 
				
			||||||
 * See: https://bugzilla.redhat.com/show_bug.cgi?id=1112306
 | 
					 | 
				
			||||||
 *	https://bugs.launchpad.net/ubuntu/+source/ksh/+bug/1697501
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#define asoincint(p)  __sync_fetch_and_add(p,1)
 | 
					 | 
				
			||||||
#define asodecint(p)  __sync_fetch_and_sub(p,1)
 | 
					 | 
				
			||||||
#define job_lock()	asoincint(&job.in_critical)
 | 
					 | 
				
			||||||
#define job_unlock()	\
 | 
					 | 
				
			||||||
	do { \
 | 
					 | 
				
			||||||
		int	sig; \
 | 
					 | 
				
			||||||
		if (asodecint(&job.in_critical)==1 && (sig = job.savesig)) \
 | 
					 | 
				
			||||||
		{ \
 | 
					 | 
				
			||||||
			if (!asoincint(&job.in_critical) && !vmbusy()) \
 | 
					 | 
				
			||||||
				job_reap(sig); \
 | 
					 | 
				
			||||||
			asodecint(&job.in_critical); \
 | 
					 | 
				
			||||||
		} \
 | 
					 | 
				
			||||||
	} while(0)
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Original ksh93 version.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#define job_lock()	(job.in_critical++)
 | 
					#define job_lock()	(job.in_critical++)
 | 
				
			||||||
#define job_unlock()	\
 | 
					#define job_unlock()	\
 | 
				
			||||||
	do { \
 | 
						do { \
 | 
				
			||||||
| 
						 | 
					@ -186,7 +160,6 @@ extern struct jobs job;
 | 
				
			||||||
			job.in_critical--; \
 | 
								job.in_critical--; \
 | 
				
			||||||
		} \
 | 
							} \
 | 
				
			||||||
	} while(0)
 | 
						} while(0)
 | 
				
			||||||
#endif /* defined(__sync_fetch_and_add) && defined(__sync_fetch_and_sub) */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const char	e_jobusage[];
 | 
					extern const char	e_jobusage[];
 | 
				
			||||||
extern const char	e_done[];
 | 
					extern const char	e_done[];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue