SCP: Fix Async I/O primitives operations for hosts without Intrinsic CAS
This commit is contained in:
parent
629f0f0c07
commit
9851a36dd8
2 changed files with 13 additions and 27 deletions
6
scp.c
6
scp.c
|
@ -337,6 +337,7 @@ int sim_aio_update_queue (void)
|
||||||
{
|
{
|
||||||
int migrated = 0;
|
int migrated = 0;
|
||||||
|
|
||||||
|
AIO_ILOCK;
|
||||||
if (AIO_QUEUE_VAL != QUEUE_LIST_END) { /* List !Empty */
|
if (AIO_QUEUE_VAL != QUEUE_LIST_END) { /* List !Empty */
|
||||||
UNIT *q, *uptr;
|
UNIT *q, *uptr;
|
||||||
int32 a_event_time;
|
int32 a_event_time;
|
||||||
|
@ -356,18 +357,22 @@ if (AIO_QUEUE_VAL != QUEUE_LIST_END) { /* List !Empty */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
a_event_time = uptr->a_event_time;
|
a_event_time = uptr->a_event_time;
|
||||||
|
AIO_IUNLOCK;
|
||||||
uptr->a_activate_call (uptr, a_event_time);
|
uptr->a_activate_call (uptr, a_event_time);
|
||||||
if (uptr->a_check_completion) {
|
if (uptr->a_check_completion) {
|
||||||
sim_debug (SIM_DBG_AIO_QUEUE, sim_dflt_dev, "Calling Completion Check for asynch event on %s\n", sim_uname(uptr));
|
sim_debug (SIM_DBG_AIO_QUEUE, sim_dflt_dev, "Calling Completion Check for asynch event on %s\n", sim_uname(uptr));
|
||||||
uptr->a_check_completion (uptr);
|
uptr->a_check_completion (uptr);
|
||||||
}
|
}
|
||||||
|
AIO_ILOCK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
AIO_IUNLOCK;
|
||||||
return migrated;
|
return migrated;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sim_aio_activate (ACTIVATE_API caller, UNIT *uptr, int32 event_time)
|
void sim_aio_activate (ACTIVATE_API caller, UNIT *uptr, int32 event_time)
|
||||||
{
|
{
|
||||||
|
AIO_ILOCK;
|
||||||
sim_debug (SIM_DBG_AIO_QUEUE, sim_dflt_dev, "Queueing Asynch event for %s after %d instructions\n", sim_uname(uptr), event_time);
|
sim_debug (SIM_DBG_AIO_QUEUE, sim_dflt_dev, "Queueing Asynch event for %s after %d instructions\n", sim_uname(uptr), event_time);
|
||||||
if (uptr->a_next) {
|
if (uptr->a_next) {
|
||||||
uptr->a_activate_call = sim_activate_abs;
|
uptr->a_activate_call = sim_activate_abs;
|
||||||
|
@ -381,6 +386,7 @@ else {
|
||||||
uptr->a_next = q; /* Mark as on list */
|
uptr->a_next = q; /* Mark as on list */
|
||||||
} while (q != AIO_QUEUE_SET(uptr, q));
|
} while (q != AIO_QUEUE_SET(uptr, q));
|
||||||
}
|
}
|
||||||
|
AIO_IUNLOCK;
|
||||||
sim_asynch_check = 0; /* try to force check */
|
sim_asynch_check = 0; /* try to force check */
|
||||||
if (sim_idle_wait) {
|
if (sim_idle_wait) {
|
||||||
sim_debug (TIMER_DBG_IDLE, &sim_timer_dev, "waking due to event on %s after %d instructions\n", sim_uname(uptr), event_time);
|
sim_debug (TIMER_DBG_IDLE, &sim_timer_dev, "waking due to event on %s after %d instructions\n", sim_uname(uptr), event_time);
|
||||||
|
|
34
sim_defs.h
34
sim_defs.h
|
@ -1064,6 +1064,8 @@ extern int32 sim_asynch_inst_latency;
|
||||||
#else
|
#else
|
||||||
#error "Implementation of function InterlockedCompareExchangePointer() is needed to build with USE_AIO_INTRINSICS"
|
#error "Implementation of function InterlockedCompareExchangePointer() is needed to build with USE_AIO_INTRINSICS"
|
||||||
#endif
|
#endif
|
||||||
|
#define AIO_ILOCK AIO_LOCK
|
||||||
|
#define AIO_IUNLOCK AIO_UNLOCK
|
||||||
#define AIO_QUEUE_VAL (UNIT *)(InterlockedCompareExchangePointer((void * volatile *)&sim_asynch_queue, (void *)sim_asynch_queue, NULL))
|
#define AIO_QUEUE_VAL (UNIT *)(InterlockedCompareExchangePointer((void * volatile *)&sim_asynch_queue, (void *)sim_asynch_queue, NULL))
|
||||||
#define AIO_QUEUE_SET(val, queue) (UNIT *)(InterlockedCompareExchangePointer((void * volatile *)&sim_asynch_queue, (void *)val, queue))
|
#define AIO_QUEUE_SET(val, queue) (UNIT *)(InterlockedCompareExchangePointer((void * volatile *)&sim_asynch_queue, (void *)val, queue))
|
||||||
#define AIO_UPDATE_QUEUE sim_aio_update_queue ()
|
#define AIO_UPDATE_QUEUE sim_aio_update_queue ()
|
||||||
|
@ -1103,33 +1105,11 @@ extern int32 sim_asynch_inst_latency;
|
||||||
pthread_mutex_destroy(&sim_tmxr_poll_lock); \
|
pthread_mutex_destroy(&sim_tmxr_poll_lock); \
|
||||||
pthread_cond_destroy(&sim_tmxr_poll_cond); \
|
pthread_cond_destroy(&sim_tmxr_poll_cond); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define AIO_UPDATE_QUEUE \
|
#define AIO_ILOCK AIO_LOCK
|
||||||
do { \
|
#define AIO_IUNLOCK AIO_UNLOCK
|
||||||
UNIT *uptr; \
|
#define AIO_QUEUE_VAL sim_asynch_queue
|
||||||
AIO_LOCK; \
|
#define AIO_QUEUE_SET(val, queue) (sim_asynch_queue = val)
|
||||||
while (sim_asynch_queue != QUEUE_LIST_END) { /* List !Empty */ \
|
#define AIO_UPDATE_QUEUE sim_aio_update_queue ()
|
||||||
int32 a_event_time; \
|
|
||||||
uptr = sim_asynch_queue; \
|
|
||||||
sim_debug (SIM_DBG_AIO_QUEUE, sim_dflt_dev, "Migrating Asynch event for %s after %d instructions\n", sim_uname(uptr), uptr->a_event_time);\
|
|
||||||
sim_asynch_queue = uptr->a_next; \
|
|
||||||
uptr->a_next = NULL; /* hygiene */ \
|
|
||||||
if (uptr->a_activate_call != &sim_activate_notbefore) { \
|
|
||||||
a_event_time = uptr->a_event_time-((sim_asynch_inst_latency+1)/2); \
|
|
||||||
if (a_event_time < 0) \
|
|
||||||
a_event_time = 0; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
a_event_time = uptr->a_event_time; \
|
|
||||||
AIO_UNLOCK; \
|
|
||||||
uptr->a_activate_call (uptr, a_event_time); \
|
|
||||||
if (uptr->a_check_completion) { \
|
|
||||||
sim_debug (SIM_DBG_AIO_QUEUE, sim_dflt_dev, "Calling Completion Check for asynch event on %s\n", sim_uname(uptr));\
|
|
||||||
uptr->a_check_completion (uptr); \
|
|
||||||
} \
|
|
||||||
AIO_LOCK; \
|
|
||||||
} \
|
|
||||||
AIO_UNLOCK; \
|
|
||||||
} while (0)
|
|
||||||
#define AIO_ACTIVATE(caller, uptr, event_time) \
|
#define AIO_ACTIVATE(caller, uptr, event_time) \
|
||||||
if (!pthread_equal ( pthread_self(), sim_asynch_main_threadid )) { \
|
if (!pthread_equal ( pthread_self(), sim_asynch_main_threadid )) { \
|
||||||
sim_debug (SIM_DBG_AIO_QUEUE, sim_dflt_dev, "Queueing Asynch event for %s after %d instructions\n", sim_uname(uptr), event_time);\
|
sim_debug (SIM_DBG_AIO_QUEUE, sim_dflt_dev, "Queueing Asynch event for %s after %d instructions\n", sim_uname(uptr), event_time);\
|
||||||
|
|
Loading…
Add table
Reference in a new issue