Changeset 3860
- Timestamp:
- Jun 25, 2014, 10:55:49 PM (11 years ago)
- Location:
- trunk/libc
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libc/include/386/builtin.h
r3821 r3860 40 40 # ifdef _MSC_VER 41 41 signed char __cxchg (__volatile__ signed char *p, signed char v); 42 signed char __sxchg (__volatile__ signed char *p, signed charv);42 signed char __sxchg (__volatile__ signed short *p, signed short v); 43 43 # else /* !_MSC_VER */ 44 44 static __inline__ signed char __cxchg (__volatile__ signed char *p, signed char v) … … 126 126 #endif 127 127 128 #ifndef __WATCOMC__ /** @todo port me later. */129 130 128 /** 131 129 * Atomically add a 32-bit unsigned value to another. … … 134 132 * @param uAdd The value to add to *pu. 135 133 */ 134 #ifdef __WATCOMC__ 135 void __atomic_add(__volatile__ unsigned *pu, const unsigned uAdd); 136 # pragma aux __atomic_add = "lock add [edx], eax" parm [edx] [eax] 137 #else 136 138 static __inline__ void __atomic_add(__volatile__ unsigned *pu, const unsigned uAdd) 137 139 { 140 # ifdef _MSC_VER 141 _InterlockedAdd((volatile signed int *)pu, uAdd); 142 # else 138 143 __asm__ __volatile__("lock; addl %1, %0" 139 144 : "=m" (*pu) 140 145 : "nr" (uAdd), 141 146 "m" (*pu)); 142 } 147 # endif 148 } 149 #endif 143 150 144 151 /** … … 148 155 * @param uAdd The value to subtract from *pu. 149 156 */ 157 #ifdef __WATCOMC__ 158 void __atomic_sub(__volatile__ unsigned *pu, const unsigned uAdd); 159 # pragma aux __atomic_sub = "lock sub [edx], eax" parm [edx] [eax] 160 #else 150 161 static __inline__ void __atomic_sub(__volatile__ unsigned *pu, const unsigned uSub) 151 162 { 163 # ifdef _MSC_VER 164 _InterlockedAdd((volatile signed int *)pu, -(signed int)uAdd); 165 # else 152 166 __asm__ __volatile__("lock; subl %1, %0" 153 167 : "=m" (*pu) 154 168 : "nr" (uSub), 155 169 "m" (*pu)); 156 } 170 # endif 171 } 172 #endif 157 173 158 174 /** … … 161 177 * @param pu Pointer to the value to increment. 162 178 */ 179 #ifdef __WATCOMC__ 180 void __atomic_increment(__volatile__ unsigned *pu); 181 # pragma aux __atomic_increment = "lock inc dword ptr [edx]" parm [edx] 182 #else 163 183 static __inline__ void __atomic_increment(__volatile__ unsigned *pu) 164 184 { 185 # ifdef _MSC_VER 186 _InterlockedIncrement((signed int volatile *)pu); 187 # else 165 188 __asm__ __volatile__("lock; incl %0" 166 189 : "=m" (*pu) 167 190 : "m" (*pu)); 168 } 191 # endif 192 } 193 #endif 169 194 170 195 /** … … 174 199 * @param pu32 Pointer to the value to increment. 175 200 */ 201 #ifdef __WATCOMC__ 202 uint32_t __atomic_increment_u32(uint32_t __volatile__ *pu32); 203 # pragma aux __atomic_increment_u32 = \ 204 "mov eax, 1" \ 205 "lock xadd [edx], eax" \ 206 "inc eax" \ 207 parm [edx] modify [eax] value [eax] 208 #else 176 209 static __inline__ uint32_t __atomic_increment_u32(uint32_t __volatile__ *pu32) 177 210 { 178 211 uint32_t u32; 212 # ifdef _MSC_VER 213 u32 = _InterlockedIncrement((signed int volatile *)pu32); 214 # else 179 215 __asm__ __volatile__("lock; xadd %0, %1\n\t" 180 216 "incl %0\n\t" … … 183 219 : "0" (1) 184 220 : "memory"); 221 # endif 185 222 return u32; 186 223 } 224 #endif 187 225 188 226 /** … … 192 230 * @param pi32 Pointer to the value to increment. 193 231 */ 232 #ifdef __WATCOMC__ 233 int32_t __atomic_increment_s32(int32_t __volatile__ *pi32); 234 # pragma aux __atomic_increment_s32 = \ 235 "mov eax, 1" \ 236 "lock xadd [edx], eax" \ 237 "inc eax" \ 238 parm [edx] modify [eax] value [eax] 239 #else 194 240 static __inline__ int32_t __atomic_increment_s32(int32_t __volatile__ *pi32) 195 241 { 196 242 int32_t i32; 243 # ifdef _MSC_VER 244 i32 = _InterlockedIncrement((signed int volatile *)pi32); 245 # else 197 246 __asm__ __volatile__("lock; xadd %0, %1\n\t" 198 247 "incl %0\n\t" … … 201 250 : "0" (1) 202 251 : "memory"); 252 # endif 203 253 return i32; 204 254 } 255 #endif 205 256 206 257 /** … … 209 260 * @param pu16 Pointer to the value to increment. 210 261 */ 262 #ifdef __WATCOMC__ 263 void __atomic_increment_u16(uint16_t __volatile__ *pu16); 264 # pragma aux __atomic_increment_u16 = "lock inc word ptr [edx]" parm [edx] 265 #else 211 266 static __inline__ void __atomic_increment_u16(uint16_t __volatile__ *pu16) 212 267 { 268 # ifdef _MSC_VER 269 _InterlockedIncrement16((signed short volatile *)pu16); 270 # else 213 271 __asm__ __volatile__("lock; incw %0" 214 272 : "=m" (*pu16) 215 273 : "m" (*pu16)); 216 } 274 # endif 275 } 276 #endif 217 277 218 278 /** … … 221 281 * @param pu Pointer to the value to decrement. 222 282 */ 283 #ifdef __WATCOMC__ 284 void __atomic_decrement(__volatile__ unsigned *pu); 285 # pragma aux __atomic_decrement = "lock dec dword ptr [edx]" parm [edx] 286 #else 223 287 static __inline__ void __atomic_decrement(__volatile__ unsigned *pu) 224 288 { 289 # ifdef _MSC_VER 290 _InterlockedDecrement((signed int volatile *)pu); 291 # else 225 292 __asm__ __volatile__("lock; decl %0" 226 293 : "=m" (*pu) 227 294 : "m" (*pu)); 228 } 295 # endif 296 } 297 #endif 229 298 230 299 /** … … 234 303 * @param pu32 Pointer to the value to decrement. 235 304 */ 305 #ifdef __WATCOMC__ 306 uint32_t __atomic_decrement_u32(__volatile__ uint32_t *pu32); 307 # pragma aux __atomic_decrement_u32 = \ 308 "mov eax, -1" \ 309 "lock xadd [edx], eax" \ 310 "dec eax" \ 311 parm [edx] modify [eax] value [eax] 312 #else 236 313 static __inline__ uint32_t __atomic_decrement_u32(__volatile__ uint32_t *pu32) 237 314 { 238 315 uint32_t u32; 316 # ifdef _MSC_VER 317 u32 = _InterlockedDecrement((signed int volatile *)pu32); 318 # else 239 319 __asm__ __volatile__("lock; xadd %0, %1\n\t" 240 320 "decl %0\n\t" … … 243 323 : "0" (-1) 244 324 : "memory"); 325 # endif 245 326 return u32; 246 327 } 328 #endif 247 329 248 330 /** … … 252 334 * @param pi32 Pointer to the value to decrement. 253 335 */ 336 #ifdef __WATCOMC__ 337 int32_t __atomic_decrement_s32(__volatile__ int32_t *pi32); 338 # pragma aux __atomic_decrement_s32 = \ 339 "mov eax, -1" \ 340 "lock xadd [edx], eax" \ 341 "dec eax" \ 342 parm [edx] modify [eax] value [eax] 343 #else 254 344 static __inline__ int32_t __atomic_decrement_s32(__volatile__ int32_t *pi32) 255 345 { 256 346 int32_t i32; 347 # ifdef _MSC_VER 348 i32 = _InterlockedDecrement((signed int volatile *)pi32); 349 # else 257 350 __asm__ __volatile__("lock; xadd %0, %1\n\t" 258 351 "decl %0\n\t" … … 261 354 : "0" (-1) 262 355 : "memory"); 356 # endif 263 357 return i32; 264 358 } 359 #endif 265 360 266 361 /** … … 270 365 * @param pu16 Pointer to the value to decrement. 271 366 */ 367 #ifdef __WATCOMC__ 368 void __atomic_decrement_u16(uint16_t __volatile__ *pu16); 369 # pragma aux __atomic_decrement_u16 = "lock dec word ptr [edx]" parm [edx] 370 #else 272 371 static __inline__ void __atomic_decrement_u16(uint16_t __volatile__ *pu16) 273 372 { 373 # ifdef _MSC_VER 374 i32 = _InterlockedDecrement16((signed short volatile *)pu16); 375 # else 274 376 __asm__ __volatile__("lock; decw %0" 275 377 : "=m" (*pu16) 276 378 : "m" (*pu16)); 277 } 379 # endif 380 } 381 #endif 278 382 279 383 /** … … 285 389 * @param uMax *pu must not be above this value. 286 390 */ 391 #if !defined(__GNUC__) 392 int __atomic_increment_max(__volatile__ unsigned *pu, const unsigned uMax); 393 #else 287 394 static __inline__ int __atomic_increment_max(__volatile__ unsigned *pu, const unsigned uMax) 288 395 { … … 310 417 return rc; 311 418 } 419 #endif 312 420 313 421 … … 320 428 * @param u16Max *pu16 must not be above this value after the incrementation. 321 429 */ 322 static inline unsigned __atomic_increment_word_max(volatile uint16_t *pu16, const uint16_t u16Max) 430 #if !defined(__GNUC__) 431 unsigned __atomic_increment_word_max(__volatile__ uint16_t *pu16, const uint16_t u16Max); 432 #else 433 static __inline__ unsigned __atomic_increment_word_max(__volatile__ uint16_t *pu16, const uint16_t u16Max) 323 434 { 324 435 unsigned rc = 0; … … 344 455 return rc; 345 456 } 457 #endif 346 458 347 459 … … 354 466 * @param uMin *pu must not be below this value. 355 467 */ 468 #if !defined(__GNUC__) 469 int __atomic_decrement_min(__volatile__ unsigned *pu, const unsigned uMin); 470 #else 356 471 static __inline__ int __atomic_decrement_min(__volatile__ unsigned *pu, const unsigned uMin) 357 472 { … … 379 494 return rc; 380 495 } 496 #endif 381 497 382 498 … … 389 505 * @param u16Min *pu16 must not be below this value after the decrementation. 390 506 */ 391 static inline unsigned __atomic_decrement_word_min(volatile uint16_t *pu16, const uint16_t u16Min) 507 #if !defined(__GNUC__) 508 unsigned __atomic_decrement_word_min(__volatile__ uint16_t *pu16, const uint16_t u16Min); 509 #else 510 static __inline__ unsigned __atomic_decrement_word_min(__volatile__ uint16_t *pu16, const uint16_t u16Min) 392 511 { 393 512 unsigned rc = 0; … … 413 532 return rc; 414 533 } 415 416 534 #endif 535 536 537 #ifndef __WATCOMC__ /** @todo port me later. */ 417 538 /** 418 539 * Atomically compare and exchange a 32-bit word. … … 712 833 #define _rotr(V,S) _lrotr (V, S) 713 834 #define _rotl(V,S) _lrotl (V, S) 714 715 835 #endif /* #ifndef __WATCOMC__ - port me later. */ 836 837 838 #ifdef __WATCOMC__ 839 int __fls(int v); 840 # pragma aux __fls = \ 841 "bsr edx, eax" \ 842 "jnz done" \ 843 "mov eax, -1" \ 844 "done:" \ 845 "inc eax" \ 846 parm [edx] modify [eax] value [eax] 847 #else 716 848 static __inline__ int __fls (int v) 717 849 { 718 850 int r; 719 720 851 __asm__ __volatile__ ("bsrl %1, %0;" 721 852 "jnz 1f;" … … 726 857 return r + 1; 727 858 } 859 #endif 860 861 862 #ifndef __WATCOMC__ /** @todo port me later. */ 728 863 729 864 /* Quick routines similar to div() and friends, but inline */ -
trunk/libc/include/InnoTekLIBC/fork.h
r3803 r3860 525 525 * @param pfnCallback Callback function. See __LIBC_PFNFORKCALLBACK for prototype. 526 526 */ 527 #define _FORK_PARENT1(uPriority, pfnCallback) \ 528 static const __LIBC_FORKCALLBACK _FORK_DATA_USED() __fork_parent1_##pfnCallback = { pfnCallback, uPriority + (unsigned)(&__fork_parent1_##pfnCallback - &__fork_parent1_##pfnCallback) }; \ 529 __asm__ (".stabs \"___fork_parent1__\", 23, 0, 0, ___fork_parent1_" #pfnCallback); 527 #ifdef __WATCOMC__ 528 # define _FORK_PARENT1(uPriority, pfnCallback) \ 529 static const __LIBC_FORKCALLBACK _FORK_DATA_USED() __fork_parent1_##pfnCallback = { pfnCallback, uPriority }; \ 530 const __LIBC_FORKCALLBACK * __based(__segname("forkpar1")) __fork_parent1_ptr_##pfnCallback = &__fork_parent1_##pfnCallback 531 532 #elif defined(_MSC_VER) 533 # define _FORK_PARENT1(uPriority, pfnCallback) \ 534 __Pragma(section("forkpar1", read, write)); \ 535 static const __LIBC_FORKCALLBACK _FORK_DATA_USED() __fork_parent1_##pfnCallback = { pfnCallback, uPriority }; \ 536 const __LIBC_FORKCALLBACK * __declspec(allocate("forkpar1")) __fork_parent1_ptr_##pfnCallback = &__fork_parent1_##pfnCallback 537 538 #else 539 # define _FORK_PARENT1(uPriority, pfnCallback) \ 540 static const __LIBC_FORKCALLBACK _FORK_DATA_USED() __fork_parent1_##pfnCallback = \ 541 { pfnCallback, uPriority + (unsigned)(&__fork_parent1_##pfnCallback - &__fork_parent1_##pfnCallback) }; \ 542 __asm__ (".stabs \"___fork_parent1__\", 23, 0, 0, ___fork_parent1_" #pfnCallback) 543 #endif 530 544 531 545 /** @def _FORK_CHILD1 … … 538 552 * @param pfnCallback Callback function. See __LIBC_PFNFORKCALLBACK for prototype. 539 553 */ 540 #define _FORK_CHILD1(uPriority, pfnCallback) \ 554 #ifdef __WATCOMC__ 555 # define _FORK_CHILD1(uPriority, pfnCallback) \ 556 static const __LIBC_FORKCALLBACK _FORK_DATA_USED() __fork_child1_##pfnCallback = { pfnCallback, uPriority }; \ 557 const __LIBC_FORKCALLBACK * __based(__segname("forkcld1")) __fork_child1_ptr_##pfnCallback = &__fork_child1_##pfnCallback 558 559 #elif defined(_MSC_VER) 560 # define _FORK_CHILD1(uPriority, pfnCallback) \ 561 __Pragma(section("forkpar1", read, write)); \ 562 static const __LIBC_FORKCALLBACK _FORK_DATA_USED() __fork_child1_##pfnCallback = { pfnCallback, uPriority }; \ 563 const __LIBC_FORKCALLBACK * __declspec(allocate("forkcld1")) __fork_child1_ptr_##pfnCallback = &__fork_child1_##pfnCallback 564 565 #else 566 # define _FORK_CHILD1(uPriority, pfnCallback) \ 541 567 static const __LIBC_FORKCALLBACK _FORK_DATA_USED() __fork_child1_##pfnCallback = { pfnCallback, uPriority + (unsigned)(&__fork_child1_##pfnCallback - &__fork_child1_##pfnCallback) }; \ 542 __asm__ (".stabs \"___fork_child1__\", 23, 0, 0, ___fork_child1_" #pfnCallback ); 568 __asm__ (".stabs \"___fork_child1__\", 23, 0, 0, ___fork_child1_" #pfnCallback ) 569 #endif 543 570 544 571 -
trunk/libc/include/os2emx.h
r3843 r3860 159 159 160 160 /* ------------------------ DISABLE KEYWORDS ------------------------------ */ 161 #if !defined (_System) && !defined (__IBMC__) && !defined (__IBMCPP__) 162 #define APIENTRY 163 #define EXPENTRY 161 #if defined (__WATCOMC__) 162 # define APIENTRY __syscall 163 # define EXPENTRY __syscall 164 #elif defined (_System) || defined (__IBMC__) || defined (__IBMCPP__) 165 # define APIENTRY _System 166 # define EXPENTRY _System 164 167 #else 165 # define APIENTRY _System166 # define EXPENTRY _System168 # define APIENTRY 169 # define EXPENTRY 167 170 #endif 168 171 #define FAR … … 170 173 /* ------------------------ CONSTANTS AND TYPES --------------------------- */ 171 174 172 #if defined (__IBMC__) || defined (__IBMCPP__) 173 # ifndef __const__174 # define __const__ const175 # endif176 # ifndef __attribute__177 # define __attribute__(a)178 # endif179 # ifndef __volatile__180 # define __volatile__ volatile181 # endif182 # if !defined (INCL_LONGLONG_STRUCTS)183 # define INCL_LONGLONG_STRUCTS184 # endif175 #if defined (__IBMC__) || defined (__IBMCPP__) || defined (__WATCOMC__) 176 # ifndef __const__ 177 # define __const__ const 178 # endif 179 # ifndef __attribute__ 180 # define __attribute__(a) 181 # endif 182 # ifndef __volatile__ 183 # define __volatile__ volatile 184 # endif 185 # if !defined (INCL_LONGLONG_STRUCTS) && !defined (__WATCOMC__) 186 # define INCL_LONGLONG_STRUCTS 187 # endif 185 188 #endif 186 189 … … 13353 13356 #ifndef FS_DISABLED 13354 13357 # ifdef __GNUC__ 13355 # define FS_VAR() volatile unsigned __fs__ ;13358 # define FS_VAR() volatile unsigned __fs__ 13356 13359 # define FS_VAR_SAVE_LOAD() FS_VAR(); FS_SAVE_LOAD() 13357 13360 # define FS_SAVE() __asm__ __volatile__ ("movl %%fs, %%eax; movl %%eax,%0;" : : "m" (__fs__) : "%eax" ) … … 13364 13367 unsigned short FS_INTERNAL_RESTORE(unsigned); 13365 13368 # pragma aux FS_INTERNAL_RESTORE = "mov fs, ax" parm [ax] 13366 # define FS_VAR() volatile short __fs__ ;13367 # define FS_VAR_SAVE_LOAD() volatile short __fs__ = FS_INTERNAL_SAVE() ;13369 # define FS_VAR() volatile short __fs__ 13370 # define FS_VAR_SAVE_LOAD() volatile short __fs__ = FS_INTERNAL_SAVE() 13368 13371 # define FS_SAVE() do { __fs__ = FS_INTERNAL_SAVE(); } while (0) 13369 13372 extern void DosTIB(void); 13370 # define FS_SAVE_LOAD() do { __fs__ = FS_INTERNAL_SAVE(); FS_INTERNAL_RESTORE((uintptr_t)&DosTIB) } while (0)13373 # define FS_SAVE_LOAD() do { __fs__ = FS_INTERNAL_SAVE(); FS_INTERNAL_RESTORE((uintptr_t)&DosTIB); } while (0) 13371 13374 # define FS_RESTORE() FS_INTERNAL_RESTORE(__fs__) 13372 13375 -
trunk/libc/src/kNIX/filehandles.c
r3631 r3860 1449 1449 #define __LIBC_LOG_GROUP __LIBC_LOG_GRP_FORK 1450 1450 1451 _FORK_PARENT1(0xfffff000, fhForkParent1) 1451 _FORK_PARENT1(0xfffff000, fhForkParent1); 1452 1452 1453 1453 /** … … 1584 1584 1585 1585 1586 _FORK_CHILD1(0xffffff00, fhForkChild1) 1586 _FORK_CHILD1(0xffffff00, fhForkChild1); 1587 1587 1588 1588 /** -
trunk/libc/src/kNIX/os2/DosEx.c
r3804 r3860 682 682 #undef __LIBC_LOG_GROUP 683 683 #define __LIBC_LOG_GROUP __LIBC_LOG_GRP_FORK 684 _FORK_PARENT1(0xffffffff, dosexForkParent) 684 _FORK_PARENT1(0xffffffff, dosexForkParent); 685 685 686 686 /** … … 1299 1299 1300 1300 1301 _FORK_CHILD1(0xffffffff, dosexForkChild) 1301 _FORK_CHILD1(0xffffffff, dosexForkChild); 1302 1302 1303 1303 /** -
trunk/libc/src/kNIX/os2/__initdll.c
r2929 r3860 246 246 #define __LIBC_LOG_GROUP __LIBC_LOG_GRP_FORK 247 247 248 _FORK_PARENT1(0xffffffff, initdllForkParent1) 248 _FORK_PARENT1(0xffffffff, initdllForkParent1); 249 249 250 250 /** … … 280 280 281 281 282 _FORK_CHILD1(0xffffffff, initdllForkChild1) 282 _FORK_CHILD1(0xffffffff, initdllForkChild1); 283 283 284 284 /** -
trunk/libc/src/kNIX/os2/b_initterm-os2.c
r3770 r3860 171 171 #define __LIBC_LOG_GROUP __LIBC_LOG_GRP_FORK 172 172 173 _FORK_PARENT1(0xffffffff, initdllForkParent1) 173 _FORK_PARENT1(0xffffffff, initdllForkParent1); 174 174 175 175 /** … … 205 205 206 206 207 _FORK_CHILD1(0xffffffff, initdllForkChild1) 207 _FORK_CHILD1(0xffffffff, initdllForkChild1); 208 208 209 209 /** -
trunk/libc/src/kNIX/os2/b_processWait.c
r3804 r3860 1024 1024 1025 1025 1026 _FORK_CHILD1(0xf0010000, processWaitForkChildHook) 1026 _FORK_CHILD1(0xf0010000, processWaitForkChildHook); 1027 1027 1028 1028 /** -
trunk/libc/src/kNIX/os2/logstrict.c
r3371 r3860 2405 2405 } 2406 2406 2407 _FORK_PARENT1(0xfffffff0, __libc_logForkParent) 2408 2407 _FORK_PARENT1(0xfffffff0, __libc_logForkParent); 2408 -
trunk/libc/src/kNIX/os2/sharedpm.c
r3852 r3860 2047 2047 2048 2048 2049 _FORK_CHILD1(0xfffffff0, spmForkChild1) 2049 _FORK_CHILD1(0xfffffff0, spmForkChild1); 2050 2050 2051 /** 2051 2052 * Fork child callback. -
trunk/libc/src/kNIX/os2/signals.c
r3796 r3860 3042 3042 3043 3043 3044 _FORK_CHILD1(0x0000000f, signalForkChild) 3044 _FORK_CHILD1(0x0000000f, signalForkChild); 3045 3045 3046 3046 /** -
trunk/libc/src/kNIX/os2/sysv_shm.c
r2929 r3860 765 765 766 766 767 _FORK_CHILD1(0xf0010000, shmfork_myhook) 767 _FORK_CHILD1(0xf0010000, shmfork_myhook); 768 768 769 769 /** -
trunk/libc/src/libc/locale/os2/iconv.c
r3760 r3860 293 293 #undef __LIBC_LOG_GROUP 294 294 #define __LIBC_LOG_GROUP __LIBC_LOG_GRP_FORK 295 _FORK_CHILD1(0xffff0000, iconvForkChild1) 295 _FORK_CHILD1(0xffff0000, iconvForkChild1); 296 296 297 297 /** -
trunk/libc/src/libc/locale/os2/setlocale.c
r3788 r3860 1914 1914 1915 1915 1916 _FORK_CHILD1(0xffffff00, setlocalForkChild1) 1916 _FORK_CHILD1(0xffffff00, setlocalForkChild1); 1917 1917 1918 1918 /** -
trunk/libc/src/libc/malloc/initr.c
r2254 r3860 106 106 #define __LIBC_LOG_GROUP __LIBC_LOG_GRP_FORK 107 107 108 _FORK_PARENT1(0xffffff01, umForkParent1) 108 _FORK_PARENT1(0xffffff01, umForkParent1); 109 109 110 110 /** -
trunk/libc/src/libc/process/thread_internals.c
r2799 r3860 591 591 592 592 593 _FORK_PARENT1(0xffffff02, threadForkParent1) 594 593 _FORK_PARENT1(0xffffff02, threadForkParent1); 594
Note:
See TracChangeset
for help on using the changeset viewer.