RĂ©mi Bernon rbernon@codeweavers.com writes:
+#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
- __atomic_store_n(&ptr->SystemTime.High2Time, system_time_high, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->SystemTime.LowPart, system_time_low, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->SystemTime.High1Time, system_time_high, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->InterruptTime.High2Time, interrupt_time_high, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->InterruptTime.LowPart, interrupt_time_low, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->InterruptTime.High1Time, interrupt_time_high, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->TickCount.High2Time, tick_count_high, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->TickCount.LowPart, tick_count_low, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->TickCount.High1Time, tick_count_high, __ATOMIC_SEQ_CST);
- __atomic_store_n(&ptr->TickCountLowDeprecated, tick_count_low, __ATOMIC_SEQ_CST);
Is this gcc-specific code really necessary?
+obj_handle_t get_usd_handle( const void *usd_init, data_size_t usd_size ) +{
- /* keep it the same as user_shared_data_size in ntdll */
- size_t size = 0x10000;
- struct fd *fd;
- if (sizeof(*kusd) != usd_size)
- {
set_error( STATUS_INVALID_PARAMETER );
return 0;
- }
- if (!kusd_mapping)
- {
if (!(kusd_mapping = create_mapping( NULL, NULL, 0, size, SEC_COMMIT, 0, 0, NULL )))
return 0;
make_object_static( kusd_mapping );
if (!(fd = mapping_get_fd( kusd_mapping )))
return 0;
if ((kusd = mmap( NULL, size, PROT_WRITE, MAP_SHARED, get_unix_fd( fd ), 0 )) != MAP_FAILED)
{
memcpy( kusd, usd_init, usd_size );
kusd_set_current_time( NULL );
}
release_object( fd );
- }
- if (kusd == MAP_FAILED)
- {
set_error( STATUS_NO_MEMORY );
return 0;
- }
- return alloc_handle( current->process, kusd_mapping, SECTION_QUERY|SECTION_MAP_READ, 0 );
+}
I still think it would be cleaner to use standard APIs for this, something like NtCreateSection("__wine_shared_user_data"), on STATUS_SUCCESS initialize it and tell the server about it, and on STATUS_OBJECT_NAME_EXISTS simply map it.