int CursorLeft(struct Tracker_Windows *window,struct WBlocks *wblock){ if(window->curr_track>0 || (0==window->curr_track && window->curr_track_sub>=0)){ window->curr_track_sub--; if(window->curr_track_sub==-2){ do{ ATOMIC_INC(window->curr_track, -1); R_ASSERT_RETURN_IF_FALSE2(window->curr_track >= 0, 0); ATOMIC_WRITE(wblock->wtrack, ListFindElement1(&wblock->wtracks->l,window->curr_track)); }while(wblock->wtrack==NULL); int num_subtracks = GetNumSubtracks(wblock->wtrack); window->curr_track_sub=num_subtracks-1; } if( window->curr_track<wblock->left_track || (window->curr_track==wblock->left_track && window->curr_track_sub<wblock->left_subtrack) ){ wblock->left_subtrack=-1;//window->curr_track_sub; wblock->left_track=window->curr_track; printf(" left_track: %d, left_subtrack: %d. curr_track: %d\n",wblock->left_track, wblock->left_subtrack,window->curr_track); //UpdateAllWTracksCoordinates(window,wblock); UpdateWBlockCoordinates(window,wblock); return 2; }else{ printf(" left_track: %d, left_subtrack: %d, curr_track: %d\n",wblock->left_track, wblock->left_subtrack,window->curr_track); return 1; } }else{ if (window->curr_track==TEMPOTRACK) return 0; ATOMIC_INC(window->curr_track, -1); if (window->curr_track==TEMPONODETRACK && window->show_reltempo_track==false) ATOMIC_INC(window->curr_track, -1); if (window->curr_track==LINENUMBTRACK) ATOMIC_INC(window->curr_track, -1); if (window->curr_track==SIGNATURETRACK && window->show_signature_track==false) ATOMIC_INC(window->curr_track, -1); if (window->curr_track==LPBTRACK && window->show_lpb_track==false) ATOMIC_INC(window->curr_track, -1); if (window->curr_track==TEMPOTRACK && window->show_bpm_track==false) set_curr_track_to_leftmost_legal_track(window); return 1; } }
static void set_curr_track_to_leftmost_legal_track(struct Tracker_Windows *window){ if (false) printf("what?\n"); else if (window->show_bpm_track==true) ATOMIC_WRITE(window->curr_track, TEMPOTRACK); else if (window->show_lpb_track==true) ATOMIC_WRITE(window->curr_track, LPBTRACK); else if (window->show_signature_track==true) ATOMIC_WRITE(window->curr_track, SIGNATURETRACK); else if (window->show_reltempo_track==true) ATOMIC_WRITE(window->curr_track, TEMPONODETRACK); else { ATOMIC_WRITE(window->curr_track, window->wblock->left_track); window->curr_track_sub = -1; } }
// see cnk/bgp_futex.c and cnk/syscalls/bgp_atomic_workarounds.c void Lock_AtomicRelease(int isShared, uint64_t my_turn) { Lock_Atomic64_t *olock; if (isShared) { olock = &(NodeState.FutexOrderLockShared); } else { AppProcess_t *proc = GetMyProcess(); olock = &(proc->FutexOrderLockPrivate); } ATOMIC_WRITE( olock, my_turn + 1 ); }
void dag_end_task(CSOUND *csound, taskID i) { watchList *to_notify, *next; int canQueue; int j, k; watchList * volatile *task_watch = csound->dag_task_watch; ATOMIC_WRITE(csound->dag_task_status[i], DONE); /* as DONE is zero */ { /* ATOMIC_SWAP */ do { to_notify = ATOMIC_READ(task_watch[i]); } while (!ATOMIC_CAS(&task_watch[i],to_notify,&DoNotRead)); } //to_notify = ATOMIC_SWAP(task_watch[i], &DoNotRead); //printf("Ending task %d\n", i); next = to_notify; while (to_notify) { /* walk the list of watchers */ next = to_notify->next; j = to_notify->id; //printf("%d notifying task %d it finished\n", i, j); canQueue = 1; for (k=0; k<j; k++) { /* seek next watch */ if (csound->dag_task_dep[j][k]==0) continue; //printf("investigating task %d (%d)\n", k, csound->dag_task_status[k]); if (ATOMIC_READ(csound->dag_task_status[k]) != DONE) { //printf("found task %d to watch %d status %d\n", // k, j, csound->dag_task_status[k]); if (moveWatch(csound, &task_watch[k], to_notify)) { //printf("task %d now watches %d\n", j, k); canQueue = 0; break; } else { /* assert csound->dag_task_status[j] == DONE and we are in race */ //printf("Racing status %d %d %d %d\n", // csound->dag_task_status[j], i, j, k); } } //else { printf("not %d\n", k); } } if (canQueue) { /* could use monitor here */ csound->dag_task_status[j] = AVAILABLE; } to_notify = next; } //dag_print_state(csound); return; }
/* Executed with allocation lock. */ static char refill_cache(refill_data * client_data) { register lf_state * state = client_data -> state; register size_t file_pos = client_data -> file_pos; FILE *f = state -> lf_file; size_t line_start = LINE_START(file_pos); size_t line_no = DIV_LINE_SZ(MOD_CACHE_SZ(file_pos)); cache_line * new_cache = client_data -> new_cache; if (line_start != state -> lf_current && fseek(f, line_start, SEEK_SET) != 0) { ABORT("fseek failed"); } if (fread(new_cache -> data, sizeof(char), LINE_SZ, f) <= file_pos - line_start) { ABORT("fread failed"); } new_cache -> tag = DIV_LINE_SZ(file_pos); /* Store barrier goes here. */ ATOMIC_WRITE(state -> lf_cache[line_no], new_cache); state -> lf_current = line_start + LINE_SZ; return(new_cache->data[MOD_LINE_SZ(file_pos)]); }
int CursorRight(struct Tracker_Windows *window,struct WBlocks *wblock){ struct WTracks *wtrack=wblock->wtrack; struct WTracks *leftwtrack; struct WTracks *rightwtrack; int update=0; int x2; if(window->curr_track>=0){ window->curr_track_sub++; int num_subtracks = GetNumSubtracks(wtrack); if(window->curr_track_sub>=num_subtracks){ window->curr_track++; if(NextWTrack(wtrack)==NULL){ window->curr_track--; window->curr_track_sub--; return 0; }else{ window->curr_track_sub= -1; ATOMIC_WRITE(wblock->wtrack, NextWTrack(wtrack)); } } while( window->curr_track>wblock->right_track || ( window->curr_track==wblock->right_track && window->curr_track_sub>wblock->right_subtrack ) ){ leftwtrack=ListFindElement1(&wblock->wtracks->l,wblock->left_track); int num_subtracks = GetNumSubtracks(leftwtrack); wblock->left_subtrack++; if(wblock->left_subtrack>=num_subtracks){ if (wblock->left_track < wblock->block->num_tracks-1) { wblock->left_subtrack= -1; wblock->left_track++; //return 0; } else { UpdateAllWTracksCoordinates(window,wblock); wblock->left_subtrack--; return 1; } } leftwtrack=ListFindElement1(&wblock->wtracks->l,wblock->left_track); if( wblock->left_track==wblock->block->num_tracks-1 && wblock->left_subtrack==num_subtracks-1 ){ UpdateAllWTracksCoordinates(window,wblock); return 2; } UpdateAllWTracksCoordinates(window,wblock); update=1; } for(;;){ rightwtrack=ListFindElement1(&wblock->wtracks->l,window->curr_track); int num_subtracks = GetNumSubtracks(rightwtrack); x2=GetXSubTrack2(rightwtrack,window->curr_track_sub); if(x2>wblock->a.x2){ leftwtrack=ListFindElement1(&wblock->wtracks->l,wblock->left_track); wblock->left_subtrack++; if(wblock->left_subtrack>=num_subtracks){ if (wblock->left_track < wblock->block->num_tracks-1) { wblock->left_subtrack= -1; wblock->left_track++; } else { wblock->left_subtrack--; UpdateAllWTracksCoordinates(window,wblock); return 1; } } leftwtrack=ListFindElement1(&wblock->wtracks->l,wblock->left_track); UpdateAllWTracksCoordinates(window,wblock); update=1; }else{ break; } } }else{ ATOMIC_INC(window->curr_track, 1); if (window->curr_track==LPBTRACK && window->show_lpb_track==false) ATOMIC_INC(window->curr_track, 1); if (window->curr_track==SIGNATURETRACK && window->show_signature_track==false) ATOMIC_INC(window->curr_track, 1); if (window->curr_track==LINENUMBTRACK) ATOMIC_INC(window->curr_track, 1); if (window->curr_track==TEMPONODETRACK && window->show_reltempo_track==false) ATOMIC_INC(window->curr_track, 1); if (0==window->curr_track) window->curr_track_sub= -1; } if(update==1){ return 2; }else{ return 1; } }