It still sometimes is. There was a big crash in Czech republic recently, where two passenger trains (motor units) collided head on between stations.
Some local routes with few trains a day, where there is no longer any track-side staff, operate in a simplified rules (there is a whole code for that). There, the train will arrive to a station and depending on a symbol in the timetable, it will either continue to the next station without any signals or permissions needed or will wait for crossing train in oposite direction (the train driver must also unlock the station office and call the dispatcher on phone in some cases). Switches are either operated by train crew or they are self-returning (one direction always go to track 1 in station, the other direction goes to track 2, and the switches can be travelled through in the oposite direction without setting them first (this is an accident on standard switches) and they return back.
So, the problem was that the crossing was there on some days and wasn't on some other days, driver forgot or misread the day and the train left into oncoming train...
Was a big discussion after that to do anything, even an uncertified mobile app to shout "train coming" at the driver... Otherwise Czech rep. has a very modern European rail infra, just some local branch routes run like this saving them from being cancelled completely, but the rules were simified maybe too much.
There is also the token-based control of bidirectional travel on single-track, in which physical posession of a token governs permission to enter a track block. Still used in various places.
Some local routes with few trains a day, where there is no longer any track-side staff, operate in a simplified rules (there is a whole code for that). There, the train will arrive to a station and depending on a symbol in the timetable, it will either continue to the next station without any signals or permissions needed or will wait for crossing train in oposite direction (the train driver must also unlock the station office and call the dispatcher on phone in some cases). Switches are either operated by train crew or they are self-returning (one direction always go to track 1 in station, the other direction goes to track 2, and the switches can be travelled through in the oposite direction without setting them first (this is an accident on standard switches) and they return back.
So, the problem was that the crossing was there on some days and wasn't on some other days, driver forgot or misread the day and the train left into oncoming train...
Was a big discussion after that to do anything, even an uncertified mobile app to shout "train coming" at the driver... Otherwise Czech rep. has a very modern European rail infra, just some local branch routes run like this saving them from being cancelled completely, but the rules were simified maybe too much.