SUBROUTINE win_setup(buffer, do_win_create, request)
TYPE(dbcsr_buffer), INTENT(INOUT) :: buffer
LOGICAL, DIMENSION(:), INTENT(INOUT) :: do_win_create
INTEGER, INTENT(INOUT) :: request
CHARACTER(len=*), PARAMETER :: routineN = 'win_setup'
INTEGER :: handle, handle1, myproc
CALL timeset(routineN, handle)
IF (buffer%has_rma_win) THEN
CALL timeset(routineN//"_win_check", handle1)
CALL mp_wait(request)
CALL timestop(handle1)
IF (do_win_create(1)) THEN
CALL mp_win_unlock_all(buffer%data_win)
CALL mp_win_free(buffer%data_win)
END IF
IF (do_win_create(2)) THEN
CALL mp_win_unlock_all(buffer%meta_win)
CALL mp_win_free(buffer%meta_win)
END IF
END IF
CALL dbcsr_data_release(buffer%data_before_resize)
IF (ASSOCIATED(buffer%meta_before_resize)) THEN
CALL memory_deallocate(buffer%meta_before_resize, memtype_mpi_buffer)
NULLIFY (buffer%meta_before_resize)
END IF
!
CALL mp_environ(taskid=myproc, groupid=buffer%subgrp)
buffer%myproc = myproc
IF (do_win_create(1)) THEN
CALL dbcsr_win_create_any(buffer%data, buffer%subgrp, buffer%data_win)
CALL mp_win_lock_all(buffer%data_win)
END IF
IF (do_win_create(2)) THEN
CALL mp_win_create(buffer%meta, buffer%subgrp, buffer%meta_win)
CALL mp_win_lock_all(buffer%meta_win)
END IF
!
buffer%has_rma_win = .TRUE.
CALL timestop(handle)
END SUBROUTINE win_setup