Changeset 3901
- Timestamp:
- 02/05/10 09:18:58 (6 months ago)
- Files:
-
- jack2/trunk/jackmp/common/JackEngine.cpp (modified) (16 diffs)
- jack2/trunk/jackmp/common/JackEngine.h (modified) (3 diffs)
- jack2/trunk/jackmp/common/JackEngineControl.cpp (modified) (1 diff)
- jack2/trunk/jackmp/common/JackEngineControl.h (modified) (1 diff)
- jack2/trunk/jackmp/common/JackLockedEngine.h (modified) (27 diffs)
- jack2/trunk/jackmp/common/JackMutex.h (modified) (1 diff)
- jack2/trunk/jackmp/posix/JackPosixMutex.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
jack2/trunk/jackmp/common/JackEngine.cpp
r3853 r3901 35 35 namespace Jack 36 36 { 37 38 #define AssertRefnum(ref) assert(ref >= 0 && ref < CLIENT_NUM);39 37 40 38 JackEngine::JackEngine(JackGraphManager* manager, … … 214 212 215 213 // The client may be notified by the RT thread while closing 216 if (!client) { 217 jack_log("JackEngine::NotifyClient: client not available anymore"); 218 } else if (client->GetClientControl()->fCallback[event]) { 219 if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, message, value1, value2) < 0) 220 jack_error("NotifyClient fails name = %s event = %ld val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); 221 } else { 222 jack_log("JackEngine::NotifyClient: no callback for event = %ld", event); 223 } 224 } 225 226 void JackEngine::NotifyClients(int event, int sync, const char* message, int value1, int value2) 214 if (client) { 215 216 if (client && client->GetClientControl()->fCallback[event]) { 217 /* 218 Important for internal clients : unlock before calling the notification callbacks. 219 */ 220 bool res = fMutex.Unlock(); 221 if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, message, value1, value2) < 0) 222 jack_error("NotifyClient fails name = %s event = %ld val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); 223 if (res) 224 fMutex.Lock(); 225 226 } else { 227 jack_log("JackEngine::NotifyClient: no callback for event = %ld", event); 228 } 229 } 230 } 231 232 void JackEngine::NotifyClients(int event, int sync, const char* message, int value1, int value2) 227 233 { 228 234 for (int i = 0; i < CLIENT_NUM; i++) { 229 JackClientInterface* client = fClientTable[i]; 230 if (client) { 231 if (client->GetClientControl()->fCallback[event]) { 232 if (client->ClientNotify(i, client->GetClientControl()->fName, event, sync, message, value1, value2) < 0) 233 jack_error("NotifyClient fails name = %s event = %ld val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); 234 } else { 235 jack_log("JackEngine::NotifyClients: no callback for event = %ld", event); 236 } 237 } 235 NotifyClient(i, event, sync, message, value1, value2); 238 236 } 239 237 } … … 275 273 { 276 274 // Use the audio thread => request thread communication channel 277 fEngineControl->ResetFrameTime(callback_usecs); 278 fEngineControl->NotifyXRun(delayed_usecs); 275 fEngineControl->NotifyXRun(callback_usecs, delayed_usecs); 279 276 fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0); 280 277 } … … 349 346 int JackEngine::GetInternalClientName(int refnum, char* name_res) 350 347 { 351 AssertRefnum(refnum);352 348 JackClientInterface* client = fClientTable[refnum]; 353 if (client) { 354 strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE); 355 return 0; 356 } else { 357 return -1; 358 } 349 strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE); 350 return 0; 359 351 } 360 352 … … 379 371 int JackEngine::InternalClientUnload(int refnum, int* status) 380 372 { 381 AssertRefnum(refnum);382 373 JackClientInterface* client = fClientTable[refnum]; 383 374 if (client) { … … 593 584 int JackEngine::ClientExternalClose(int refnum) 594 585 { 595 AssertRefnum(refnum);596 586 JackClientInterface* client = fClientTable[refnum]; 597 598 if (client) { 599 fEngineControl->fTransport.ResetTimebase(refnum); 600 int res = ClientCloseAux(refnum, client, true); 601 client->Close(); 602 delete client; 603 return res; 604 } else { 605 return -1; 606 } 587 fEngineControl->fTransport.ResetTimebase(refnum); 588 int res = ClientCloseAux(refnum, client, true); 589 client->Close(); 590 delete client; 591 return res; 607 592 } 608 593 … … 610 595 int JackEngine::ClientInternalClose(int refnum, bool wait) 611 596 { 612 AssertRefnum(refnum);613 597 JackClientInterface* client = fClientTable[refnum]; 614 return (client) ? ClientCloseAux(refnum, client, wait) : -1;598 return ClientCloseAux(refnum, client, wait); 615 599 } 616 600 … … 657 641 int JackEngine::ClientActivate(int refnum, bool is_real_time) 658 642 { 659 AssertRefnum(refnum);660 643 JackClientInterface* client = fClientTable[refnum]; 661 assert(fClientTable[refnum]);662 663 644 jack_log("JackEngine::ClientActivate ref = %ld name = %s", refnum, client->GetClientControl()->fName); 645 664 646 if (is_real_time) 665 647 fGraphManager->Activate(refnum); … … 678 660 int JackEngine::ClientDeactivate(int refnum) 679 661 { 680 AssertRefnum(refnum);681 662 JackClientInterface* client = fClientTable[refnum]; 682 if (client == NULL)683 return -1;684 685 663 jack_log("JackEngine::ClientDeactivate ref = %ld name = %s", refnum, client->GetClientControl()->fName); 686 664 … … 718 696 { 719 697 jack_log("JackEngine::PortRegister ref = %ld name = %s type = %s flags = %d buffer_size = %d", refnum, name, type, flags, buffer_size); 720 AssertRefnum(refnum); 721 assert(fClientTable[refnum]); 722 698 723 699 // Check if port name already exists 724 700 if (fGraphManager->GetPort(name) != NO_PORT) { … … 739 715 { 740 716 jack_log("JackEngine::PortUnRegister ref = %ld port_index = %ld", refnum, port_index); 741 AssertRefnum(refnum); 742 assert(fClientTable[refnum]); 743 717 744 718 // Disconnect port ==> notification is sent 745 719 PortDisconnect(refnum, port_index, ALL_PORTS); … … 756 730 { 757 731 jack_log("JackEngine::PortConnect src = %s dst = %s", src, dst); 758 AssertRefnum(refnum);759 732 jack_port_id_t port_src, port_dst; 760 733 … … 767 740 { 768 741 jack_log("JackEngine::PortConnect src = %d dst = %d", src, dst); 769 AssertRefnum(refnum);770 742 JackClientInterface* client; 771 743 int ref; … … 803 775 { 804 776 jack_log("JackEngine::PortDisconnect src = %s dst = %s", src, dst); 805 AssertRefnum(refnum);806 777 jack_port_id_t port_src, port_dst; 807 778 … … 814 785 { 815 786 jack_log("JackEngine::PortDisconnect src = %d dst = %d", src, dst); 816 AssertRefnum(refnum); 817 787 818 788 if (dst == ALL_PORTS) { 819 789 … … 851 821 int JackEngine::PortRename(int refnum, jack_port_id_t port, const char* name) 852 822 { 853 AssertRefnum(refnum);854 823 char old_name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; 855 824 strcpy(old_name, fGraphManager->GetPort(port)->GetName()); jack2/trunk/jackmp/common/JackEngine.h
r3853 r3901 24 24 #include "JackGraphManager.h" 25 25 #include "JackSynchro.h" 26 #include "JackMutex.h" 26 27 #include "JackTransportEngine.h" 27 28 #include "JackPlatformPlug.h" … … 38 39 */ 39 40 40 class SERVER_EXPORT JackEngine 41 class SERVER_EXPORT JackEngine : public JackLockAble 41 42 { 43 friend class JackLockedEngine; 44 42 45 private: 43 46 … … 72 75 void NotifyPortRename(jack_port_id_t src, const char* old_name); 73 76 void NotifyActivate(int refnum); 77 78 bool CheckClient(int refnum) 79 { 80 return (refnum >= 0 && refnum < CLIENT_NUM && fClientTable[refnum] != NULL); 81 } 74 82 75 83 public: jack2/trunk/jackmp/common/JackEngineControl.cpp
r3526 r3901 82 82 } 83 83 84 void JackEngineControl::NotifyXRun( float delayed_usecs)84 void JackEngineControl::NotifyXRun(jack_time_t callback_usecs, float delayed_usecs) 85 85 { 86 ResetFrameTime(callback_usecs); 86 87 fXrunDelayedUsecs = delayed_usecs; 87 88 if (delayed_usecs > fMaxDelayedUsecs) jack2/trunk/jackmp/common/JackEngineControl.h
r3782 r3901 163 163 164 164 // XRun 165 void NotifyXRun( float delayed_usecs);165 void NotifyXRun(jack_time_t callback_usecs, float delayed_usecs); 166 166 void ResetXRun() 167 167 { jack2/trunk/jackmp/common/JackLockedEngine.h
r3853 r3901 38 38 // Assuming thread cancellation, must rethrow 39 39 throw; 40 41 40 } 42 41 */ … … 63 62 } \ 64 63 64 65 65 /*! 66 66 \brief Locked Engine, access to methods is serialized using a mutex. 67 67 */ 68 68 69 class SERVER_EXPORT JackLockedEngine : public JackLockAble69 class SERVER_EXPORT JackLockedEngine 70 70 { 71 71 private: … … 100 100 { 101 101 TRY_CALL 102 JackLock lock( this);102 JackLock lock(&fEngine); 103 103 return fEngine.ClientCheck(name, name_res, protocol, options, status); 104 104 CATCH_EXCEPTION_RETURN … … 107 107 { 108 108 TRY_CALL 109 JackLock lock( this);109 JackLock lock(&fEngine); 110 110 return fEngine.ClientExternalOpen(name, pid, ref, shared_engine, shared_client, shared_graph_manager); 111 111 CATCH_EXCEPTION_RETURN … … 114 114 { 115 115 TRY_CALL 116 JackLock lock( this);116 JackLock lock(&fEngine); 117 117 return fEngine.ClientInternalOpen(name, ref, shared_engine, shared_manager, client, wait); 118 118 CATCH_EXCEPTION_RETURN … … 122 122 { 123 123 TRY_CALL 124 JackLock lock( this);125 return fEngine.ClientExternalClose(refnum);124 JackLock lock(&fEngine); 125 return (fEngine.CheckClient(refnum)) ? fEngine.ClientExternalClose(refnum) : - 1; 126 126 CATCH_EXCEPTION_RETURN 127 127 } … … 129 129 { 130 130 TRY_CALL 131 JackLock lock( this);132 return fEngine.ClientInternalClose(refnum, wait);131 JackLock lock(&fEngine); 132 return (fEngine.CheckClient(refnum)) ? fEngine.ClientInternalClose(refnum, wait) : -1; 133 133 CATCH_EXCEPTION_RETURN 134 134 } … … 137 137 { 138 138 TRY_CALL 139 JackLock lock( this);140 return fEngine.ClientActivate(refnum, is_real_time);139 JackLock lock(&fEngine); 140 return (fEngine.CheckClient(refnum)) ? fEngine.ClientActivate(refnum, is_real_time) : -1; 141 141 CATCH_EXCEPTION_RETURN 142 142 } … … 144 144 { 145 145 TRY_CALL 146 JackLock lock( this);147 return fEngine.ClientDeactivate(refnum);146 JackLock lock(&fEngine); 147 return (fEngine.CheckClient(refnum)) ? fEngine.ClientDeactivate(refnum) : -1; 148 148 CATCH_EXCEPTION_RETURN 149 149 } … … 153 153 { 154 154 TRY_CALL 155 JackLock lock( this);155 JackLock lock(&fEngine); 156 156 return fEngine.GetInternalClientName(int_ref, name_res); 157 157 CATCH_EXCEPTION_RETURN … … 160 160 { 161 161 TRY_CALL 162 JackLock lock( this);162 JackLock lock(&fEngine); 163 163 return fEngine.InternalClientHandle(client_name, status, int_ref); 164 164 CATCH_EXCEPTION_RETURN … … 167 167 { 168 168 TRY_CALL 169 JackLock lock(this); 169 JackLock lock(&fEngine); 170 // Client is tested in fEngine.InternalClientUnload 170 171 return fEngine.InternalClientUnload(refnum, status); 171 172 CATCH_EXCEPTION_RETURN … … 176 177 { 177 178 TRY_CALL 178 JackLock lock( this);179 return fEngine.PortRegister(refnum, name, type, flags, buffer_size, port);179 JackLock lock(&fEngine); 180 return (fEngine.CheckClient(refnum)) ? fEngine.PortRegister(refnum, name, type, flags, buffer_size, port) : -1; 180 181 CATCH_EXCEPTION_RETURN 181 182 } … … 183 184 { 184 185 TRY_CALL 185 JackLock lock( this);186 return fEngine.PortUnRegister(refnum, port);186 JackLock lock(&fEngine); 187 return (fEngine.CheckClient(refnum)) ? fEngine.PortUnRegister(refnum, port) : -1; 187 188 CATCH_EXCEPTION_RETURN 188 189 } … … 191 192 { 192 193 TRY_CALL 193 JackLock lock( this);194 return fEngine.PortConnect(refnum, src, dst);194 JackLock lock(&fEngine); 195 return (fEngine.CheckClient(refnum)) ? fEngine.PortConnect(refnum, src, dst) : -1; 195 196 CATCH_EXCEPTION_RETURN 196 197 } … … 198 199 { 199 200 TRY_CALL 200 JackLock lock( this);201 return fEngine.PortDisconnect(refnum, src, dst);201 JackLock lock(&fEngine); 202 return (fEngine.CheckClient(refnum)) ? fEngine.PortDisconnect(refnum, src, dst) : -1; 202 203 CATCH_EXCEPTION_RETURN 203 204 } … … 206 207 { 207 208 TRY_CALL 208 JackLock lock( this);209 return fEngine.PortConnect(refnum, src, dst);209 JackLock lock(&fEngine); 210 return (fEngine.CheckClient(refnum)) ? fEngine.PortConnect(refnum, src, dst) : -1; 210 211 CATCH_EXCEPTION_RETURN 211 212 } … … 213 214 { 214 215 TRY_CALL 215 JackLock lock( this);216 return fEngine.PortDisconnect(refnum, src, dst);216 JackLock lock(&fEngine); 217 return (fEngine.CheckClient(refnum)) ? fEngine.PortDisconnect(refnum, src, dst) : -1; 217 218 CATCH_EXCEPTION_RETURN 218 219 } … … 221 222 { 222 223 TRY_CALL 223 JackLock lock( this);224 return fEngine.PortRename(refnum, port, name);224 JackLock lock(&fEngine); 225 return (fEngine.CheckClient(refnum)) ? fEngine.PortRename(refnum, port, name) : -1; 225 226 CATCH_EXCEPTION_RETURN 226 227 } … … 242 243 void NotifyXRun(int refnum) 243 244 { 244 TRY_CALL 245 JackLock lock(this); 245 // RT : no lock 246 246 fEngine.NotifyXRun(refnum); 247 CATCH_EXCEPTION248 }247 } 248 249 249 void NotifyGraphReorder() 250 250 { 251 251 TRY_CALL 252 JackLock lock( this);252 JackLock lock(&fEngine); 253 253 fEngine.NotifyGraphReorder(); 254 254 CATCH_EXCEPTION … … 257 257 { 258 258 TRY_CALL 259 JackLock lock( this);259 JackLock lock(&fEngine); 260 260 fEngine.NotifyBufferSize(buffer_size); 261 261 CATCH_EXCEPTION … … 264 264 { 265 265 TRY_CALL 266 JackLock lock( this);266 JackLock lock(&fEngine); 267 267 fEngine.NotifySampleRate(sample_rate); 268 268 CATCH_EXCEPTION … … 271 271 { 272 272 TRY_CALL 273 JackLock lock( this);273 JackLock lock(&fEngine); 274 274 fEngine.NotifyFreewheel(onoff); 275 275 CATCH_EXCEPTION … … 279 279 { 280 280 TRY_CALL 281 JackLock lock( this);281 JackLock lock(&fEngine); 282 282 fEngine.NotifyFailure(code, reason); 283 283 CATCH_EXCEPTION … … 287 287 { 288 288 TRY_CALL 289 JackLock lock( this);289 JackLock lock(&fEngine); 290 290 return fEngine.GetClientPID(name); 291 291 CATCH_EXCEPTION_RETURN … … 295 295 { 296 296 TRY_CALL 297 JackLock lock( this);297 JackLock lock(&fEngine); 298 298 return fEngine.GetClientRefNum(name); 299 299 CATCH_EXCEPTION_RETURN … … 303 303 { 304 304 TRY_CALL 305 JackLock lock( this);305 JackLock lock(&fEngine); 306 306 return fEngine.NotifyQuit(); 307 307 CATCH_EXCEPTION jack2/trunk/jackmp/common/JackMutex.h
r2907 r3901 37 37 { 38 38 39 pr ivate:40 39 protected: 40 41 41 JackMutex fMutex; 42 43 protected:44 42 45 43 JackLockAble() jack2/trunk/jackmp/posix/JackPosixMutex.h
r3665 r3901 104 104 } 105 105 106 voidLock()106 bool Lock() 107 107 { 108 108 int res = pthread_mutex_lock(&fMutex); 109 109 if (res != 0) 110 110 jack_error("JackPosixMutex::Lock res = %d", res); 111 return (res == 0); 111 112 } 112 113 … … 116 117 } 117 118 118 voidUnlock()119 bool Unlock() 119 120 { 120 121 int res = pthread_mutex_unlock(&fMutex); 121 122 if (res != 0) 122 123 jack_error("JackPosixMutex::Unlock res = %d", res); 124 return (res == 0); 123 125 } 124 126
