In the following code, consider a variant of channels where…
In the following code, consider a variant of channels where the channels contain malloced memory that is freed by the receiver or when the channel is closed. It is the responsibility of the receiver to free the memory. However, if a send cannot proceed because the channel was closed, the channel code is responsible for freeing the memory (e.g., free in malloced_channel_close and before returning CLOSED_ERROR in malloced_channel_send). Additionally, note that a do-while loop is similar to a while loop, but the code in the loop will execute one time before checking the condition. 1. enum channel_status malloced_channel_send(channel_t* channel, char* msg) 2. { 3. char* msg_copy = strdup(msg); //duplicates string, needs to be freed (calls malloc internally) 4. if (msg_copy == NULL) { 5. return GENERIC_ERROR; 6. } 7. pthread_mutex_lock(&channel->mutex); 8. do { 9. if (channel->isClosed) {10. pthread_mutex_unlock(&channel->mutex);11. free(msg_copy);12. return CLOSED_ERROR;13. }14. if (buffer_capacity(channel->buffer) == buffer_current_size(channel->buffer) {15. pthread_cond_wait(&channel->send_wait, &channel->mutex);16. }17. } while (buffer_capacity(channel->buffer) == buffer_current_size(channel->buffer));18.19. buffer_add(channel->buffer, msg_copy);20. pthread_cond_signal(&channel->recv_wait);21. pthread_mutex_unlock(&channel->mutex);22.23. return SUCCESS;24. } 25. enum channel_status malloced_channel_close(channel_t* channel)26. {27. pthread_mutex_lock(&channel->mutex);28.29. if (channel->isClosed) {30. pthread_mutex_unlock(&channel->mutex);31. return CLOSED_ERROR;32. }33. channel->isClosed = true;34. 35. // remove messages from buffer and free associated memory36. while (buffer_current_size(channel->buffer) > 0) {37. void* msg;38. buffer_remove(channel->buffer, &msg);39. free(msg); 40. }41. 42. pthread_cond_broadcast(&channel->send_wait);43. pthread_cond_broadcast(&channel->recv_wait);44. pthread_mutex_unlock(&channel->mutex);45. 46. return SUCCESS;47. } Describe the bug in the code and give an example of how it shows up. In your example, make sure to include any conditions needed for the bug to show up (e.g., a specific number of messages in the channel). Assume all other channel functions and the usage of these functions are correct.