trunk/src/osd/sdl/sdlwork.c
| r32225 | r32226 | |
| 45 | 45 | //============================================================ |
| 46 | 46 | |
| 47 | 47 | #define ENV_PROCESSORS "OSDPROCESSORS" |
| 48 | | #define ENV_CPUMASKS "OSDCPUMASKS" |
| 49 | 48 | #define ENV_WORKQUEUEMAXTHREADS "OSDWORKQUEUEMAXTHREADS" |
| 50 | 49 | |
| 51 | 50 | #define INFINITE (osd_ticks_per_second() * (osd_ticks_t) 10000) |
| r32225 | r32226 | |
| 138 | 137 | //============================================================ |
| 139 | 138 | |
| 140 | 139 | static int effective_num_processors(void); |
| 141 | | static UINT32 effective_cpu_mask(int index); |
| 142 | 140 | static void * worker_thread_entry(void *param); |
| 143 | 141 | static void worker_thread_process(osd_work_queue *queue, work_thread_info *thread); |
| 144 | 142 | |
| r32225 | r32226 | |
| 220 | 218 | osd_thread_adjust_priority(thread->handle, 1); |
| 221 | 219 | else |
| 222 | 220 | osd_thread_adjust_priority(thread->handle, 0); |
| 223 | | |
| 224 | | // Bind main thread to cpu 0 |
| 225 | | osd_thread_cpu_affinity(NULL, effective_cpu_mask(0)); |
| 226 | | |
| 227 | | if (flags & WORK_QUEUE_FLAG_IO) |
| 228 | | osd_thread_cpu_affinity(thread->handle, effective_cpu_mask(1)); |
| 229 | | else |
| 230 | | osd_thread_cpu_affinity(thread->handle, effective_cpu_mask(2+threadnum) ); |
| 231 | 221 | } |
| 232 | 222 | |
| 233 | 223 | // start a timer going for "waittime" on the main thread |
| r32225 | r32226 | |
| 593 | 583 | } |
| 594 | 584 | } |
| 595 | 585 | |
| 596 | | //============================================================ |
| 597 | | // effective_cpu_mask |
| 598 | | //============================================================ |
| 599 | 586 | |
| 600 | | static UINT32 effective_cpu_mask(int index) |
| 601 | | { |
| 602 | | char *s; |
| 603 | | char buf[5]; |
| 604 | | UINT32 mask = 0xFFFF; |
| 605 | | |
| 606 | | s = osd_getenv(ENV_CPUMASKS); |
| 607 | | if (s != NULL && strcmp(s,"none")) |
| 608 | | { |
| 609 | | if (!strcmp(s,"auto")) |
| 610 | | { |
| 611 | | if (index<2) |
| 612 | | mask = 0x01; /* main thread and io threads on cpu #0 */ |
| 613 | | else |
| 614 | | mask = (1 << (((index - 1) % (osd_get_num_processors() - 1)) + 1)); |
| 615 | | } |
| 616 | | else |
| 617 | | { |
| 618 | | if (strlen(s) % 4 != 0 || strlen(s) < (index+1)*4) |
| 619 | | { |
| 620 | | fprintf(stderr,"Invalid cpu mask @index %d: %s\n", index, s); |
| 621 | | } |
| 622 | | else |
| 623 | | { |
| 624 | | memcpy(buf,s+4*index,4); |
| 625 | | buf[4] = 0; |
| 626 | | if (sscanf(buf, "%04x", &mask) != 1) |
| 627 | | fprintf(stderr,"Invalid cpu mask element %d: %s\n", index, buf); |
| 628 | | } |
| 629 | | } |
| 630 | | } |
| 631 | | return mask; |
| 632 | | } |
| 633 | | |
| 634 | 587 | //============================================================ |
| 635 | 588 | // worker_thread_entry |
| 636 | 589 | //============================================================ |