1515struct DriverInternalData {
1616 Mutex mutex { 0 };
1717 int use_count = 0 ;
18+ bool destroying = false ;
1819
1920 DriverInternalData () {
2021 mutex_construct (&mutex);
@@ -92,10 +93,13 @@ error_t driver_construct(Driver* driver) {
9293}
9394
9495error_t driver_destruct (Driver* driver) {
95- // Check if in use
96- if (driver_internal_data (driver)->use_count != 0 ) {
96+ driver_lock (driver);
97+ if (driver_internal_data (driver)->use_count != 0 || driver_internal_data (driver)->destroying ) {
98+ driver_unlock (driver);
9799 return ERROR_INVALID_STATE;
98100 }
101+ driver_internal_data (driver)->destroying = true ;
102+ driver_unlock (driver);
99103
100104 if (driver_remove (driver) != ERROR_NONE) {
101105 LOG_W (TAG, " Failed to remove driver from ledger: %s" , driver->name );
@@ -137,7 +141,7 @@ error_t driver_bind(Driver* driver, Device* device) {
137141 driver_lock (driver);
138142
139143 error_t error = ERROR_NONE;
140- if (!device_is_added (device)) {
144+ if (driver_internal_data (driver)-> destroying || !device_is_added (device)) {
141145 error = ERROR_INVALID_STATE;
142146 goto error;
143147 }
@@ -164,15 +168,15 @@ error_t driver_bind(Driver* driver, Device* device) {
164168error_t driver_unbind (Driver* driver, Device* device) {
165169 driver_lock (driver);
166170
167- error_t err = ERROR_NONE;
168- if (!device_is_added (device)) {
169- err = ERROR_INVALID_STATE;
171+ error_t error = ERROR_NONE;
172+ if (driver_internal_data (driver)-> destroying || !device_is_added (device)) {
173+ error = ERROR_INVALID_STATE;
170174 goto error;
171175 }
172176
173177 if (driver->stopDevice != nullptr ) {
174- err = driver->stopDevice (device);
175- if (err != ERROR_NONE) {
178+ error = driver->stopDevice (device);
179+ if (error != ERROR_NONE) {
176180 goto error;
177181 }
178182 }
@@ -187,7 +191,7 @@ error_t driver_unbind(Driver* driver, Device* device) {
187191error:
188192
189193 driver_unlock (driver);
190- return err ;
194+ return error ;
191195}
192196
193197} // extern "C"
0 commit comments